チャポケのブログ

勉強したことをまとめておく。

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です。