2008年7月24日木曜日

WindowsバッチファイルでYYYYMMDD

YYYYMMDD(hhmm)。
バッチファイル内でログファイルを出力するなら「これ+プリフィックス」をファイル名にするのが理想ではないでしょうか。
 
ちょっとバッチファイルで組み立てましょう、下記をテキストファイルに入力して拡張子をbatにします。
@echo off
set tmpDate10=%date:~-10%
set YYYYMMDD=%tmpDate10:/=%
echo %YYYYMMDD%

set tmpTime5=%time:~0,5%
set tmpTime4=%tmpTime5::=%
set HHMM=%tmpTime4: =0%
echo %HHMM%

echo %YYYYMMDD%%HHMM%
pause

 
変数"YYYYMMDD"は年月日、"HHMM"を時分として組み立てています。
実行すると下記、
20080723
2230
200807232230
続行するには何かキーを押してください . . .

この変数を使ってファイル名なり何なりを定義してしまえばいいのですが、
何でこんなにややこしくなってしまうのでしょうか。
一応続きで解説しておきます。
 

年月日


set tmpDate10=%date:~-10%
set YYYYMMDD=%tmpDate10:/=%
まずこの部分から。>echo %date%
2008/07/23
通常のdate変数の出力はこうなります。
スラッシュ(/)が邪魔なので置換します。
>echo %date:/=%
20080723

ほら完成。コロンで区切った後がキモです、こういう書き方で変数の文字列を出力の際に置換できます。
"/=" というのはスラッシュを空文字(何もなし)に置換しているので、例えば他の文字列だと…
>echo %date:/=hoge%
2008hoge07hoge23
これでスラッシュが"hoge"に置換されます。
 
"%date:~-10%" の部分はと言うと、
コロンは前述同様区切り、"~-10"は変数のうち後ろから10文字を取る指定方法です。
これはWindows2000のdate変数の出力が曜日を含んでいてXP以降と仕様が違うので、互換性を保つためWindows2000シリーズでも動くようにするためのおまじないです。。
実際、XP以降ならいきなり"%date:/=%" とするだけで十分です。
 

時分


次はset tmpTime5=%time:~0,5%
set tmpTime4=%tmpTime5::=%
set HHMM=%tmpTime4: =0%
この部分ですね。
 
time変数の出力を確認します。
>echo %time%
22:30:14.76
1/100秒まで出ます。それはさすがに要らないので、
初めから5文字を取って(~0,5)、コロンを置換(:=)します。
 
これでOKと見せかけて、"%tmpTime4: =0%"と言う処理が入っています、何でしょうか?
 
ここでdate変数を出力する時は、"時" の値が一桁(0時から9時)だと、"半角スペース+数字"の2文字になるということに注意しないといけません。
午前9時半にたたくと、"△9:30:00:00"(△=半角スペース)となります。
なのでこのままだと、"△930" という文字列が完成します、非常にうっとおしいので半角スペースを"0"に置換する処理を入れるというわけです。