†DOSとバッチとスクリプト†

バッチでアラーム機能を

作成開始日 2024.02.07
最終更新日

Windows 7の時計にはアラーム機能がないので、簡易アラームをバッチで作成してみた。30秒に1回チェックするだけなので誤差は最大30秒。まあ、タスクスケジューラを使用する方法もあるけれど、あれは少し大仰で面倒臭いので。
@echo off
set a=22:40	←アラーム設定時刻(22時40分)

:LOOP
set tm=%time:~0,5%	←現在時刻を「時:分」で取得(秒は切り捨て)
echo %tm% - %a%

if %tm% == %a% (	←「"」で括ると「時」が一桁のときに対応できない
"C:\Windows\Media\Calligraphy\Windows Notify.wav"	←wavファイル名のみでよい
exit /b
)

timeout /t 30 > nul		←30秒間停止

GOTO :LOOP
後は、設定時刻を引数にして汎用性を持たせたり、wavファイル再生を複数回にしたり、時刻を数値化(時*60+分)して応用範囲を広げたり、ニーズに合わせて御自由に。

【参考】「時:分:秒」のフォーマットに留意すること。「分」「秒」が一桁の場合、頭に「0」が付いて、たとえば「03」とか「09」といった形式になるが、「時」は「0」の代わりに半角スペースが付き「 3」や「 9」と言う形式になる。時刻文字列の変数を「"」で括ると、この先行スペースが有効になってしまうため、設定時刻の形式と一致しない事がある。たとえば、「3:15」と「 3:15」はイコールではない。しかし、「"」を付けなければ、先行スペースは無視されて共に「3:15」と見なされる。なお「%変数名: =%」で時刻文字列からスペースを除去する方法もある

以下は、時刻を秒単位の数値に変換した例。基本的に誤差は1秒以内に収まるはず。また、ループが不要なのも気分的に楽。なお、バッチでは「05」や「07」は普通に十進数として扱えるが、何故か「08」「09」を計算に用いるとエラーになる。どんな仕様やねん。バグとしか思えん。なので、少々どんくさい処理が必要になる。
@echo off
set a=22:40		←設定時刻(終了時刻)
set c=%time%		←現在時刻

rem *** 終了時刻を秒に変換
call :time_num %a%
set /a ed=%errorlevel%

rem *** 現在時刻を秒に変換
call :time_num %c%
set /a st=%errorlevel%

rem *** 現在時刻から終了時刻までの時間を秒で計算
set /a t=%ed%-%st%
timeout /t %t% /nobreak

"C:\Windows\Media\Calligraphy\Windows Notify.wav"
"C:\Windows\Media\Calligraphy\Windows Notify.wav"
"C:\Windows\Media\Calligraphy\Windows Notify.wav"

EXIT /B

rem ***** 時刻を秒単位の数値に変換 *****
:time_num

set arg=%1

for /f "tokens=1-3 delims=:." %%a in ("%arg%") do (
set hh=%%a
set mm=%%b
if "%%c" == "" (set ss=00) else (set ss=%%c)	←秒省略対策
)

set h=%hh%
if "%mm:~0,1%" == "0" (set m=%mm:~1,1%) else (set m=%mm%)	←先行0対策
if "%ss:~0,1%" == "0" (set s=%ss:~1,1%) else (set s=%ss%)	←先行0対策
)

set /a x=%h%*3600+%m%*60+%s%

EXIT /B %x%
なお、このバッチでは日またぎの処理は不可能だが、たとえば翌日午前1時を25時として扱えば対処可能。最大99時(3日先くらい)までは対応できるが現実的ではないな。


【DOSとバッチとスクリプト目次】 【ホーム】