web-dev-qa-db-fra.com

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

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

start /b cmd yourprogram

Mais j'ai besoin de passer quelques arguments et quand ça se présente comme ceci (sans drapeau /b 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 saisi le nom, puis réessayez.

Par contre, lorsque je le fais dans la fenêtre de ligne de commande actuelle sans la variable start au début, la machine virtuelle s'exécute normalement, mais au premier plan.

Des solutions?

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

Si vous lisez la liste de 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 s'attend à une title entre guillemets ("). Comme votre chemin de programme incluait des guillemets, il était interprété comme le titre. L'ajout d'un titre explicite (dans ce cas vide, "") fonctionne.


Une autre méthode consiste à utiliser le commutateur /d pour spécifier le chemin. Plus précisément:

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

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


Globalement, 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 entre guillemets?".

36
Bob

En fait, la réponse acceptée n’est toujours pas une solution. La fermeture de la fenêtre de commande où la commande a été exécutée va tuer le processus vboxheadless contenant la machine virtuelle en cours d'exécution.

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

En cmd, lancez:

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 .

3
Charlie Vieillard