Windowsバッチ(.bat)で指定時間にダイアログを出すタイマーを作る

この記事は投稿日から、1年以上経過しています。

概要

スケジューラーもカレンダーもない(インストールさせてもらえない)PCで会議の時間を知らせてほしいと感じる瞬間はありませんか、私はありました。
正直slackのリマインダーだと情報多すぎて気づかないししょっちゅう会議の時間も変わるので、時間がテキスト入力できて、ダイアログ表示したり音を鳴らしたりしてほしいわけです。
Windows標準のアラーム&クロックを手で動かすのすら嫌な日のためのリマインダーバッチです。

更新

2023/11/23 引数をつけた実行もできるようにした。
2023/12/19 0-9分にタイマーを掛けた際にバグるのを修正
2023/12/25 複数アラートをまとめて実行を追加
2024/01/12 exitを追加してまとめて実行した際でもアラートが出ると閉じるようにした
2024/02/07 コメント入力と表示できるようにした、何分前に鳴らすか設定できるようにした
2024/02/08 09バグが治らないので一旦その部分を削除、09時と09分と09秒にバグります

コード

下記のコードをテキストファイルに貼り付けて拡張子を「.bat」にします。
文字エンコードはshift-jisを想定しています。

クリックしてアラートをかける時間を半角数字で入力します。
時間になるとアラートダイアログと、対応していればビープ音がなるはずです。
一応、秒数も考慮しており、ちょうど0秒にアラートが鳴ります。

@echo off
REM 何秒前にアラートを鳴らすか(デフォルト)0分
set /a gap=-60*0

IF "%~1"=="" (
  echo タイマーを鳴らす時分を入力
  set /p hh="何時(0-23):"
  set /p mm="何分(0-59):"
  set /p cc="アラートメモ:"
) ELSE (
  REM コマンドから実行
  set /a hh=%1
  set /a mm=%2
  set cc=%3
)

REM 時分秒までの差分を取得
SET /a nHOUR=%time:~0,2%
SET /a nMIN=%time:~3,2%
SET /a nSEC=%time:~6,2%
SET /a NOW_SEC=(%nHOUR%*60*60)+(%nMIN%*60)
SET /a TIMER_SEC=(%hh%*60*60)+(%mm%*60)-%nSEC%+%gap%

echo "%hh%時%mm%分に『%cc%』のアラートを鳴らします。"

REM 対象時刻から現在時刻までの差分をタイマーに設定
set /a "ss=(%TIMER_SEC%-%NOW_SEC%)"

REM タイマーを掛ける
timeout %ss%

REM 現在の時分秒を取得
SET HOUR2=%time:~0,2%
SET MIN2=%time:~3,2%
SET SEC2=%time:~6,2%
 
REM 終了時にビープ音を鳴らす
rundll32 user32.dll,MessageBeep
 
REM 終了時にアラートを出す
echo MsgBox "%HOUR2%時%MIN2%分%SEC2%秒になりました。『%cc%』の時間です。",vbInformation,"情報" > %TEMP%\msgbox.vbs & %TEMP%\msgbox.vbs 
del /Q %TEMP%\msgbox.vbs

REM ターミナルを閉じる
exit

動作確認

ダイアログで出てくる時刻はダイアログを表示した瞬間の時刻になっています。
ダイアログにアラートメモが出るようになりました。
スクショにはありませんが、多重起動もできます。

※中身をわかりやすくするため、バッチの中身をテキストエディタで開いています。

まとめて起動する

コマンドプロンプトやバッチからの実行もできます。
下記は10時56分にアラートを出す例です。
頭にstartとつけると別ウィンドウで開いてくれます。

start alert.bat 10 56 会議1

alert.batのあるフォルダ内で下記をバッチ(.bat)ファイルにして複数アラームをまとめて実行もできます。

start alert.bat 10 56 会議1
start alert.bat 22 0 会議2

おわり。