Windows - バッチ - 代入時の注意・ENABLEDELAYEDEXPANSION
- 1. 代入記号の前後の空白は NG
- 2. ループ時の代入
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!
)
これでやっと期待通りの結果が得られました。
|
|