バッチの中でのWindows環境変数の取り扱いメモ

最近はWindowsプラットフォームを扱うことが多く、微妙にハマりそうな落とし穴もあったのでメモしておく。まずは基本から。取り出した環境変数の文字列の一部を置換する場合は、%環境変数名%の終端「%」の部分を「:X=Y%」とすることで、X⇒Yという文字列置換が行える。
例)「/」を「-」に置換する場合


C:\>echo %date%
2010/03/24

C:\>echo %date:/=-%
2010-03-24

さて、ここで注意が必要なパターン(僕はこれでハマりました)について触れておく。Windows環境変数には「%time%」というものがあり、現在時刻を表示するためバッチの中ではかなりよく使うもの。ただ、この出力結果で注意すべきはHH:MMのHH部分が午前10時前(00:00〜09:59)には「0H:MMではなく<半角スペース>H:MM」と表記される点。


C:\>echo %time%
9:39:33.89
バッチで行う処理内容にもよるが、モノによってはバッチ内で%time%の値を何らかのコマンド引数として使用している場合などは、00:00〜09:59の時間帯だけSyntaxエラーでエラーになったりというわけのわからない状態になる場合がある。この動作への対処としては、スペースで表現される箇所をゼロ埋めすることで正常に扱える。

C:\>echo %time: =0%
09:41:14.84
更に、「:を取り除きつつ0埋めしたい場合」はこのようにする

C:\>SET TEMP1=%time: =0%

C:\>echo %TEMP1%
09:42:36.25

C:\>echo %TEMP1::=%
094236.25

この他、for文と環境変数からの文字列取り出しを使って


for /f %%i in ('time /t') do set rowtime=%%i
set hhmm=%rowtime:~0,2%%rowtime:~3%
echo %hhmm%
なんていうやり方もあったりするが、これだけのためにfor文を使うのはちょっと、という場合が多いと思うので、上記のようなやり方がいいんではないだろうか。なお、環境変数からの文字列取り出し方法は以下の通り。

%[環境変数]:~[オフセット(位置)],[文字数]%
このように入力すると、オフセットで指定した位置 (オフセット数+1の位置)から指定した文字数を取り出すことができる。
例)N=123456789 に対して、4文字目から4文字を抜き出す場合

C:\>set N=123456789

C:\>echo %N%
123456789

C:\>echo %N:~3,4%
4567