
Preciso iniciar um programa (máquina virtual) em segundo plano com um start
comando na linha de comando do Windows 7. Normalmente você faria assim:
start /b cmd yourprogram
Mas preciso passar alguns argumentos e quando for assim (sem /b
flag para ver as informações de depuração):
start C:\Users\USER>start "c:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe" -startvm "debian604 64"
Recebo esta mensagem de erro:
O Windows não consegue encontrar '-startvm'. Certifique-se de digitar o nome corretamente e tente novamente.
Por outro lado, quando faço isso na janela da linha de comando atual sem o start
início, a máquina virtual funciona normalmente - mas em primeiro plano.
Alguma solução?
Responder1
start /b "" "c:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe" -startvm "debian604 64"
Se você ler a lista de parâmetros com 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.
Ele espera um title
valor entre aspas ( "
). Como o caminho do seu programa incluía aspas, ele foi interpretado como o título. Adicionar um título explícito (neste caso, vazio ""
) funciona.
Um método alternativo é usar a /d
opção para especificar o caminho. Especificamente:
start /b /d "c:\Program Files\Oracle\VirtualBox\" VBoxHeadless.exe -startvm "debian604 64"
Parece considerar o primeiro argumento após a /d
opção como o caminho, mesmo que esteja entre aspas, e se o próximo argumento não estiver entre aspas, isso funciona. Tudo depois do que é reconhecido como comando/programa é passado como parâmetro para esse comando/programa. Observe que isso não funcionará se o comando/programa tiver espaços no nome, por exemplo VBox Headless.exe
, , pois isso exigiria aspas e seria reconhecido como um título.
No geral, o primeiro método (título explícito) é provavelmente melhor. Foi uma má escolha de design por parte da Microsoft, eles realmente deveriam ter adicionado uma opção para o título em vez de "o primeiro argumento está entre aspas?".
Responder2
Na verdade, a resposta aceita ainda não é uma solução. Fechar a janela cmd onde o comando foi executado encerrará o processo vboxheadless com a máquina virtual em execução nele.
Usar a abordagem abaixo faráPowerShellexecutar um processo independente.
No cmd, execute:
cd "c:\Program Files\Oracle\VirtualBox"
vboxmanage list vms
Isso retornará algo como:
"Webserver LAP" {8748b594-7e2d-4d8d-8785-999940766754}
Agora pegue o UUID e execute o seguinte (ainda no cmd):
powershell start-process 'C:\program files\oracle\virtualbox\vboxheadless' '-s 8748b594-7e2d-4d8d-8785-999940766754' -WindowStyle Hidden
Graças ao autor deEste artigo.