So-net無料ブログ作成

"("を含むパス上にあるbatファイルを、「管理者として実行」で正常実行できない を見て [メール投稿]

"("を含むパス上にあるbatファイルを、「管理者として実行」で正常実行できない
結局、cmd.exeを経由するかどうかの違いと解釈しました。


open/commandのときもcmd.exeによって*.batファイルは実行されます。

いろいろ調べた結果

open/commandのとき、%1には""で囲ったパスが入る。
runas/commandのときは、%1には""で囲っていないパスが入る。

という挙動をすることがわかりました。
これは、「管理者として実行」するときは通常はexeファイルが対象になるので、HKEY_CLASSES_ROOT\exefile\shell\runas\commandの「"%1" %*」に囲っていないパスを入れることに合わせた挙動と思われます。

runas/commandのときは1重で囲ってあるので特殊文字の影響を受けてしまいます。
open/commandはパスが2重に""で囲うことになるために、特殊文字をエスケープしなくとも正しいパスとして処理されているようです。この挙動はcmdのヘルプの

2. 最初の文字が引用符であるにも関わらず上の条件に一致しない場合は、最初
の引用符とコマンド ラインの最後の引用符が削除され、最後の引用符の後
のテキストが有効になります。

が適用されている(?)のかもしれません。

現状の挙動が正常であるとすると
"%SystemRoot%\System32\cmd.exe" /C ""%1"" %*
となっているのが正しい設定ということになりそうです。



回答としてマーク 流れ星 2011年6月15日 6:58

2011年6月15日 3:51

"("を含むパス上にあるbatファイルを、「管理者として実行」で正常実行できない
"%SystemRoot%\System32\cmd.exe" /C ""%1"" %*

理屈の上では、引数に引用符がある場合、そちらの引用符が削除されます。

""name"" "arg" → "name"" "arg

なので、

"%SystemRoot%\System32\cmd.exe" /C ""%1" %*"

のほうがよいでしょう。
更に、

"%SystemRoot%\System32\cmd.exe" /S /C ""%1" %*"

としたほうが、明示的でよいでしょう。

別のやり方としては

"%SystemRoot%\System32\cmd.exe" /C call "%1" %*

が使えるのではないかと思います。

回答の候補に設定 jun-s 2013年4月19日 7:15

2013年2月10日 6:48

 書いてあることは良く分からないのだが、"%1"の扱い方について検索していた時に見つけた情報。気になるのでメモしておく。ついでに、私のXPマシンのレジストリで「"%1" %*」で検索したところ、そのようなデータになっているキーがいくつかあった。とりあえず、メモしておく。私の能力では意味不明なのだが…。

HKEY_CLASSES_ROOT\batfile\shell\open\command
HKEY_CLASSES_ROOT\cmdfile\shell\open\command
HKEY_CLASSES_ROOT\comfile\shell\open\command
HKEY_CLASSES_ROOT\exefile\shell\open\command
HKEY_CLASSES_ROOT\exefile\shell\runas\command
HKEY_CLASSES_ROOT\piffile\shell\open\command

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\batfile\shell\open\command
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\cmdfile\shell\open\command
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\comfile\shell\open\command
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\exefile\shell\open\command
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\exefile\shell\runas\command
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\piffile\shell\open\command

これらはデータが全て「"%1" %*」

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。