2014年7月11日金曜日

[Windowsコマンド] FOR ループで変数の値が変わらない

Windows のコマンドプロンプトもしくはコマンドスクリプトで、FOR ループの中にある環境変数が更新されない。これは遅延環境変数の展開が無効になっている場合に発生します。

遅延環境変数が無効(デフォルトの状態)

遅延環境変数が無効であれば、繰り返し毎に変数は変更されません。
FOR /L %%i IN (1,1,3) DO (
    SET value=%%i
    ECHO %TIME% %value%
    TIMEOUT /T 1
)
<実行結果>
9:31:34.61 3
9:31:34.61 3
9:31:34.61 3
時刻、カウンタともに変わらない。

遅延環境変数が有効

遅延環境変数を有効 (SETLOCAL ENABLEDELAYEDEXPANSION) にすると、繰り返し毎に変数が変更されるようになります。
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /L %%i IN (1,1,3) DO (
    SET value=%%i
    ECHO !TIME! !value!
    TIMEOUT /T 1
)
ENDLOCAL
<実行結果>
9:31:37.16 1
9:31:38.13 2
9:31:39.21 3
毎回異なっている。

FOR 以外の繰り返し

遅延環境変数が無効 (SETLOCAL DISABLEDELAYEDEXPANSION) であっても、FOR を使わない繰り返しであれば変数は毎回変更されます。
SETLOCAL DISABLEDELAYEDEXPANSION
:LOOP
    IF %value% GEQ 6 GOTO :EOF

    SET /A value=%value% + 1
    ECHO %TIME% %value%
    TIMEOUT /T 1
GOTO :LOOP
ENDLOCAL
<実行結果>
9:31:40.22 4
9:31:41.20 5
9:31:42.19 6
毎回異なっている。