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)の動作をさせる方法はありますか?
折衷案ですが、
a.vbs
CreateObject("WScript.Shell").Run "cmd /C D:\a.bat """ & WScript.Arguments.Item(0) & """"
というのはどうでしょうか。
ドラッグ&ドロップで、VBS経由でバッチが実行されます。
Windows2000で 確認しましたが
ドラッグ&ドロップの場合は、問題なく そのファイルが 開きましたよ。
OSによって 動作が 違うのでしょうか?
しまった…Win2000では未確認でした。検証ありがとうございます。
OS はWinXP Pro です。WinXP Pro で動作すれば問題ないです。
あ、原因が わかりました。
デスクトップから ドラックしたから できました。
スペースを 含む フォルダの下に テキストファイルを 置き
そこからドラッグすれば できます。
OSの仕様みたいなので 回避は 難しそうですね。
バッチファイルは
echo %1
notepad.exe %1
とすれば ドラッグして 渡されるファイル名が 確認できます。
なるほど。パスにスペースが含まれる場合は全体を""でくくってくれるのですね…なんとかしてくれよ...orz
スペースであれば、"%1"のようにすることで回避できると思いますが、& はDOSでは特殊な意味で使われるので、(たぶんそのせいで)ドラッグアンドドロップで正確な名前を受け取ることができません。
VBS になりますが、a.bat の変わりに下記のように a.vbs を作成し
CreateObject("WScript.Shell").Run "notepad.exe " & WScript.Arguments.Item(0)
ドラッグ&ドロップで試したところ、こちらは問題ないようです。
ご参考までに。
ありがとうございます。
一応vbs でこの問題が解決するのは確認済みなのですが、実際動かすのはnotepad ではない関係でvbs だと別の問題が発生するのです...。vbs にする場合、その件はまた別途ご質問させて頂きますが、出来ればバッチで解決したいと考えています。
折衷案ですが、
a.vbs
CreateObject("WScript.Shell").Run "cmd /C D:\a.bat """ & WScript.Arguments.Item(0) & """"
というのはどうでしょうか。
ドラッグ&ドロップで、VBS経由でバッチが実行されます。
動きました!
このやり方も試してみたのですが、ワタクシには動くやつが書けませんでしたw
これでなんとかなりそうです。ありがとうございました。
バッチファイル(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 でなくてなんでもかまいません。
ありがとうございます。
実際使うのは自分ではなくユーザなので原則どのPCでも動くようなものでないといけないという制約があります。説明不足で申し訳ありませんでしたが、参考にさせて頂きます。
動きました!
このやり方も試してみたのですが、ワタクシには動くやつが書けませんでしたw
これでなんとかなりそうです。ありがとうございました。