ドラッグ・アンド・ドロップ(以下、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
以上、よろしくお願いします。
No.5ベストアンサー
- 回答日時:
XPで長いファイル名の問題ということですから、
コマンドプロンプト用の対策で構わないですかね?
if "%~1"=="" goto error
というふうに%の後に~(チルダ)を入れてください。
パラメータが引用符で囲われているときは引用符が取り除かれます。
パラメータが引用符で囲われていなければそのままです。
%~構文は他にもいろいろあるので
for /?
とか
set /?
とかで表示されるヘルプを読んでみてください。
チルダを入れると意図通り動作しました。
ありがとうございます。
"%~構文"で新しい知識が得られそうです。
勉強します、ありがとうございました。
No.4
- 回答日時:
あー・・・なんか分かる気がする。
よくあるミスなんですよ。
試しにシステムフォルダの中のファイルをバッチファイルに投げ込んでみてください。
正常に動作するはずです。
これはパラメータとして渡されたファイル名に半角スペースが含まれるのが原因です。
半角スペースはパラメータの区切りとして使いますので、半角スペースを含む
「C:\Documents and Settings」
で始まるファイルは必ずエラーになりますよ。
すなわち if文の行でエラーになっているという事なんですね。
回避方法は、ファイル名をダブルクォーテーションで囲います。
if ""%1""=="""" goto error
("%1"と""をそれぞれダブルクォーテーションで囲います)
これでOK。
echoコマンドはちょっと特殊でファイル名に半角スペースを含む場合、ファイル名を""で囲うように補完します。
まさにおっしゃる通りでした。
半角スペースでのミスは本当によくあるのに・・・。
気付けなかったのが少し悔しいですね…。
回答ありがとうございました。
No.3
- 回答日時:
>pauseを入れても動かないのです…。
んー。ドラッグ&ドロップするファイル名が C:\Documents and Settings\.. とかだと、if "%1" == "" を引数展開した時にうまくいかないのかも。
どういうのがいいんだろ? if ""%1"" == """" などとしてみる?
空白文字を含むファイルパス指定でのバグでした。
文字列にするために""で囲むというのは直感的に分かりやすいと思います。
ありがとうございました。
No.2
- 回答日時:
実際に動かしてみてわかりました。
ファイルのフルパスに空白文字が含まれている場合、%1 にはパスをダブルクォーテーション(")でくくった文字列が渡されます。
(たとえば、"C:\Sample File.txt" の様に)
なので、if 文で正常な文法にならずに異常終了していたのでしょう。
比較分のところのダブルクォーテーションをシングルクォーテーション(')に変える、あるいは if not exist 文に変える、等の方法で回避できるかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- その他(プログラミング・Web制作) 単純なコマンドプロンプトが動きません。 2 2022/04/19 15:21
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Windows 10 Windowsのバッチファイルで正規表現の置換方法について… 4 2022/12/09 16:00
- Windows 10 windowsの回復ドライブや復元ポイントを使用した場合の戻る位置を教えてください。 5 2023/08/19 14:52
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Excel(エクセル) ファイル一覧表を使ったファイルの移動 5 2022/08/10 15:37
- ソフトウェア フォルダ内の全サブフォルダ内のファイルパスをサブフォルダ毎に行を分けてリスト化したい 1 2022/11/13 10:27
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
バッチファイル 文字列にスペースがある場合
その他(プログラミング・Web制作)
-
バッチファイル 二つ上のディレクトリのパス取得
その他(プログラミング・Web制作)
-
-
4
コマンドプロンプト標準出力とファイル出力両方
その他(プログラミング・Web制作)
-
5
batである文字列内に特定の文字列が含まれているか確認したい
その他(プログラミング・Web制作)
-
6
Dosブロンプトでtabを出力したい
その他(プログラミング・Web制作)
-
7
バッチでCSVを処理する時、空の項目があった場合
その他(プログラミング・Web制作)
-
8
batファイルの強制終了を回避したい
Android
-
9
[DOS] コピー先に同じファイル名がある場合、名前を変えて...
その他(プログラミング・Web制作)
-
10
バッチ終了時にDOS窓を閉じるコマンド
その他(プログラミング・Web制作)
-
11
コマンドプロンプトでのBATファイルで、定数文字列の記述方法
Windows Vista・XP
-
12
バッチでcsvファイルの指定のカラムを編集したい
その他(プログラミング・Web制作)
-
13
バッチでテキストファイルから任意の行のみ取得したい
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Winmerge ファイルの中身は同じ...
-
同期センターのマークが出てま...
-
コマンドプロンプトによるフォ...
-
onedriveの中身を削除したらパ...
-
ファイルの単位
-
emlをtxtに変換するには?
-
Excellにて→ファイルエラー:デ...
-
ファイルの先頭行を全て削除したい
-
教えてください!困ってます。
-
exeファイルを無効化するには
-
バッチファイルで変数の中身を...
-
Mac bookで録画ファイル.movを...
-
teratrermを使ったデータの送信...
-
クラリスワークスのファイルを...
-
VScodeでjarファイルを開く方法
-
バッチファイルからタスクスケ...
-
ファイル名に"¥"マークがつく...
-
linuxのエディタgeditは複数フ...
-
Windows10 フォルダ内の自動並...
-
BAKファイルを非表示にする方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Winmerge ファイルの中身は同じ...
-
onedriveの中身を削除したらパ...
-
同期センターのマークが出てま...
-
バッチファイルで変数の中身を...
-
ファイルの先頭行を全て削除したい
-
Windows10 フォルダ内の自動並...
-
教えてください!困ってます。
-
コマンドプロンプトによるフォ...
-
emlをtxtに変換するには?
-
ファイルの単位
-
mac ファイルの詳細情報を編集...
-
office365 ファイルを削除したい
-
Excellにて→ファイルエラー:デ...
-
macのdmgファイル(動画)をMP4...
-
クラリスワークスのファイルを...
-
mrl→midファイルへ
-
Windows11 ゴミ箱 ファイルの取...
-
会社のTeamsのことで相談です。...
-
フォルダ内の一覧を印刷するには?
-
exFATに欠点はありますか?
おすすめ情報