変数の有効範囲と対策

ifでブロック化した場合で、他のバッチをサブルーチンのように扱った場合、変数の内容が更新されない場合があります。
[test.bat]
echo off
cls
call sub1.bat
echo 1.%SBTXT%

if %SBTXT%==AA (
    call sub2.bat
    echo 2.%SBTXT%
)
echo 3.%SBTXT%

pause

[sub1.bat]
SET SBTXT=AA

[sub2.bat]
SET SBTXT=BB

-----------------------------------------
実行結果

1.AA
2.AA
3.BB
続行するには何かキーを押してください . . .
sub2.batが呼び出されたところで、変数SBTXTの内容がBBになりそうなのですが、AAのままになっています。
ブロックを抜けたところでBBに変わっています。

この問題に対応するには、setlocal enabledelayedexpansionを使い、sub2.batの後の%BB%を!BB!に変更します。
[test.bat]
echo off
cls
setlocal enabledelayedexpansion
call sub1.bat
echo 1.%SBTXT%

if %SBTXT%==AA (
    call sub2.bat
    echo 2.!SBTXT!
)
echo 3.%SBTXT%
endlocal
pause

[sub1.bat]
SET SBTXT=AA

[sub2.bat]
SET SBTXT=BB

-----------------------------------------
実行結果

1.AA
2.BB
3.BB
続行するには何かキーを押してください . . .
ちなみに、この手法を遅延環境変数の展開というらしいです。

参考