質問: お世話になっております。 Windows 10 Professional(32ビット)で、次のようなことを試しています。 --- 次のような、単純なバッチファイル "sample.bat" を作成しました。 ``` echo %1 pause ``` 1-1. まず、このバッチファイルをローカルデスクトップ上に置いてダブルクリック(起動)すると、次のようなコンソール出力がなされて、うまくバッチファイルの echo, pause コマンドが呼び出されたことがわかります。 > > C:\Users\@@@@\Desktop>echo > > ECHO は です。 > > C:\Users\@@@@\Desktop>pause > > 続行するには何かキーを押してください . . . > > > 1-2. この"sample.bat" のショートカットアイコンを同じローカルデスクトップ上に(エクスプローラのコンテキストメニュー(マウス操作)で)作成して、これをダブルクリック(起動)しても、同じ出力が得られます。 1-3. さらに、このショートカットアイコンを「管理者として実行」で実行させても、同じ出力が得られます。 2-1. 次に、このショートカットアイコンの「リンク先」に次のような指定をして、二重引用符を含む引数を与えてみます。 C:\Users\@@@@\Desktop\sample.bat "TEST" そのあとショートカットアイコンをダブルクリック(起動)すると、次のようなコンソール出力が得られます。 > > C:\Users\@@@@\Desktop>echo "TEST" > > "TEST" > > C:\Users\@@@@\Desktop>pause > > 続行するには何かキーを押してください . . . > > > 3-1. また、コマンドプロンプトを単独で起動し、ショートカットアイコンのパスを指定して実行させても、同じ出力が得られます。 > > C:\Users\@@@@>"C:\Users\@@@@\Desktop\sample.bat - ショートカット.lnk" > > C:\Users\@@@@\Desktop>echo "TEST" > > "TEST" > > C:\Users\@@@@\Desktop>pause > > 続行するには何かキーを押してください . . . > > > 3-2. さらに、コマンドプロンプトを「管理者として実行」で単独で起動し、同じくショートカットアイコンのパスを指定して実行させても、同じ出力が得られます。 番号が前後していますが... 2-2. そして最後に、デスクトップ上のこのショートカットアイコンを右クリックして「管理者として実行」で実行させると、コンソールはすぐに閉じてしまいます。 --- 最後の2-2.の挙動、二重引用符つきの引数が指定されているショートカットアイコンを、「管理者として実行」させたとき、なぜバッチファイルは動作しないのでしょうか? 理由をご存知の方、ご教示いただけると助かります。
回答: 他のプログラムだと正常に実行されますね。 bat/cmdファイルを処理するハンドラのバグじゃないでしょうか。 回避策としては、リンク先を`cmd.exe /c sample.bat "TEST"`で。 追記 == 奥深いバグかと思っていましたが、ttyp03さんの回答を見て考えると、CMD.EXEの意外と浅いバグのようです。 ``` cmd /c "sample.bat" "TEST" ⇒ 'sample.bat" "TEST' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 ``` レジストリの、`HKEY_CLASSES_ROOT\cmdfile\shell\runas\command`が、`%SystemRoot%\System32\cmd.exe /C "%1" %*`なのですが、これを`%SystemRoot%\System32\cmd.exe /C %1 %*`に変更するとエラーは出ませんでした。が、このままだとパス名に空白を含んだものが管理者として実行することが出来ないので、戻しました。 通常実行の`\open\command`は、`"%1" %*`になっており、これは問題ないです。 おそらく「管理者として実行」の機能は対象が`EXE`である必要があり、そのために`\runas\command`に`cmd.exe /c`を付加したために、上記のバグに引っかかってしまったようです。 最初に回避策を書きましたが、これは`sample.bat`の用に引用符で囲まないでもいいケースだと良いのですが、 `D:\test dir\sample.bat`のようなケースで、空白があるからと引用符で囲むと、同じくエラーになります。 NG `cmd /c "D:\test dir\sample.bat" "TEST"` OK `cmd /c D:\test^ dir\sample.bat "TEST"` 空白は`^`でエスケープするとOKです。