引数に実行日時を設定しEXEを何回か連続で実行するというバッチを作ったのですが、実行日時が更新されないという現象に悩まされました。
hoge.bat@echo off
for /l %%i in (1,1,5) do (
hoge.exe %date% %time:~0,8%
)
pause
実行イメージhoge.exe 2008/11/12 23:45:01
hoge.exe 2008/11/12 23:45:01
hoge.exe 2008/11/12 23:45:01
hoge.exe 2008/11/12 23:45:01
hoge.exe 2008/11/12 23:45:01
原因は、環境変数(%date%、%time%)の展開を各コマンド実行のタイミングではなく、バッチファイル読み取り時に行っているためみたいです。
そして、この現象を環境変数の即時展開と呼ぶそうです。
解決策として下記2点の修正が必要だそうです。
まず、遅延環境変数の展開という機能を 使うために以下の宣言を行います。
setlocal enabledelayedexpansion
次に、この展開機能を用いる環境変数を「%」ではなく、「!」で囲みますので、完成形は次のようになります。
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
hoge.exe !date! !time:~0,8!
)
pause
まぁ、実行日時が更新されないぐらいなら可愛いですけど、下記のif文すらきちんと動いてくれないというのは困ったものですよね。
@echo off
set VAR=before
if "%VAR%" == "before" (
set VAR=after;
if "%VAR%" == "after" echo SUCCESS!!
)
pause
この仕様はどうにかならないのでしょうか・・・。