Comment démarrer un programme avec des arguments de ligne de commande sur la cmd de Windows avec la commande 'start'?

33

J'ai besoin de démarrer un programme (machine virtuelle) en arrière-plan avec une startcommande sur la ligne de commande Windows 7. Normalement, vous feriez ceci comme ça:

start /b cmd yourprogram

Mais je dois passer quelques arguments et quand je le fais comme ça (sans /bindicateur pour voir les informations de débogage):

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

Je reçois ce message d'erreur:

Windows ne peut pas trouver '-startvm'. Assurez-vous d'avoir correctement tapé le nom, puis réessayez.

D'un autre côté, lorsque je le fais dans la fenêtre de ligne de commande actuelle sans startau début, la machine virtuelle fonctionne normalement - mais au premier plan.

Des solutions?

Patryk
la source

Réponses:

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

Si vous lisez la liste des paramètres avec 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.

Il attend un titleentre guillemets ( "). Étant donné que votre chemin d'accès au programme comprenait des guillemets, il a été interprété comme le titre. L'ajout d'un titre explicite (dans ce cas, vide "") fonctionne.


Une autre méthode consiste à utiliser le /dcommutateur pour spécifier le chemin d'accès. Plus précisément:

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

Il semble prendre le premier argument après le /dcommutateur comme chemin d'accès, même s'il est cité, et si l'argument suivant n'est pas cité, cela fonctionne. Tout ce qui est reconnu comme la commande / le programme est passé en paramètre à cette commande / programme. Notez que cela ne fonctionnera pas si la commande / le programme contient des espaces dans le nom, par exemple VBox Headless.exe, car cela nécessiterait des guillemets et serait reconnu comme un titre.


Dans l'ensemble, la première méthode (titre explicite) est probablement meilleure. C'était un mauvais choix de conception de la part de Microsoft, ils auraient vraiment dû ajouter un commutateur pour le titre plutôt que "le premier argument est-il placé entre guillemets?".

Bob
la source
Merci beaucoup pour cela :) Bien que, comme je le vois start /b, ne mettez pas la machine virtuelle en arrière-plan. Je dois alors trouver autre chose.
Patryk
Si vous souhaitez simplement supprimer la sortie ( stdout), ajoutez un >nulà la fin. Utilisez >nul 2>nulà la fin pour supprimer à la fois la sortie normale et la sortie error ( stderr). La fenêtre d'invite de commande doit cependant rester ouverte.
Bob
1
@Patryk Si cela ne vous dérange pas d'utiliser PowerShell, cette commande ouvrira un processus sans fenêtre qui n'est pas connecté au processus d'apparition (powershell.exe). Par conséquent, la fenêtre PowerShell peut être fermée et VBoxHeadless continuera de fonctionner. PowerShell est livré avec Windows 7.Start-Process -FilePath 'C:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe' -ArgumentList '-startvm "debian604 64"' -WindowStyle Hidden
Bob
3

En fait, la réponse acceptée n'est toujours pas une solution. La fermeture de la fenêtre cmd dans laquelle la commande a été exécutée tuera le processus vboxheadless avec la machine virtuelle en cours d'exécution.

En utilisant l'approche ci-dessous, PowerShell exécutera un processus indépendant.

En cmd, exécutez:

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

Cela retournera quelque chose comme:

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

Maintenant, prenez l'UUID et exécutez ce qui suit (toujours en cmd):

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

Merci à l'auteur de cet article .

Charlie Vieillard
la source
Dans mon commentaire sur ma propre réponse, j'ai déjà fourni une méthode alternative pour "exécuter VBox sans tête". Ma réponse elle-même porte sur la question de "passer des arguments avec start".
Bob
HOU LA LA! cdENREGISTRÉ MES HEURES!
T.Todua