非常に単純なバッチファイルの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回エスケープします)。そうしないと、「遅延拡張」機能がそれを消費します。