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

¿Cómo iniciar un programa con argumentos de línea de comandos en el cmd de Windows con el comando 'start'?

Necesito iniciar un programa (máquina virtual) en segundo plano con un comando start en la línea de comandos de Windows’ 7. Normalmente lo haría así:

start /b cmd yourprogram

Pero necesito pasar algunos argumentos y cuando lo hago así (sin el indicador /b para ver la información de depuración):

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

Recibo este mensaje de error:

Windows no puede encontrar ‘-startvm’. Asegúrate de que has escrito el nombre correctamente y vuelve a intentarlo.

Por otro lado, cuando lo hago en la ventana de la línea de comandos actual sin el start al principio la máquina virtual funciona normalmente, pero en primer plano.

¿Alguna solución?

Respuestas (2)

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

Si lees la lista de parámetros 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.

Espera un title entre comillas ("). Como la ruta de tu programa incluía comillas, se interpretó como el título. Añadir un título explícito (en este caso, vacío, "") funciona.


Un método alternativo es usar el interruptor /d para especificar la ruta. Específicamente:

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

Parece que toma el primer argumento después del conmutador /d como el camino, incluso si está citado, y si el siguiente argumento no está citado entonces esto funciona. Todo lo que sigue a lo que se reconoce como el comando/programa se pasa como un parámetro a ese comando/programa. Nótese que esto no funcionará si el comando/programa tiene espacios en el nombre, por ejemplo VBox Headless.exe, ya que eso requeriría comillas y se reconocería como un título.


En general, el primer método (título explícito) es probablemente mejor. Fue una mala elección de diseño por parte de Microsoft, realmente deberían haber añadido un cambio para el título en lugar de “¿el primer argumento está entre comillas?

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

En realidad, la respuesta aceptada todavía no es una solución. Cerrar la ventana del cmd donde se ejecutó el comando matará el proceso vboxheadless con la máquina virtual en ejecución.

Usando el enfoque de abajo hará que PowerShell ejecute un proceso independiente.

En cmd, ejecute:

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

Esto devolverá algo como:

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

Ahora tome el UUID y ejecute lo siguiente (aún en cmd):

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

Gracias al autor de este artículo .