バッチファイル内の変数がIF内で設定されない?
非常にシンプルなバッチファイルの例を2つ挙げてみました。
変数に値を代入する。
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
これは予想通りの結果になります。
FOO: 1
Press any key to continue . . .
しかし、同じ2行をIF NOT DEFINEDブロック内に配置した場合:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
となります。
FOO:
Press any key to continue . . .
これはIFとは何の関係もないはずですが、明らかにブロックが実行されています。if の上に BAR を定義すると、期待通り PAUSE コマンドのテキストのみが表示されます。
どうしたの?
質問の続きです。setlocalを使わずに遅延拡張を有効にする方法はありますか?
この単純な例のバッチファイルを別のバッチファイルの中から呼び出すと、この例ではFOOが設定されていますが、ローカルにしか設定されていません。
testcaller.bat
@call test.bat
@echo FOO: %FOO%
@pause
test.bat
@setlocal EnableDelayedExpansion
@IF NOT DEFINED BAR (
@set FOO=1
@echo FOO: !FOO!
)
と表示されます。
FOO: 1
FOO:
Press any key to continue . . .
この場合、どうやらCALLERで遅延拡張を有効にしなければならないようで、面倒くさいかもしれません。