- 締切済み
FORコマンドで不定期に表示される意味不明なメッセージを回避する方法は?
(「Windows/Windows Vistaフォーラム/Answersアシスタント」から飛ばされてきました。よろしくお願いします) 以下の様なバッチファイル(for1.bat, for2.bat)を作成して、コマンドプロンプトで何回か実行すると、正常な出力と同時に、不定期に「ファイル が見つかりません。」という意味不明なメッセージが表示されます。 これは何で、どうすれば回避できるのでしょうか? コマンドラインオプションとしてダブルクォートされた文字列を引数にとるバッチファイルを作りたいのですが、 > foo.bat " a""a " のような呼び出し方をした時に挙動がおかしくなったので、その原因を調べていたら、FOR文が時々不可解な動作をしていて、その典型的な例をfor1.batとfor2.batにまとめた次第です。 ---8<---8<---8<---[for1.bat:ここから ]---8<---8<---8<---8<--- @ECHO OFF CALL :SUB "a""a" CALL :SUB " a""a" CALL :SUB "a ""a" CALL :SUB " a ""a" CALL :SUB "a"" a" CALL :SUB "a""a " CALL :SUB "a"" a " CALL :SUB " a"" a" CALL :SUB "a ""a " CALL :SUB " a "" a " CALL :SUB " a""a " CALL :SUB "a "" a" CALL :SUB " a "" a" CALL :SUB " a ""a " CALL :SUB " a"" a " CALL :SUB "a "" a " GOTO EOF :SUB FOR /F "tokens=*" %%a IN ("%1") DO ECHO %%a EXIT /B 0 :EOF ---8<---8<---8<---[for1.bat:ここまで ]---8<---8<---8<---8<--- ---8<---8<---8<---[for2.bat:ここから ]---8<---8<---8<---8<--- @ECHO OFF FOR /F "tokens=*" %%a IN (""a""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a ""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a ""a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a"" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a"" a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a"" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a ""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a "" a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a "" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a "" a"") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a ""a "") DO ECHO %%a FOR /F "tokens=*" %%a IN ("" a"" a "") DO ECHO %%a FOR /F "tokens=*" %%a IN (""a "" a "") DO ECHO %%a ---8<---8<---8<---[for2.bat:ここまで ]---8<---8<---8<---8<---
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Gotthold
- ベストアンサー率47% (396/832)
> Vistaや2008や7で確認したわけではありません。 質問文を見てVista環境での現象だと思ったので、 Vistaで不都合再現を試みたのですが 再現しなかったのでそのときは回答しませんでした。 私の手元の環境では、 Vistaと7では再現せず、XPでは再現しています。
- notnot
- ベストアンサー率47% (4900/10358)
>ちなみに、(C言語でいうところのbreakに相当するような)FOR文のDO節から抜けるための構文ってないでしょうか? ありません。 >そうなるとGOTOそのものよりもラベルの名前の管理が大変になってしまいますので、 全部同じでも問題ないです。同じラベルが複数あれば、後ろで一番近いところに飛びますので(明記されてませんが)。
- notnot
- ベストアンサー率47% (4900/10358)
CMD.EXEのバグと思われます。類似の現象にあたったことがあります。 ご存じの通り、for /f は、(1)ファイル読み取り繰り返し、(2)コマンド実行結果読み取り、(3)文字列からの読み取り、の3通りの機能があり、(2)(3)は繰り返し無しですが、何かの要因で繰り返そうとしてしまうようです。 本来あり得ない2回目なので、2回目の実行時にメモリ上のゴミをファイル名と思ってしまうようです。 回避策は、繰り返さないようにgotoで抜けます。 :SUB FOR /F "tokens=*" %%a IN ("%1") DO ECHO %%a&GOTO NEXT :NEXT EXIT /B 0 難点は、知らない人が見ると意味不明のGOTO (笑)。コメント入れとかないといけませんね。 >(「Windows/Windows Vistaフォーラム/Answersアシスタント」から飛ばされてきました。よろしくお願いします) もしかして、Vistaとか2008で直ってるかと期待してたのですが。。。。。 7はどうでしょうね。
補足
> 本来あり得ない2回目なので、2回目の実行時にメモリ上のゴミをファイル名 > と思ってしまうようです。 それは何となく想像がつきました。 再現性に乏しい上に、「ファイル」と「が見つかりません。」の間に、これまた再現性の無い個数の制御コードが出力されるので。 > 回避策は、繰り返さないようにgotoで抜けます。 > (中略) > 難点は、知らない人が見ると意味不明のGOTO (笑)。コメント入れとかない > といけませんね。 ちなみに、(C言語でいうところのbreakに相当するような)FOR文のDO節から抜けるための構文ってないでしょうか? ラベルも少数なら必要悪と考えることができますが、再現性が乏しく発生条件も不明ということですので、IN節を変数で受ける場合全てにGOTOを付けることもやむを得ませんが、そうなるとGOTOそのものよりもラベルの名前の管理が大変になってしまいますので、ラベルが不要な方法の方が良いです。 >> (「Windows/Windows Vistaフォーラム/Answersアシスタント」から >> 飛ばされてきました。よろしくお願いします) > もしかして、Vistaとか2008で直ってるかと期待してたのですが。。。。。 > 7はどうでしょうね。 実は最初、「Windows/WindowsXPフォーラム/プログラム」で質問したのですが、「バッチファイルだから」という理由(?)でモデレーターにVistaフォーラムへ移動され、その数時間後にはやんわりと肩叩きにあっただけなので、Vistaや2008や7で確認したわけではありません。(というより、Vistaに1週間で辟易して、XPにダウングレードしたクチです。)