2012-04-18 14:53:51 +0000 2012-04-18 14:53:51 +0000
36
36

Jak uruchomić program z argumentami wiersza poleceń na Windows' cmd z komendą 'start'?

Potrzebuję uruchomić program (maszynę wirtualną) w tle z komendą start na Windows’ 7 z wiersza poleceń. Normalnie zrobiłbyś to tak:

start /b cmd yourprogram

Ale muszę przekazać kilka argumentów i kiedy tak to robię (bez flagi /b, żeby zobaczyć informację o debugie):

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

Otrzymuję ten komunikat o błędzie:

Windows nie może znaleźć ‘-startvm’. Upewnij się, że wpisałeś poprawnie nazwę, a następnie spróbuj ponownie.

Z drugiej strony, gdy robię to w bieżącym oknie wiersza poleceń bez start na początku, maszyna wirtualna działa normalnie - ale na pierwszym planie.

Jakieś rozwiązania?

Odpowiedzi (2)

40
40
40
2012-04-18 15:39:49 +0000
start /b "" "c:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe" -startvm "debian604 64"

Jeśli odczytasz listę parametrów z 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.

Oczekuje title ujętego w cudzysłowie ("). Ponieważ Twoja ścieżka programu zawierała cudzysłowy, został on zinterpretowany jako tytuł. Dodanie jawnego tytułu (w tym przypadku pustego, "") działa.

  • *

Alternatywną metodą jest użycie przełącznika /d do określenia ścieżki. Konkretnie:

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

Po przełączniku /d jako ścieżkę przyjmuje się pierwszy argument, nawet jeśli jest on cytowany, a jeśli następny argument nie jest cytowany, to działa. Wszystko po tym, co zostało rozpoznane jako polecenie/program jest przekazywane jako parametr do tego polecenia/programu. Zauważ, że to nie zadziała, jeśli polecenie/program ma w nazwie spacje, np. VBox Headless.exe, ponieważ wymagałoby to cytowania i byłoby rozpoznawane jako tytuł.

  • *

Ogólnie rzecz biorąc, pierwsza (jawny tytuł) metoda jest prawdopodobnie lepsza. To był zły wybór projektu ze strony Microsoftu, naprawdę powinni byli dodać przełącznik dla tytułu, a nie “czy pierwszy argument jest zawarty w cudzysłowie?”.

3
3
3
2013-10-23 11:32:21 +0000

Właściwie przyjęta odpowiedź nadal nie jest rozwiązaniem. Zamknięcie okna cmd w którym została wykonana komenda zabije proces vboxheadless z uruchomioną w nim maszyną wirtualną.

Użycie poniższego podejścia spowoduje, że PowerShell uruchomi niezależny proces.

W cmd, uruchom:

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

To zwróci coś w stylu:

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

Teraz weź UUID i uruchom następujący (wciąż w cmd):

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

Dzięki autorowi tego artykułu .