†DOSとバッチとスクリプト†
作成開始日 2024.02.07
最終更新日
@echo off set a=22:40後は、設定時刻を引数にして汎用性を持たせたり、wavファイル再生を複数回にしたり、時刻を数値化(時*60+分)して応用範囲を広げたり、ニーズに合わせて御自由に。←アラーム設定時刻(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
【参考】「時:分:秒」のフォーマットに留意すること。「分」「秒」が一桁の場合、頭に「0」が付いて、たとえば「03」とか「09」といった形式になるが、「時」は「0」の代わりに半角スペースが付き「 3」や「 9」と言う形式になる。時刻文字列の変数を「"」で括ると、この先行スペースが有効になってしまうため、設定時刻の形式と一致しない事がある。たとえば、「3:15」と「 3:15」はイコールではない。しかし、「"」を付けなければ、先行スペースは無視されて共に「3:15」と見なされる。なお「%変数名: =%」で時刻文字列からスペースを除去する方法もある
以下は、時刻を秒単位の数値に変換した例。基本的に誤差は1秒以内に収まるはず。また、ループが不要なのも気分的に楽。なお、バッチでは「05」や「07」は普通に十進数として扱えるが、何故か「08」「09」を計算に用いるとエラーになる。どんな仕様やねん。バグとしか思えん。なので、少々どんくさい処理が必要になる。@echo off set a=22:40なお、このバッチでは日またぎの処理は不可能だが、たとえば翌日午前1時を25時として扱えば対処可能。最大99時(3日先くらい)までは対応できるが現実的ではないな。←設定時刻(終了時刻) 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%