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

Как запустить программу с аргументами командной строки в Windows' командой 'start'?

Мне нужно запустить программу (виртуальную машину) в фоновом режиме с командой 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)

40
40
40
2012-04-18 15:39:49 +0000
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
3
3
2013-10-23 11:32:21 +0000

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

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

В команде выполните:

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

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

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

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

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

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

Похожие вопросы

3
19
10
28
3