DOS のバッチファイルに関する質問です。


a.bat の内容は以下です。

notepad.exe %1

このバッチファイルに「test&test.txt」のような半角"&" を含んだファイルを渡す場合にコマンドプロンプトを起動して

(1)
> a.bat test&test.txt

と実行すると「ファイル test.txt は見つかりません。新しく作成しますか?」というメッセージが表示されてしまいます。この問題を解決するには

(2)
> a.bat "test&test.txt"

のように""で囲って実行すればいいのですが、a.bat に「test&test.txt」をドラッグ&ドロップした場合にも、(1)ではなく(2)の動作をさせる方法はありますか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/04/25 10:39:48
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.4

回答回数1314ベストアンサー獲得回数393

ポイント100pt

折衷案ですが、

a.vbs

CreateObject("WScript.Shell").Run "cmd /C D:\a.bat """ & WScript.Arguments.Item(0) & """"

というのはどうでしょうか。

ドラッグ&ドロップで、VBS経由でバッチが実行されます。

id:naka-m

動きました!

このやり方も試してみたのですが、ワタクシには動くやつが書けませんでしたw

これでなんとかなりそうです。ありがとうございました。

2007/04/25 10:30:40

その他の回答4件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント10pt

Windows2000で 確認しましたが

ドラッグ&ドロップの場合は、問題なく そのファイルが 開きましたよ。

OSによって 動作が 違うのでしょうか?

id:naka-m

しまった…Win2000では未確認でした。検証ありがとうございます。

OS はWinXP Pro です。WinXP Pro で動作すれば問題ないです。

2007/04/24 14:36:12
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント10pt

あ、原因が わかりました。

デスクトップから ドラックしたから できました。

スペースを 含む フォルダの下に テキストファイルを 置き

そこからドラッグすれば できます。

OSの仕様みたいなので 回避は 難しそうですね。

バッチファイルは

echo %1

notepad.exe %1

とすれば ドラッグして 渡されるファイル名が 確認できます。

id:naka-m

なるほど。パスにスペースが含まれる場合は全体を""でくくってくれるのですね…なんとかしてくれよ...orz

2007/04/24 14:55:35
id:Mook No.3

回答回数1314ベストアンサー獲得回数393

ポイント10pt

スペースであれば、"%1"のようにすることで回避できると思いますが、& はDOSでは特殊な意味で使われるので、(たぶんそのせいで)ドラッグアンドドロップで正確な名前を受け取ることができません。


VBS になりますが、a.bat の変わりに下記のように a.vbs を作成し

CreateObject("WScript.Shell").Run "notepad.exe " & WScript.Arguments.Item(0)

ドラッグ&ドロップで試したところ、こちらは問題ないようです。


ご参考までに。

id:naka-m

ありがとうございます。

一応vbs でこの問題が解決するのは確認済みなのですが、実際動かすのはnotepad ではない関係でvbs だと別の問題が発生するのです...。vbs にする場合、その件はまた別途ご質問させて頂きますが、出来ればバッチで解決したいと考えています。

2007/04/24 15:29:57
id:Mook No.4

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント100pt

折衷案ですが、

a.vbs

CreateObject("WScript.Shell").Run "cmd /C D:\a.bat """ & WScript.Arguments.Item(0) & """"

というのはどうでしょうか。

ドラッグ&ドロップで、VBS経由でバッチが実行されます。

id:naka-m

動きました!

このやり方も試してみたのですが、ワタクシには動くやつが書けませんでしたw

これでなんとかなりそうです。ありがとうございました。

2007/04/25 10:30:40
id:Bookmarker No.5

回答回数191ベストアンサー獲得回数34

ポイント20pt

バッチファイル(cmd.exe?)へドロップする時だけおかしいようです。

(なので、バグではないかと思います。)


よって、一旦他のコマンドを経由して、引数の特殊文字をエスケープしてからバッチファイルへ渡せば回避できます。


例えば、次のようなコマンドを作っておいて、

D:\home\user\work\test\bat\args\system.rb

#!ruby
system "#{ARGV[0]} \"#{ARGV[1]}\""

次のようなショートカットへファイルをドロップすれば、"&"を含んだファイル名を正常にバッチファイルへ渡せます。

C:\usr\bin\ruby.exe D:\home\user\work\test\bat\args\system.rb D:\home\user\work\test\bat\args\a.bat

# もちろん、中継コマンド(system.rb)は Ruby でなくてなんでもかまいません。

id:naka-m

ありがとうございます。

実際使うのは自分ではなくユーザなので原則どのPCでも動くようなものでないといけないという制約があります。説明不足で申し訳ありませんでしたが、参考にさせて頂きます。

2007/04/25 10:35:08
  • id:naka-m
    ご回答頂いた皆様ありがとうございました。

    実際こちらから提供した情報の範囲ではどの方のご回答もスジが通っておりますので、本筋とは少し離れているが実際こちらの役に立った情報に多くポイントを差し上げるのもちょっと気が引けるところもあったのですが、何卒ご容赦下さい。
  • id:Bookmarker
    >>
    実際使うのは自分ではなくユーザなので原則どのPCでも動くようなものでないといけないという制約があります。
    <<

    私の回答5でやってる事は、基本的に Mook さんの回答4と同じ事です(たぶん)。
    私は VBS を書けないので Ruby で書いただけです。
    (C でも書けるけど面倒だったので)
  • id:naka-m
    Bookmarkerさん、お世話になります。
    Bookmarkerさんの言い分はごもっともで、それはこちらからご提供した情報が不足していたのが原因です。お詫びします。ただ実際どちらも手法としてバッチファイル単独での解決ではないので、Mookさんの情報がたまたまピンポイントで自分の役に立った分のお礼、ということでご容赦下さい。
  • id:Bookmarker
    ポイント配分に不満を言っているのではありません。(^_^;
    ただ、
    >>
    実際使うのは自分ではなくユーザなので原則どのPCでも動くようなものでないといけないという制約があります。説明不足で申し訳ありませんでしたが、参考にさせて頂きます。
    <<
    というコメントから、Mook さんのとは別の解決策と勘違いされているのではないかと思って補足しただけです。

    コメントのタイミングと説明が下手なせいで、逆に誤解させてしまったようですみません。m(__)m
  • id:naka-m
    Bookmarkerさん、お付き合いありがとうございます。コメントの件了解です。皆さんそれぞれちゃんとご回答頂いているのにポイント配分に差を作ったことに関して自分自身がちょっと神経質になっていました。

    元々妥協案として「別の何かを介する」というアイデアは自分の中でもあったのですが、「具体的なコード」が思い浮かばなかったのです。自分の理解が間違っていたら申し訳ないですが、vbsはほとんどのWindowsXP環境でそのまま動作しますが、rubyはクライアントに実行環境が必要なので、あのように書かせて頂いた次第です。
  • id:taknt
    XPでやってみましたが、a.vbsのファイルにドラッグしてもなんとも なりませんでした。

    ただ単純に テキストを 開くだけならば メモ帳のショートカットを作って それに ドラッグさせれば いいだけかと思いますが・・・。
  • id:naka-m
    taknt さんお世話になります。ウチでは動きましたよ。D:\a.bat の部分は適宜書き換えましたが。

    Mookさんへの最初の回答に書かせて頂きましたが、実際に動かすのはnotepad ではありません。ワタクシの説明が悪かったので、その点はお詫びいたします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません