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

33

Necesito iniciar un programa (máquina virtual) en segundo plano con un startcomando en la línea de comandos de Windows 7. Normalmente harías esto así:

start /b cmd yourprogram

Pero necesito pasar algunos argumentos y cuando lo desee así (sin /bbandera para ver la información de depuración):

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

Me sale este mensaje de error:

Windows no puede encontrar '-startvm'. Asegúrese de escribir el nombre correctamente y luego intente nuevamente.

Por otro lado, cuando lo hago en la ventana de línea de comandos actual sin que startal principio la máquina virtual se ejecute normalmente, pero en primer plano.

¿Alguna solución?

Patryk
fuente

Respuestas:

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

Si lee 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.

Se espera un titleencerrado entre comillas ( "). Como la ruta de su programa incluía citas, se interpretó como el título. Agregar un título explícito (en este caso, vacío "") funciona.


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

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

Parece tomar el primer argumento después del /dcambio como la ruta, incluso si se cita, y si el siguiente argumento no se cita, entonces esto funciona. Todo después de lo que se reconoce como comando / programa se pasa como un parámetro a ese comando / programa. Tenga en cuenta 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 sería reconocido 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 agregado un interruptor para el título en lugar de "¿está el primer argumento entre comillas?".

Mover
fuente
Muchas gracias por eso :) Aunque, como veo start /b, no pongas la máquina virtual en segundo plano. Tengo que pensar en otra cosa entonces.
Patryk
Si solo desea suprimir la salida ( stdout), agregue un >nulal final. Use >nul 2>nulal final para suprimir tanto la salida normal como la salida de error ( stderr). Sin embargo, la ventana del símbolo del sistema debe mantenerse abierta.
Bob
1
@Patryk Si no le importa usar PowerShell, este comando abrirá un proceso sin ventanas que no está conectado al proceso de generación (powershell.exe). Por lo tanto, la ventana de PowerShell se puede cerrar y VBoxHeadless seguirá ejecutándose. PowerShell viene con Windows 7.Start-Process -FilePath 'C:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe' -ArgumentList '-startvm "debian604 64"' -WindowStyle Hidden
Bob
3

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

El uso del siguiente enfoque 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 .

Charlie Vieillard
fuente
En mi comentario sobre mi propia respuesta , ya he proporcionado un método alternativo para "ejecutar VBox sin cabeza". Mi respuesta en sí aborda la cuestión de "pasar argumentos con start".
Bob
¡GUAUU! cd¡AHORRÉ MIS HORAS!
T.Todua