Windowsバッチ 遅延変数
変数の即時展開
次の処理を実行すると、
set answer=varAは不明です。 set varA=aaa if %varA% == aaa ( set answer=varAはaaaです。 echo %answer% )
「varAはaaaです。」と出力されそうだが、次のようになってしまう。
varAは不明です。
理由は次の通り。
バッチファイルでは、1文ごとに変数が即時展開される。
()の括弧で囲った複数のコマンドは、1行とみなされる。
従って、上記の処理では3~6行目がまとめて1行とみなされて、
ここに制御が入った瞬間に5行目の「%answer%」が「aaa」と
即時展開されるので、上記の実行結果となる。
echo onで実行すると、その様子が確認できる。
C:\>set answer=varAは不明です。 C:\>set varA=aaa C:\>if aaa == aaa ( set answer=varAはaaaです。 echo varAは不明です。 ) varAは不明です。
変数の遅延展開
上記は、if文やfor文で起こりがちだが、変数の遅延展開を使う事でこの問題を回避できる。
このような変数を遅延変数という。
これをするには、コードを次のように修正する。
setlocal enabledelayedexpansion set answer=varAは不明です。 set varA=aaa if %varA% == aaa ( set answer=varAはaaaです。 echo !answer! )
1行目を追加。setlocal enabledelayedexpansionは、変数の遅延展開を有効化。
6行目。「%answer%」を「!answer!」に修正して、遅延変数にする。
そうすると、実行結果は次のようになる。
varAはaaaです。
echo onでの実行結果は次の通り。
C:\>setlocal enabledelayedexpansion C:\>set answer=varAは不明です。 C:\>set varA=aaa C:\>if aaa == aaa ( set answer=varAはaaaです。 echo !answer! ) varAはaaaです。