3. Windows のバッチに関する話/代入時の注意

 
3.1 代入記号の前後の空白は NG
3.2 ループ時の代入

3.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
 という結果になってしまうのです。  結論的には、何を代入するにせよ、「=」の前後は空白をいれずに詰めた方がよさそうです。

3.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!
)
 これでやっと期待通りの結果が得られました。