日付時刻を得る

日付や時刻の入ったファイル名・フォルダ名を作るために、日付・時刻を BAT スクリプトで得たいという話が良くある。掲示板では、

for /f "tokens=1-3 delims=/ " %%A in ('date/t') do set YMD=%%A%%B%%C

と答えたりするわけだが、これはWin2000やWinXPでも地域のコントロールパネルで日付の短い形式を変更していない場合の話だ。

日本語版Win2000の場合デフォルトで、date/t の結果は 「2004/03/14 日」、%DATE% の値は「日 20004/03/14」のようになっているが、コントロールパネルで区切り文字を / でなく - や . にも変更できる。ただし、日付の形式を「mm/dd/yy」のように変更しても形式自体(年月日の順序や桁数、曜日の有無や位置)は変わらないようだ。これだけだと、

for /f "tokens=1-3 delims=/-. " %%A in ('date/t') do set YMD=%%A%%B%%C

と、区切り文字を増やせば大丈夫のようだが、区切り文字はプルダウンで表示される / - . 以外にも指定できるので万全ではない。

また、WinXP では date/t の結果や %DATE% の値は、コントロールパネルの短い形式の日付で指定した通りになるので、年月日の順序もわからないし、年が2桁かもしれない。従って一旦環境変数にセットして、文字位置で切り出すことも出来ない。WinXPの場合は、reg コマンドがあるので、

for /f "tokens=1-3" %%I in ('reg query "HKCU\Control Panel\International" /v sShortDate') do if %%J == REG_SZ set YMDFMT=%%K

で、日付書式がわかるのでこれを元に解析すれば何とかならなくもない。

Win2000の場合は日本語版に限定すれば区切り文字が変わるだけなので、環境変数%DATE%を文字位置で切り出すことで出来るが、英語版はおそらく mm/dd/yyyy の順序なので、確実に処理しようとすると、やはりレジストリを見る必要がある。reg コマンドが無いのでレジストリを見ようとすると、VBS+WSH 等を使う必要がある。

でも、VBS を使うなら最初からそれで日付を得れば簡単だ。
結論としては、BATスクリプトだけで日付を得るのは特定環境向けなら簡単だが、汎用を求めるなら労多くして益少なしということ。
まあ、date < NUL の2行目を見れば年月日の順序はわかるのでそれで何とかなるかもしれないが、他国語版にも対応するのは大変だろう ( date < NUL の実行時だけコードページを英語にするんでしょうね)。

時刻についても同様の問題がある。コントロールパネルで時分秒の順序を変えて設定する人は居ないだろうが、12時間制と設定されているかもしれない。