バッチファイル謹製のリマインダーをつくった

r 3 カップラーメン で 3 分後に「カップラーメン」と表示する、みたいなツールをバッチファイルのみでつくった。

github.com

どんなツール?

たとえばファイル名を指定して実行から、以下のようにして指定する。

commainder_from_run

動作中は DOS 窓が動きますので、適当に最小化でもしとく。

commainder_dos_window

時間になると、以下のように 最大化表示したメモ帳 でリマインドされます。

commainder_reminding

特徴

特徴1. バッチファイルだけで動作する

特別なツールは使っていないし、バッチファイルなので何をしているかは中身を見ればわかる。スモールでオープンなツール。

特徴2. リマインドに気付ける

最大化したメモ帳を開いてリマインドする、という大げさな方法を使っているが、これが効力が高い。最大化ウィンドウなので、何かに夢中になっていてもすぐに気付ける。

r.bat 詳細

実装したバッチファイルの中身を簡単に解説しておく。

v0.1.0 ベースで簡単に。

rem Comminder v0.1.0
rem ================

ただのバージョン情報表記です。rem コマンドはコメント構文であり、バッチファイル中にコメントを書くための命令です。

setlocal

...中略...

set n=%1
set msg=%*

set datafoldername=.comminder
set datafolderfull=%userprofile%\%datafoldername%
set dataext=.txt

データファイルの名前やパスなど、よく使う値を変数に入れています。よく使うデータを共通化するのはプログラミングの常識ですよね。

また、setlocal は、set による環境変数定義を呼び出し元に波及させないための決まり文句です。言うなれば、set はデフォルトではグローバル変数をセットしますが、setlocal を実行すると、ローカル変数をセットするようになる、というイメージです。

if not exist %datafolderfull% (
    echo 初回起動につき, データファイル保存先 "%datafolderfull%" を作成します.
    mkdir %datafolderfull%
)

データフォルダが存在しない場合、mkdir で新規作成しています。if not exist による判定も必要です。この判定がないと、データフォルダが存在する場合に mkdir で「既に作成されています」系のエラーが出てしまいます。

if "%n%"=="" (
    set n=0
)

if "%msg%"=="" (
    set msg=これは動作確認です。このように表示されます。
)

これは r.bat に渡される引数が無い場合の対処です。待機秒数の n は、数字を設定しないと待機命令である timeout コマンドがエラーを出すので、0 を設定します。リマインド内容の msg は、内容が空だと、データファイル書き込み時に使っている echo が「echo は です」というメッセージを吐いてしまうため、これを防ぐために適当なメッセージ(動作確認のスタンスを取ってみました)を入れています。

set todaydate=%date%
set todaydate_for_disp=%todaydate%
set todaydate=%todaydate:/=%
set todaydate=%todaydate:~0,8%
set todaytime=%time%
set todaytime_for_disp=%todaytime%
set todaytime=%todaytime: =0%
set todaytime=%todaytime::=%
set todaytime=%todaytime:.=%
set todaytime=%todaytime:~0,8%
set todaydatetime=%todaydate%_%todaytime%

これは現在日付時刻の文字列を作っています。データファイル保存時、同じファイル名で保存してしまわないよう、被らないファイル名を付けることが必要ですが、こういう時は日付時刻を使うのがベターです。

バッチファイルでは環境変数 %date% で現在日付を、 %time% で現在時刻を取得できます。あとは、バッチファイルの文法で、上手いこと加工します。加工方法は set /? コマンドが詳しいです。

echo 【リマインド内容】 > %datafilefull%
echo %msg% >> %datafilefull%
echo.>> %datafilefull%
echo ======== >> %datafilefull%
echo.>> %datafilefull%
echo Set from: %todaydate_for_disp% %todaytime_for_disp%.  >> %datafilefull%
echo Wait sec: %n% Secs.  >> %datafilefull%

データファイルにリマインド内容を書き込んでいます。

まずは echo > でデータファイルを新規し、その後 echo >> で追記をしていっています。追記は最終行に追加されるので、上に書きたい内容ほど先に echo >> する必要があります。

title %n%秒後にリマインド

これは、r.bat 実行時に開かれるコマンドプロンプトウィンドウのタイトルを、見やすいよう変えているだけです。「ファイル名を指定して実行」から実行した場合は、上手いこと機能してくれます。コマンドプロンプトから実行した場合は、そのコマンドプロンプトのタイトルが置き換わってしまいます。上手い回避方法は無かったので見逃して下さい。

timeout /T %n% /nobreak

リマインダーの肝となる 指定時間になるまで待つ を実現するコマンドです。 /nobreak は、迂闊にキーを押した時に終了しないようにするためのオプションです。timeout コマンドは、デフォルトでは「何かキーを押したら(待ち時間が残っていても)即座に終了する」挙動なので、 /nobreak で無効にしないとうっかり終了してしまいかねません。

start "" /max notepad "%datafilefull%"

これはデータファイルをメモ帳で開くコマンドです。その際、/max オプションにて最大化で開く、という指令も与えています。start コマンドだからこそできることです。