遅延環境変数とは

windowsのバッチを書いている時にこの遅延環境変数のせいで色々と時間を取られてしまったのでまとめます。

例えばあるバッチに以下のように書くとします。

set val = a

if "%val%" == "a" (
    set val=b
    echo %val%
)

最初にval = aでaをセットし、その後bを設定しています。

これを実行すれば

b

が表示されると思いますが、実際には

a

が出力されます。

この理由は

if "%val%" == "a" (
    set val=b
    echo %val%
)

が一気に読み込まれるからです。

一気に読み込まれるので、

if "%val%" == "a" 

が読み込まれた時に

if "%val%" == "a" (
    set val=b
    echo %val%
)

if "a" == "a" (
    set val=b
    echo a
)

になってしまいます。

対策

バッチファイルの最初の方に

setlocal enabledelayedexpansion

と書いて、

if "%val%" == "a" (
    set val=b
    echo !val!
)

と変更することで

b

が表示されるようになります。

http://wa3.i-3-i.info/word12518.html