2008/09/13(Sat)バッチファイルで時計表示

2008/09/13 17:56 Software::Windows
あるステータスをバッチファイルで延々流し続けたいときに、パッと見て、その行のレコードが何時何分何秒のデータかを分かりやすくしたかったので、バッチファイルで時計を表示するコードを書いてみた。

とまぁこれが、結構面倒で^^;
time /Tコマンドでは、秒まで出てきません。
秒は%time%という変数を使うことまで1/100秒単位までご丁寧に出てくれるのですが、はっきり言って無駄…

で、これを使わざるをえないことに。
結構XPだったり2000だったりで出力に差があるらしいのですが、ここはXP x64 SP2ベースで書きます。
自分の場合は、24時間制で0補完済みの2桁ごとで区切られた数が得られたので、「あぁ、substringかけるだけじゃん~」と思ったら……

実は厄介でした。0の扱いが。
先頭に0がついた、06といった数字は、8進数の6を表すような解釈をするらしく、秒の部分だけを切りだして変数に入れる(set /aでは式の評価が行われる)と、システムの時計が8秒と9秒のとき、"無効な数字です"と文句を言われます。

というわけで、結構苦肉の策。
@echo off
set n=-1
:LOOP
set /a t=%time:~6,1%
if %t% == 0 (set /a s=%time:~7,1%) else (set /a s=%time:~6,2%)
if %s% == %n% goto LOOP
set /a n=%s%
echo %time:~0,8%
goto LOOP
実行結果
17:53:40
17:53:41
17:53:42
17:53:43
17:53:44
17:53:45
17:53:46
17:53:47
17:53:48
17:53:49
…
もっとスマートに書けるのかもしれんが……。あぁ、とりあえず外部アプリのsleep.exeとか、JSを開く手はナシで。
ちなみに、ping -n [止めたい秒数] localhost >NULという書き方も紹介されてましたが、なんか1秒置きにうまく動いてくれませんでした。


まったくもって、Linuxのbashは賢すぎる。
あっちなら
echo -e "`date "+%Y/%m/%d %H:%M:%S"`"
なんて手軽に書ける。曜日や"1日前"、なんてのもお茶の子さいさい。
あぁ、こんな表現使うの久々…(笑)