5. Windows - バッチ - ループ内の変数

 
5.1 ループ内の変数の不思議
5.2 ループ内の変数の書き方

5.1 ループ内の変数の不思議

 前ページに書いたように

BBB
CCC
DDD
 という内容の AAA.txt があるとして

@ECHO OFF

FOR /F %%A IN (AAA.txt) DO (
    ECHO %%A
)
 というバッチファイルを実行すると

BBB
CCC
DDD
 という実行結果が得られるわけです。  ではこの %%A を変数に入れて出力しようと

@ECHO OFF

FOR /F %%A IN (AAA.txt) DO (
    SET B=%%A
    ECHO %B%
)

ECHO %B%
 というバッチファイルを書いて実行すると

ECHO は <OFF> です。
ECHO は <OFF> です。
ECHO は <OFF> です。
DDD
 という実行結果になるのです。

    ECHO %B%
 は

    ECHO
 と書いているのと同じ効果しか得られません。  つまり、%B% は変数展開されていないのです。

5.2 ループ内の変数の書き方

 結論から書くと

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /F %%A IN (AAA.txt) DO (
    SET B=%%A
    ECHO !B!
)

ECHO %B%
 と書くと結果は

BBB
CCC
DDD
DDD
 となります。  2行目の

SETLOCAL ENABLEDELAYEDEXPANSION
 は、ループ内の変数を有効化するためのおまじないです。  6行目の

    ECHO !B!
 は、ループ内では変数を %B% のように書くのではなく !B! のように記述するということです。