31

Мне нужно запустить программу (виртуальную машину) в фоновом режиме с помощью команды start в командной строке Windows 7. Обычно вы делаете это так:

start /b cmd yourprogram

Но мне нужно передать некоторые аргументы, и когда мне это так нравится (без флага /b чтобы увидеть отладочную информацию):

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

Я получаю это сообщение об ошибке:

Windows не может найти '-startvm'. Убедитесь, что вы правильно ввели имя, а затем повторите попытку.

С другой стороны, когда я делаю это в текущем окне командной строки без start в начале, виртуальная машина работает нормально - но на переднем плане.

Какие-либо решения?

2 ответа2

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

Если вы читаете список параметров с помощью 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.

Ожидается title заключенный в кавычки ("). Поскольку путь к вашей программе включает в себя кавычки, он интерпретируется как заголовок. Добавление явного заголовка (в данном случае пустого "") работает.


Альтернативный метод - использовать ключ /d для указания пути. В частности:

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

Кажется, он принимает первый аргумент после параметра /d в качестве пути, даже если он указан в кавычках, и если следующий аргумент не указан в кавычках, это работает. Все, что распознано как команда / программа, передается в качестве параметра этой команде / программе. Обратите внимание, что это не будет работать, если в команде / программе есть пробелы в имени, например, VBox Headless.exe , поскольку для этого потребуются кавычки и они будут распознаваться как заголовок.


В целом, первый (явное название) метод, вероятно, лучше. Это был неудачный выбор дизайна со стороны Microsoft, они действительно должны были добавить переключатель для заголовка, а не «первый аргумент заключен в кавычки?».

3

На самом деле принятый ответ все еще не является решением. Закрытие окна cmd, в котором была выполнена команда, приведет к завершению процесса без vboxhead с запущенной виртуальной машиной.

Использование подхода, приведенного ниже, сделает PowerShell независимым процессом.

В cmd запустите:

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

Это вернет что-то вроде:

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

Теперь возьмите UUID и выполните следующее (все еще в cmd):

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

Спасибо автору этой статьи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .