Windows - バッチ - 代入時の注意・ENABLEDELAYEDEXPANSION
1. 代入記号の前後の空白は NG 代入の基本は 変数=値 変数1=%変数2% なのですが、値の代入時には「=」の前後に空白がはいっていても正常に代入されるようですが、変数の代入時には前後の空白は許されないようです。 ECHO OFF SET A=1 SET B = 1 SET C = %A% SET D=%A% ECHO A = %A% ECHO B = %B% ECHO C = %C% ECHO D = %D% というバッチファイルを実行すると A = 1 B = 1 C = D = 1 という結果になってしまうのです。 結論的には、何を代入するにせよ、「=」の前後は空白をいれずに詰めた方がよさそうです。 2. ループ時の代入 次項と話が前後してしまいますが ABCDE fghij KLMNO という内容で「TEST.txt」というファイルを作成し、 @ECHO OFF FOR /F %%B IN (TEST.txt) DO ( SET LINE=%%B ECHO %LINE% ) という内容のバッチファイルを実行すると ECHO は <OFF> です。 ECHO は <OFF> です。 ECHO は <OFF> です。 DO の () 内では、値が直ちには変更されないということで、それを可能にするには SETLOCAL ENABLEDELAYEDEXPANSION というおまじないを書きなさいとのこと。 ちなみに調べたものでは、すべて上記の文を小文字で書いてありましたが、大文字で記述してはいけないのかどうか? そこでバッチファイルを @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION FOR /F %%B IN (TEST.txt) DO ( SET LINE=%%B ECHO %LINE% ) と書き換えて実行すると KLMNO KLMNO KLMNO と出力されてしまう。先ほどよりましになったが、期待するものではありません。 こちらも調べてみると % で挟んだものは直ちに値が変更されないということらしく、! で囲めとモノの本に書いてあるので 今度は、以下のように書き換えて @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION FOR /F %%B IN (TEST.txt) DO ( SET LINE=%%B ECHO !LINE! ) これでやっと期待通りの結果が得られました。
変数=値 変数1=%変数2%
ECHO OFF SET A=1 SET B = 1 SET C = %A% SET D=%A% ECHO A = %A% ECHO B = %B% ECHO C = %C% ECHO D = %D%
A = 1 B = 1 C = D = 1
ABCDE fghij KLMNO
@ECHO OFF FOR /F %%B IN (TEST.txt) DO ( SET LINE=%%B ECHO %LINE% )
ECHO は <OFF> です。 ECHO は <OFF> です。 ECHO は <OFF> です。
SETLOCAL ENABLEDELAYEDEXPANSION
@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION FOR /F %%B IN (TEST.txt) DO ( SET LINE=%%B ECHO %LINE% )
KLMNO KLMNO KLMNO
@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION FOR /F %%B IN (TEST.txt) DO ( SET LINE=%%B ECHO !LINE! )