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

33

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

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

Patryk
источник

Ответы:

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, им действительно следовало добавить переключатель заголовка, а не «первый аргумент заключен в кавычки?».

боб
источник
Большое спасибо за это :) Хотя, как я знаю start /b, не ставьте виртуальную машину в фоновом режиме. Я должен придумать что-то еще тогда.
Патрик
Если вы просто хотите подавить output ( stdout), добавьте a >nulв конец. Используйте >nul 2>nulв конце для подавления как нормального вывода, так и вывода ошибки ( stderr). Однако окно командной строки должно оставаться открытым.
Боб
1
@Patryk Если вы не возражаете против использования PowerShell, эта команда откроет процесс без окон, который не подключен к процессу порождения (powershell.exe). Поэтому окно PowerShell может быть закрыто, и VBoxHeadless продолжит работу. PowerShell поставляется с Windows 7.Start-Process -FilePath 'C:\Program Files\Oracle\VirtualBox\VBoxHeadless.exe' -ArgumentList '-startvm "debian604 64"' -WindowStyle Hidden
Боб,
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

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

Чарли Вийяр
источник
В своем комментарии к моему собственному ответу я уже предоставил альтернативный метод для «запуска VBox без головы». Мой ответ сам по себе решает вопрос «передачи аргументов с помощью start».
Боб
ВОТ ЭТО ДА! cdСОХРАНИЛ МОИ ЧАСЫ!
Т.Тодуа