web-dev-qa-db-ja.com

'cmd'で 'start'コマンドを使用してコマンドライン引数でプログラムを起動する方法

Windows 7のコマンドラインでstartコマンドを使用してバックグラウンドでプログラム(仮想マシン)を起動する必要があります。通常は次のようにします。

start /b cmd yourprogram

しかし、私はいくつかの引数を渡す必要があります、そして私がそうするときは(デバッグ情報を見るために/bフラグなしで):

start C:\Users\USER>start "c:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe" -startvm "debian604 64"

私はこのエラーメッセージを得ます:

Windowsは '-startvm'を見つけることができません。名前を正しく入力したことを確認してから、やり直してください。

一方、最初のstartを指定せずに現在のコマンドラインウィンドウで実行すると、仮想マシンは正常に動作しますが、フォアグラウンドで動作します。

解決策はありますか?

32
Patryk
start /b "" "c:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe" -startvm "debian604 64"

start /?でパラメータリストを読むならば:

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
      [command/program] [parameters]

    "title"     Title to display in window title bar.
    command/program
                If it is an internal cmd command or a batch file then
                the command processor is run with the /K switch to cmd.exe.
                This means that the window will remain after the command
                has been run.

                If it is not an internal cmd command or batch file then
                it is a program and will run as either a windowed application
                or a console application.

    parameters  These are the parameters passed to the command/program.

引用符で囲まれたtitleが必要です(")。プログラムパスに引用符が含まれているので、それはタイトルとして解釈されました。明示的なタイトル(この場合は空、"")を追加するとうまくいきます。


別の方法は/dスイッチを使用してパスを指定することです。具体的には:

start /b /d "c:\Program Files\Oracle\VirtualBox\" VBoxHeadless.exe -startvm "debian604 64"

たとえ引用符で囲まれていても/dスイッチの後の最初の引数をパスとして使用しているように見えます。次の引数が引用符で囲まれていない場合はこれでうまくいきます。コマンド/プログラムとして認識された後のすべてのものは、そのコマンド/プログラムへのパラメータとして渡されます。コマンド/プログラムの名前にスペースが含まれていると、これは機能しません。 VBox Headless.exeは、引用符が必要でタイトルとして認識されるためです。


全体的に見て、最初の(明示的なタイトル)方法がおそらくより優れています。それはマイクロソフトの側では悪い設計上の選択でした、彼らは本当に「引用符で囲まれた最初の引数ですか?」よりむしろタイトルのためのスイッチを追加するべきでした。

36
Bob

実際に受け入れられた答えはまだ解決策ではありません。コマンドが実行されたcmdウィンドウを閉じると、実行中の仮想マシンを含むvboxheadlessプロセスが強制終了されます。

以下の方法を使用すると、 PowerShell が独立したプロセスを実行します。

Cmdで、次のコマンドを実行します。

cd "c:\Program Files\Oracle\VirtualBox"
vboxmanage list vms

これは次のようになります。

"Webserver LAP" {8748b594-7e2d-4d8d-8785-999940766754}

それではUUIDを取得して次のコマンドを実行してください(まだcmdにあります):

powershell start-process 'C:\program files\Oracle\virtualbox\vboxheadless' '-s 8748b594-7e2d-4d8d-8785-999940766754' -WindowStyle Hidden

この記事の著者に感謝します。

3