
Necesito iniciar un programa (máquina virtual) en segundo plano con un start
comando 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 hago me gusta esto (sin /b
bandera 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úrese de haber escrito el nombre correctamente y vuelva a intentarlo.
Por otro lado, cuando lo hago en la ventana de línea de comando actual sin al start
principio, la máquina virtual se ejecuta normalmente, pero en primer plano.
¿Alguna solución?
Respuesta1
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
mensaje entre comillas ( "
). Dado que la ruta de su programa incluía comillas, se interpretó como el título. Agregar un título explícito (en este caso, vacío ""
) funciona.
Un método alternativo es utilizar el /d
interruptor 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 /d
cambio como ruta, incluso si está entre comillas, y si el siguiente argumento no está entre comillas, entonces esto funciona. Todo lo que sigue a lo que se reconoce como comando/programa se pasa como 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 requeriría comillas y sería reconocido como un título.
En general, el primer método (título explícito) probablemente sea mejor. Fue una mala elección de diseño por parte de Microsoft, realmente deberían haber agregado un cambio para el título en lugar de "¿el primer argumento está entre comillas?".
Respuesta2
En realidad, la respuesta aceptada todavía no es una solución. Cerrar la ventana cmd donde se ejecutó el comando finalizará el proceso vboxheadless con la máquina virtual en ejecución.
Usar el siguiente enfoque hará quePotencia Shellejecutar un proceso independiente.
En cmd ejecutamos:
cd "c:\Program Files\Oracle\VirtualBox"
vboxmanage list vms
Esto devolverá algo como:
"Webserver LAP" {8748b594-7e2d-4d8d-8785-999940766754}
Ahora toma el UUID y ejecuta 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 deEste artículo.