• 締切済み

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<---

みんなの回答

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.3

> Vistaや2008や7で確認したわけではありません。 質問文を見てVista環境での現象だと思ったので、 Vistaで不都合再現を試みたのですが 再現しなかったのでそのときは回答しませんでした。 私の手元の環境では、 Vistaと7では再現せず、XPでは再現しています。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

>ちなみに、(C言語でいうところのbreakに相当するような)FOR文のDO節から抜けるための構文ってないでしょうか? ありません。 >そうなるとGOTOそのものよりもラベルの名前の管理が大変になってしまいますので、 全部同じでも問題ないです。同じラベルが複数あれば、後ろで一番近いところに飛びますので(明記されてませんが)。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

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はどうでしょうね。

doLob
質問者

補足

> 本来あり得ない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にダウングレードしたクチです。)

関連するQ&A

  • バッチコマンドの for文の使い方。

    以下のバッチファイルはテキストを一行ずつ3つの変数に読み込み <subtest.bat>の処理を行うものです。 この2つのバッチファイルを一つにまとめたいのですがどうすればいいでしょうか。ただし、<subtest.bat>内は実際には10行程度の文です。 goto文を使用してみよとしたのですがうまくいきませんでした。 どなたかわかる方がいらっしゃいましたら、教えていただけないでしょうか、お願いいたします。 ------------------------------------------------ rem <test.bat> @echo off for /F "usebackq tokens=1-3" %%a in ( file.txt ) do call subtest.bat %%c,%%b,%%a PAUSE exit -------------------------------------------------- rem <subtest.bat> rem 変数の表示 rem 実際には10行程度の文です。 @echo %3, %2, %1 -------------------------------------------------- <file.txt>の内容(タブ区切り) shin0.bmp1000 200 shin1.bmp 700 200 shin2.bmp 800 200 shin3.bmp 860 200 shin4.bmp 400 200 --------------------------------------------------

  • forコマンドで属性が隠しファイルを表示するためには?

    forコマンドで属性が隠しファイルを表示するためには? 下記のような、batファイルでファイルをリストアップすると、 属性が隠しファイル、もしくはシステムファイル等がListUp表示されません。 如何なるファイルでもListUp表示できるようにする方法を教えてください。 xyz.bat @echo off for %%i in (*.*) do echo %%i >> test.txt @echo on @echo 完了 pause

  • forコマンドのdelimsオプションで「","」を指定したい

    以下のような データにコンマが含まれる(単価の項目)CSVファイルから 特定の列を抽出したCSVファイルを作ります。 "顧客ID","住所(送先)","商品ID","商品名","単価","数量","出荷日", "001","○○市○○町○○","202","□□","1,500","10","2009/7/7" "顧客ID","住所(送先)","商品ID","商品名","単価","数量","出荷日", "002","○○市○○町△△","503","◎◎","1,980","5","2009/7/6" 現在は以下のようなバッチファイルで対応しています。 @echo off :顧客ごとのヘッダ情報の行を削除 type syukjnminohyo.csv | find /v "顧客" > temp1.txt :ファイルデータを環境変数に代入し :subでデータの区切りである「","」をタブに変換 for /f "tokens=1,* delims=" %%a in (temp1.txt) do ( set line=%%a call :sub ) :タブを区切りとして特定の列を抽出 for /f "tokens=1,2,5,6 delims= " %%a in (temp2.txt) do ( @echo "%%a","%%b","%%c","%%d" >> out.txt ) :sub set line=%line:","= % echo %line:"=% >> temp2.txt 途中でファイルも作られるなど エレガントでない部分が多いため 皆様のお力をお貸し頂きたく質問いたしました。 よろしくお願いします。

  • Windowsコマンドラインで文字列置換する方法

    Windowsでバッチファイルを作成し、テキストファイルの中の文字列を置換しようとしています。 下記のような内容のバッチファイルを作りました。 ーーーーーーーーー @echo off set fname=.¥change.txt set orgword=bbb set newword=222 copy %fname% orgfile >nul type nul >%fname% for /F %%I in (orgfile) do (set readline=%%I&& call :sub) del org file sub: call set outline=%%readline:%orgword%=%newword%%% echo %outline%>>%fname% go to :eof :end ーーーーーーーーー このバッチを利用して、 change.txt ーーーーーーーーー aaabbbccc ーーーーーーーーー を変換すると、 ーーーーーーーーー aaa222ccc ーーーーーーーーー となってくれますが、 ーーーーーーーーー <aaabbbccc/> ーーーーーーーーー を変換すると、 ーーーーーーーーー ECHO は <OFF> です。 ーーーーーーーーー となってしまいます。 これを、 ーーーーーーーーー <aaa222ccc/> ーーーーーーーーー としたい時にはどのようにしたら良いでしょうか?

  • 【DOSコマンド】for の デリミタにダブルクォーテーションを使うには

    下記のような1行だけ書かれたテキストファイルがあり、その中からダブルクォーテーションで囲まれた部分を抜き出そうとしています。 --【abc.txt】----------------------------------------------------------- Command Line: "C:\Program Files\test\test.exe" ---ここまで------------------------------------------------------------- (C:\Program Files\test\test.exe を抜き出したい) DOSコマンドのfor文を使って抜き出そうとしたのですがダブルクォーテーションをどうやってデリミタに指定したらいいのかわかりません。   for /f 'delims=" tokens=2' %i in (test.txt) do @echo %i  とか   for /f "delims="" tokens=2" %i in (test.txt) do @echo %i など いろいろやってみたのですがエラーが出ました。 試しにテキストファイルのダブルクォーテーションを”+”に置き換えて試したところうまく出来たので、デリミタの指定の仕方だけだと思うのですが、どうしてもわかりません。 Command Line: +C:\Program Files\test\test.exe+   に対して for /f "delims=+ tokens=2" %i in (test.txt) do @echo %i はうまく出来ました。 どなたかご享受願えませんでしょうか。 よろしくお願いします。

  • バッチファイルでの%を含むファイル名の取得

    以下はEドライブを走査してフォルダごとのjpgやpngなどのファイルの数を全て表示するバッチ処理ですが。基本的に上手く動きますが%を含むファイル名、フォルダ名に当たると上手く動きません。どうしたらいいでしょうか?”ファイル名、フォルダ名に%を使うな”という回答以外でお願いします。 @echo off pushd E:\ for /f "delims=" %%j in ('dir /b /s /a:d') do call :sub "%%j" exit /b :sub echo /////////////////////////////////////////////////////////////////////////// for /f "delims=" %%x in ('dir /b %1 ^| find /c ".jpg"') do call :jpg %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".JPG"') do call :jpg2 %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".png"') do call :png %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".bmp"') do call :bmp %%x echo %1 echo jpg %jpg_c% echo png %png_c% echo bmp %bmp_c% echo JPG %jpg2_c% goto :EOF :jpg set jpg_c=%1 :echo %1 goto:EOF :jpg2 set jpg2_c=%1 :echo %1 goto:EOF :png set png_c=%1 :echo %1 goto:EOF :bmp set bmp_c=%1 :echo %1 goto:EOF :all set all_c=%1 :echo %1 goto:EOF

  • For文のtokensにおけるバッチファイル作成について

    はじめまして。 バッチファイルにて以下のコマンドを作成して 実行したのですがきちんと実行されません。 コマンドプロンプトを起動して1個1個実行するときちんと 実行されます。どういうことなのでしょうか? <バッチファイル> @echo off cd /d デスクトップ for /F "tokens=2" %i in ( file.txt ) do echo %i >> result.txt pause <file.txtの中身> 1<tab>2<tab>3 4<tab>5<tab>6

  • Windows2000 バッチファイルコマンドについて

    こんにちは。 バッチファイルコマンド(DOSコマンド?)について質問があります。 まずやりたい事としては、 「前月日付のフォルダを自動作成したい」 です。 当月日付をもってくる為には以下の様なコマンドでできました。 for /f "tokens=1-2" %%l in ('date /t') do set today=%%l for /f "delims=/ tokens=1-2" %%a in ('echo %today%') do set yymm=%%a%%b このコマンドを実行すると、例えば、%yymm%には200507が入っています。 このコマンドを応用して、前月日付(200506)を取得したいのですが、何か言い方法はありませんでしょうか? また、新たなやり方あるのでしたら教えて頂けないでしょうか?

  • msdosのfor /fのtokens=の挙動

    Windows7のmsdosのfor /fのtokens=の挙動ですが、 tokens=1,3とした時は1番目と3番目のトークンが取り出され tokens=1-3とした時は1番目~3番目のトークンが取り出される のではないのでしょうか。 例えば、以下のような例の場合、 test1.batでは、 a b d f test2.batでは、 a b c d e f となるように思うのですが 実際には、どちらも、 a b d となり、1番目のトークンしか 取り出されていないのですがなぜなのでしょうか。 ---test.txt--------------------------- a b,c d,e,f ---test1.bat------------------ for /f "tokens=1,3 delims=," %%a in (test.txt) do ( echo %%a ) ---test2.bat------------------ for /f "tokens=1-3 delims=," %%a in (test.txt) do ( echo %%a ) ------------------------------

  • コマンドプロンプトのfor文での連続コマンドについて

    コマンドプロンプトのfor文での連続コマンドについて winXPを使っています。 コマンドプロンプトでバッチファイルを作り、フォルダーの中にあるPDFファイルをアドビリーダーで印刷して削除したいのですが、アドビリーダーを手動で終了させないとファイルの削除ができません。どうすればいいでしょうか。 *****printpdf.batの内容**************** for %%A in (E:\pdf\*.*) do ( "C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe" /t %%A taskkill /F /IM AcroRd32.exe Del %%A ) *************************************** 3行目のtaskkillが問題らしいのですが。。。 また、本当はコマンドを&&でつなげたいのですが、 ( )でくくらないとDELされません。 &&でつなげるにはどうしたらいいか、 その点もおわかりでしたらご教授ください。 よろしくお願いします。

専門家に質問してみよう