setlocal EnableDelayedExpansion を宣言するタイミングで挙動が異なるバッチ

試した環境

  • Windows10

本題

前回の記事setコマンドで変数を含む文字列を入力したときに、入力した段階で展開される場合と後から展開されるような場合がありることを書きました。 その挙動の応用みたいなものですが、遅延環境変数を有効化するsetlocal EnableDelayedExpansionを宣言するタイミングで挙動が異なる場合があります。

まず最初の例です。 setコマンドの前にsetlocal EnableDelayedExpansionを宣言します。 この場合はsetコマンドで入力した文字列の変数は入力した段階で展開されます。

実行するスクリプトは以下の通りです。

@echo off

setlocal EnableDelayedExpansion

set Param=images\!frame!.png
echo %Param%

for /l %%f in (0 1 15) do (
    set frame=000000%%f
    set frame=!frame:~-6!
    echo %Param%
)

結果は以下の通りです。

$ echotest_2.bat
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png
images\.png

次の例です。 setlocal EnableDelayedExpansionを宣言する位置を変えます。 setコマンドの後にsetlocal EnableDelayedExpansionを宣言します。 この場合はsetコマンドで入力した文字列の変数は後から展開されるような挙動をします。

実行するスクリプトは以下の通りです。

@echo off

set Param=images\!frame!.png
echo %Param%

setlocal EnableDelayedExpansion

for /l %%f in (0 1 15) do (
    set frame=000000%%f
    set frame=!frame:~-6!
    echo %Param%
)

結果は以下の通りです。

$ echotest_2.bat
images\!frame!.png
images\000000.png
images\000001.png
images\000002.png
images\000003.png
images\000004.png
images\000005.png
images\000006.png
images\000007.png
images\000008.png
images\000009.png
images\000010.png
images\000011.png
images\000012.png
images\000013.png
images\000014.png
images\000015.png