
Мне нужно запустить программу (виртуальную машину) в фоновом режиме с помощью 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
в начале виртуальная машина работает нормально, но на переднем плане.
Есть ли какие-нибудь решения?
решение1
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
switch как путь, даже если он заключен в кавычки, и если следующий аргумент не заключен в кавычки, то это работает. Все, что после того, что распознается как команда/программа, передается как параметр этой команде/программе. Обратите внимание, что это не сработает, если в имени команды/программы есть пробелы, например VBox Headless.exe
, так как это потребовало бы кавычек и было бы распознано как заголовок.
В целом, первый метод (явный заголовок) вероятно лучше. Это был плохой выбор дизайна со стороны Microsoft, им действительно следовало добавить переключатель для заголовка, а не «заключен ли первый аргумент в кавычки?».
решение2
На самом деле принятый ответ все еще не является решением. Закрытие окна cmd, в котором была выполнена команда, убьет процесс vboxheadless с работающей виртуальной машиной в нем.
Использование подхода ниже сделает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
Спасибо авторуЭта статья.