NIFTYの掲示板より。また for /f のバグである。Win2000/SP4、WinXP/SP1,SP2で出る。2003は未確認。
コマンドプロンプトを開いて、このスクリプトを連続実行すると、不思議な現象が起こる。
@echo off for /f "usebackq tokens=1-4" %%A in ('aa bb cc dd') do ( echo %%A,%%B,%%C,%%D )
本来は、
aa,bb,cc,dd
と表示されるはずだが、数十回実行しているうちに、
aa,bb,cc,dd ファイル & が見つかりません。
等と、「ファイル 文字化け文字列 が見つかりません」と出る。' ' 内の文字列を変えたり、rem 文を追加したりするといろいろとパターンが変わるが、どうもメモリ中のゴミをコマンドとして実行しようとしているようである。
usebackq はNT4になく2000から追加された機能だ。NT4では ('....') はコマンド実行しかなかった。2000でusebackqにより、1行文字列からの読み取りのケースが増えたが、おそらく ' ' だとループしようとして、ループの2回目でusebackqのフラグを参照せずにコマンドを実行しようとしてしまうのではないか。
回避策としては、文字列からの読み取りの時はusebackqを使わなければ良い。または、
@echo off for /f "usebackq tokens=1-4" %%A in ('aa bb cc dd') do ( echo %%A,%%B,%%C,%%D goto next ) :next
と、2回目以降のループを回らなければ良い。
2009-11-12追記:
エラーメッセージからして、「コマンドとして実行しようとしている」じゃなくて「ファイル名として、そのファイルから読もうとしている」ですね。
あと、usebackq を使わなくても起こる場合があるようです。この場合も回避策は、上に書いた通りgoto nextを入れること。