- ベストアンサー
バッチファイルでのif文分岐
ドラッグ・アンド・ドロップ(以下、D&D)によるバッチファイルを作成する際にダブルクリックでバッチファイルを開こうとする行為のフェールセーフを考えています。 現状では、以下のバッチファイルにファイルやフォルダをD&Dするとif文の分岐の箇所で終了してしまいます。 有識の方の教授をお願いします。 /* ↓↓ 以下コードです ↓↓*/ @echo off if "%1"=="" goto error rem D&Dされたパスを表示 echo %1 echo 終了しました。 goto end :error echo このファイルはダブルクリック形式ではありません。 echo ファイルやフォルダをD^&Dして下さい。 pause exit :end exit /* ↑↑ ここまで ↑↑ */ 開発環境 OS:WindowsXP 以上、よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
XPで長いファイル名の問題ということですから、 コマンドプロンプト用の対策で構わないですかね? if "%~1"=="" goto error というふうに%の後に~(チルダ)を入れてください。 パラメータが引用符で囲われているときは引用符が取り除かれます。 パラメータが引用符で囲われていなければそのままです。 %~構文は他にもいろいろあるので for /? とか set /? とかで表示されるヘルプを読んでみてください。
その他の回答 (4)
- Cupper
- ベストアンサー率32% (2123/6444)
あー・・・なんか分かる気がする。 よくあるミスなんですよ。 試しにシステムフォルダの中のファイルをバッチファイルに投げ込んでみてください。 正常に動作するはずです。 これはパラメータとして渡されたファイル名に半角スペースが含まれるのが原因です。 半角スペースはパラメータの区切りとして使いますので、半角スペースを含む 「C:\Documents and Settings」 で始まるファイルは必ずエラーになりますよ。 すなわち if文の行でエラーになっているという事なんですね。 回避方法は、ファイル名をダブルクォーテーションで囲います。 if ""%1""=="""" goto error ("%1"と""をそれぞれダブルクォーテーションで囲います) これでOK。 echoコマンドはちょっと特殊でファイル名に半角スペースを含む場合、ファイル名を""で囲うように補完します。
お礼
まさにおっしゃる通りでした。 半角スペースでのミスは本当によくあるのに・・・。 気付けなかったのが少し悔しいですね…。 回答ありがとうございました。
- koko_u_
- ベストアンサー率18% (459/2509)
>pauseを入れても動かないのです…。 んー。ドラッグ&ドロップするファイル名が C:\Documents and Settings\.. とかだと、if "%1" == "" を引数展開した時にうまくいかないのかも。 どういうのがいいんだろ? if ""%1"" == """" などとしてみる?
お礼
空白文字を含むファイルパス指定でのバグでした。 文字列にするために""で囲むというのは直感的に分かりやすいと思います。 ありがとうございました。
- Toshi0230
- ベストアンサー率51% (836/1635)
実際に動かしてみてわかりました。 ファイルのフルパスに空白文字が含まれている場合、%1 にはパスをダブルクォーテーション(")でくくった文字列が渡されます。 (たとえば、"C:\Sample File.txt" の様に) なので、if 文で正常な文法にならずに異常終了していたのでしょう。 比較分のところのダブルクォーテーションをシングルクォーテーション(')に変える、あるいは if not exist 文に変える、等の方法で回避できるかと思います。
お礼
回答ありがとうございます。 両方の回避方で意図通り動作することを確認しました。 空白文字…よくあるミスですね…。
- koko_u_
- ベストアンサー率18% (459/2509)
>以下のバッチファイルにファイルやフォルダをD&Dすると >if文の分岐の箇所で終了してしまいます。 何がおかしいのかわからん。ドラッグ&ドロップしたらファイル名を一瞬エコーして exit してるんじゃないの?
お礼
早速の回答ありがとうございます。 おっしゃるとおりです。 pauseを入れるのを忘れてました。 ;end の後にpauseが抜けてました。 pauseを入れても動かないのです…。
お礼
チルダを入れると意図通り動作しました。 ありがとうございます。 "%~構文"で新しい知識が得られそうです。 勉強します、ありがとうございました。