置換構文+既定環境変数で、一歩上を行くBATファイルを書こう

やあ子供たち。よくBATファイルの処理を書いている中で、今日の日付や現在時刻をそのままファイル名やフォルダ名の一部として使いたいなー、なんてことがあるね。今日はまさにそのやり方を行ってみようと思うぞ。
誰でも知っているように、現在時刻は、環境変数「TIME」の中に、そして今日の日付は環境変数「DATE」の内容に、それぞれ更新され続けている。(下図)


なのでBATファイルの中で、例えばファイルを作成する際に、そのファイル名の中に今日の日付や現在時刻を埋め込みたい、といった場合などにはこいつらを参照すればよさそうだ。と思い立ったとして、以下のようなBATファイルを記述実行してみよう。これは、「tako」という文字列を、file_%date%.txt というファイルに出力させようとしているコードだよ。

@echo off
set filename=file_%date%.txt
echo tako > %filename%
pause

しかしこれを実行してみると、「指定されたパスが見つかりません」などと言われてしまう。なぜかを調べるために、出力ファイル名として指定している文字列を実際に表示させてみよう。

@echo off
set filename=file_%date%.txt
echo tako > %filename%
echo %filename%
pause

すると、こんなことになっていることがわかる。(↓図)

これを見て気づけるかどうかはこれまた一定のWindows経験を要するわけだが、理由は簡単なので経験のない人も心配しないでほしい。そう、Windowsでは、ファイル名やフォルダ名に使えない文字(「禁則文字」)があり、ここで、日付のところで使われている。「/」(スラッシュ記号)は、まさにその禁則文字のうちの一つに該当するのである。ファイル名に禁則文字が含まれるので、ファイルが正しく出力されないのも当然というわけだ。
そこで何をするかというと、文字列置換構文を使う。そうBATファイルの中で文字列置換という、一見高度な処理が簡単にできてしまうのでそれを利用するのだ。それをやっているのが以下のコードだ。

@echo off
set filename=file_%date:/=_%.txt
echo tako > %filename%
echo %filename%
pause

これを実行すると、こうなる。(↓図)

そして、本バッチファイルと同階層のフォルダ内に、めでたく、file_2015_02_18.txtが正しく作成されていることが確認できる。
ではどこが変わったのかおわかりだろうか。それは、2行目の「%date%」の展開部分が何やら、「%date:/=_%」となっているところだ。これは、環境変数「date」の内容の展開にあたっては、「/」(スラッシュ記号)を、「_」(アンダースコア記号)に置換した上で、やってねという意味なのである。
つまり、環境変数「date」をそのまま使うと、「2015/02/18」という具合に、年月日が、「/」(スラッシュ記号)で、区切られた文字列が展開されてしまうところを、文字列置換構文を使って展開することで、スラッシュ記号がアンダースコア記号に置換されて展開されるため、Windowsのファイル名・フォルダ名の禁則文字を含まないファイル名となり、めでたくそれが目論見通りに出力されるというわけだ。
なお、コードの展開部分を「%date:/=%」としてしまい、つまり「/」を、空虚文字に置換とすれば、スラッシュ記号は何かの文字に置換されるのではなく、すなわちこれを取り除いた文字列を得ることができるというわけだ。(↓図)

要は、環境変数を便利に使う上で、置換構文をちょっと使うだけで、本来の環境変数の内容情報を、柔軟に有効活用することができるというわけだね。実はこの置換構文は、数回前の日記ネタの中でもすでに登場しているので、余力のある人はチェックしてみてくれよな。
では今日はこの辺で。チャオ!