非常に単純なバッチファイルの2つの例があります。
変数に値を割り当てる:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
予想どおり、結果は次のとおりです。
FOO: 1
Press any key to continue . . .
ただし、IF NOT DEFINEDブロック内に同じ2行を配置すると:
@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で遅延拡張を有効にしなければならないようです。これは面倒かもしれません。
!
、を使用します^^^!
(2回エスケープします)。そうしないと、「遅延拡張」機能がそれを消費します。