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

Como iniciar um programa com argumentos de linha de comando no Windows' cmd com o comando 'start'?

Preciso de iniciar um programa (máquina virtual) em segundo plano com um comando start na linha de comando do Windows’ 7. Normalmente faria isto assim:

start /b cmd yourprogram

Mas preciso de passar alguns argumentos e quando o faço assim (sem a bandeira /b para ver a informação de depuração):

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

recebo esta mensagem de erro:

Windows não consegue encontrar ‘-startvm’. Certifique-se de que digitou o nome correctamente e depois tente novamente.

Por outro lado, quando o faço na janela da linha de comandos actual sem o start no início a máquina virtual funciona normalmente - mas em primeiro plano.

Alguma solução?

Respostas (2)

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

Se 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.

Espera um title entre aspas ("). Uma vez que o caminho do seu programa incluiu aspas, foi interpretado como o título. A adição de um título explícito (neste caso, vazio, "") funciona.


Um método alternativo é usar o /d switch para especificar o caminho. Especificamente:

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

Parece que o primeiro argumento após o comutador /d é o caminho, mesmo que seja citado, e se o argumento seguinte não for citado, então este funciona. Tudo depois do que é reconhecido como o comando/programa é passado como um parâmetro para esse comando/programa. Note que isto não funcionará se o comando/programa tiver espaços no nome, e.g. VBox Headless.exe, uma vez que isso exigiria citações e seria reconhecido como um título.


Globalmente, o primeiro método (título explícito) é provavelmente melhor. Foi uma má escolha de design por parte da Microsoft, deveriam realmente ter acrescentado uma mudança para título em vez de “é o primeiro argumento incluído nas citações?

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

Na verdade, a resposta aceite ainda não é uma solução. Fechando a janela cmd onde o comando foi executado matará o processo vboxheadless com a máquina virtual em execução.

Usando a abordagem abaixo fará com que o PowerShell execute um processo independente.

Em cmd, execute:

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

Isto irá retornar algo como:

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

Agora pegue o UUID e execute o seguinte (ainda em cmd):

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

Graças ao autor de este artigo .