Come avviare un programma con argomenti da riga di comando su Windows cmd con comando 'start'?


33

Devo avviare un programma (macchina virtuale) in background con un startcomando sulla riga di comando 7 di Windows. Normalmente faresti così:

start /b cmd yourprogram

Ma ho bisogno di passare alcuni argomenti e quando mi piace così (senza /bflag per vedere le informazioni di debug):

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

Ricevo questo messaggio di errore:

Windows non riesce a trovare '-startvm'. Assicurati di aver digitato correttamente il nome, quindi riprova.

D'altra parte quando lo faccio nella finestra della riga di comando corrente senza startall'inizio la macchina virtuale funziona normalmente, ma in primo piano.

Qualche soluzione?

Risposte:


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

Se leggi l'elenco dei parametri con 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.

Si aspetta un titleracchiuso tra virgolette ( "). Poiché il percorso del programma includeva virgolette, è stato interpretato come il titolo. L'aggiunta di un titolo esplicito (in questo caso, vuoto, "") funziona.


Un metodo alternativo sta usando l' /dopzione per specificare il percorso. In particolare:

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

Sembra prendere il primo argomento dopo il /dpassaggio come percorso, anche se viene citato e se l'argomento successivo non viene citato, allora funziona. Tutto ciò che viene riconosciuto come comando / programma viene passato come parametro a quel comando / programma. Nota che questo non funzionerà se il comando / programma ha spazi nel nome, ad es VBox Headless.exe. Poiché ciò richiederebbe virgolette e sarebbe riconosciuto come titolo.


Nel complesso, il primo metodo (titolo esplicito) è probabilmente migliore. È stata una cattiva scelta progettuale da parte di Microsoft, avrebbero davvero dovuto aggiungere uno switch per il titolo piuttosto che "il primo argomento è racchiuso tra virgolette?".


Grazie mille :) Anche se, come vedo start /b, non mettere la macchina virtuale in secondo piano. Allora devo inventarmi qualcos'altro.
Patryk,

Se vuoi solo eliminare output ( stdout), aggiungi >nula alla fine. Utilizzare >nul 2>nulalla fine per eliminare sia l'output normale sia l'output di errore ( stderr). La finestra del prompt dei comandi deve essere mantenuta aperta, tuttavia.
Bob,

1
@Patryk Se non ti dispiace usare PowerShell, questo comando aprirà un processo senza finestre che non è collegato al processo di generazione (powershell.exe). Pertanto, la finestra di PowerShell può essere chiusa e VBoxHeadless continuerà a funzionare. PowerShell viene fornito con Windows 7.Start-Process -FilePath 'C:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe' -ArgumentList '-startvm "debian604 64"' -WindowStyle Hidden
Bob,

3

In realtà la risposta accettata non è ancora una soluzione. La chiusura della finestra cmd in cui è stato eseguito il comando interromperà il processo vboxheadless con la macchina virtuale in esecuzione al suo interno.

L'uso dell'approccio seguente renderà PowerShell un processo indipendente.

In cmd, esegui:

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

Questo restituirà qualcosa di simile:

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

Ora prendi l'UUID ed esegui il seguente (sempre in cmd):

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

Grazie all'autore di questo articolo .


Nel mio commento sulla mia risposta ho già fornito un metodo alternativo per "eseguire VBox senza testa". La mia stessa risposta affronta la questione del "passaggio di argomenti con start".
Bob,

WOW! cdSALVATO LE MIE ORE!
T.Todua,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.