Windowsバッチでは、コードを読み込むときではなくて、実際にその処理を実行するときに値を展開する。
ifやforのブロックはまとめて読み込まれる。
そのため、以下のようなケースでは意図と異なった挙動をする。
1 2 3 4 5 6 |
set hensu_a=A if "%hensu_a%" == "A" ( set hensu_a=B echo %hensu_a% ) |
echoの結果はBでなくAになってしまう。
以下のようにすると読み込み時ではなく、実行時に変数を展開する。
(@setlocal enabledelayedexpansionの宣言が必要なことに注意)
1 2 3 4 5 6 7 8 |
@setlocal enabledelayedexpansion set hensu_a=A if "%hensu_a%" == "A" ( set hensu_a=B echo !hensu_a! ) |
echoの結果はBになる。
ちなみに以下のケースでは、読み込みブロックが異なるのでBになる。
1 2 3 4 5 6 |
set hensu_a=A if "%hensu_a%" == "A" ( set hensu_a=B ) echo %hensu_a% |
echoの結果はB