Jak uruchomić program z argumentami wiersza poleceń w Windows cmd za pomocą polecenia „start”?

33

Muszę uruchomić program (maszynę wirtualną) w tle za pomocą startpolecenia w wierszu polecenia systemu Windows 7. Zwykle zrobiłbyś to w ten sposób:

start /b cmd yourprogram

Ale muszę przekazać kilka argumentów, a kiedy mi się to podoba (bez /bflagi, aby wyświetlić informacje o debugowaniu):

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

Otrzymuję ten komunikat o błędzie:

System Windows nie może znaleźć „-startvm”. Upewnij się, że nazwa została wpisana poprawnie, a następnie spróbuj ponownie.

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

Jakieś rozwiązania?

Patryk
źródło

Odpowiedzi:

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

Jeśli przeczytasz listę parametrów za pomocą 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.

Oczekiwany jest titlew cudzysłowie ( "). Ponieważ ścieżka programu zawierała cudzysłowy, została zinterpretowana jako tytuł. Dodanie wyraźnego tytułu (w tym przypadku pustego "") działa.


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

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

Wydaje się, że przyjmuje pierwszy argument za /dprzełącznikiem jako ścieżkę, nawet jeśli jest cytowany, a jeśli następny argument nie jest cytowany, to działa. Wszystko po tym, co jest rozpoznawane jako polecenie / program, jest przekazywane jako parametr do tego polecenia / programu. Uwaga: to nie zadziała, jeśli polecenie / program ma spacje w nazwie, np. VBox Headless.exePonieważ wymagałoby to cudzysłowów i byłoby rozpoznawane jako tytuł.


Ogólnie rzecz biorąc, pierwsza metoda (wyraźny tytuł) jest prawdopodobnie lepsza. To był zły wybór ze strony Microsoftu, oni naprawdę powinni byli dodać przełącznik tytułu zamiast „czy pierwszy argument jest zawarty w cudzysłowie?”.

Kok
źródło
Dziękuję bardzo za to :) Chociaż, jak widzę, start /bnie umieszczaj maszyny wirtualnej w tle. Muszę wymyślić coś innego.
Patryk
Jeśli chcesz po prostu pominąć output ( stdout), dodaj a >nulna końcu. Użyj >nul 2>nulna końcu, aby ukryć zarówno normalne wyjście, jak i wyjście błędu ( stderr). Jednak okno wiersza polecenia musi być otwarte.
Bob
1
@Patryk Jeśli nie masz nic przeciwko korzystaniu z PowerShell, to polecenie otworzy proces bez okien, który nie jest połączony z procesem spawnowania (powershell.exe). Dlatego okno PowerShell można zamknąć, a VBoxHeadless będzie nadal działać. PowerShell jest dostarczany z systemem Windows 7.Start-Process -FilePath 'C:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe' -ArgumentList '-startvm "debian604 64"' -WindowStyle Hidden
Bob
3

W rzeczywistości zaakceptowana odpowiedź wciąż nie jest rozwiązaniem. Zamknięcie okna cmd, w którym wykonano polecenie, spowoduje zabicie procesu bez vboxhead z uruchomioną maszyną wirtualną.

Zastosowanie poniższego podejścia sprawi, że PowerShell uruchomi niezależny proces.

W cmd uruchom:

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

Zwróci to coś w rodzaju:

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

Teraz weź UUID i uruchom następujące polecenie (nadal 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 .

Charlie Vieillard
źródło
W moim komentarzu do własnej odpowiedzi podałem już alternatywną metodę „bezobsługowego uruchamiania VBoxa”. Moja odpowiedź sama dotyczy pytania „przekazywanie argumentów za pomocą start”.
Bob
ŁAŁ! cdZAPISZŁO MOJE GODZINY!
T.Todua