« 環境変数のPATHを行分けして表示するバッチファイル | トップページ | IFコマンドを遅延展開する。 »

2007年2月15日 (木)

FORコマンドのバグ?

FOR /F "usebackq delims=;" %%1 IN ('a a;b b;c c') DO ECHO %%1

は期待したとおり動きません。

FOR /F "usebackq delims=;" %%1 IN ('a a^;b b^;c c') DO ECHO %%1

とすれば期待通り動きます。

つまり、FOR文の()の中は、最初に、区切り文字の=;,を空白に置換するようです。エスケープされてない場合です。

なので、
FOR /F IN ('コマンド')
FOR /F "usebackq" IN ('文字列')
FOR /F "usebackq" IN (`コマンド`)
の構文で、中に=;,を含む可能性があるときは、遅延展開を使うとよいでしょう。

SETLOCAL ENABLEDELAYEDEXPANSION
SET X=a a;b b;c c
FOR /F "usebackq delims=;" %%1 IN ('!X!') DO ECHO %%1

または
SET X=a a;b b;c c
FOR /F "delims=;" %%1 IN ('ECHO %%X%%') DO ECHO %%1

コマンドの中に"がない場合、かつ、コマンドと同名のファイルがない場合は、
FOR /F IN ('"コマンド"')
FOR /F "usebackq" IN (`"コマンド"`)
でもエスケープできます。

また、
FOR /F IN ("文字列")
FOR /F IN ('"コマンド"')
FOR /F "usebackq" IN (`"コマンド"`)
の構文でも、中に"があると、""のエスケープ区間が逆転したり、^のエスケープが無効になるので、この場合も、遅延展開を使ったほうがよいでしょう。

« 環境変数のPATHを行分けして表示するバッチファイル | トップページ | IFコマンドを遅延展開する。 »