PowerShell - Коммутаторы Start-Process и Cmdline - PullRequest
68 голосов
/ 16 марта 2009

Я могу запустить это нормально:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
start-process $msbuild -wait

Но когда я запускаю этот код (ниже), я получаю сообщение об ошибке:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo" 
start-process $msbuild -wait

Есть ли способ передать параметры в MSBuild с помощью start-process? Я открыт для того, чтобы не использовать start-process, единственная причина, по которой я его использовал, заключалась в том, что мне нужно было иметь команду в качестве переменной.

Когда у меня есть
C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / v: q / nologo
в отдельности, как это обрабатывается в Powershell?

Должен ли я использовать какую-то функцию eval () вместо этого?

Ответы [ 5 ]

110 голосов
/ 16 марта 2009

вы хотите разделить ваши аргументы на отдельный параметр

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
$arguments = "/v:q /nologo"
start-process $msbuild $arguments 
50 голосов
/ 16 марта 2009

Используя явные параметры, это будет:

$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe'
start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'

РЕДАКТИРОВАТЬ: цитаты.

6 голосов
/ 08 января 2013

Предупреждение

Если вы запускаете PowerShell из окна cmd.exe, созданного Powershell, второй экземпляр больше не ожидает выполнения заданий.

cmd>  PowerShell
PS> Start-Process cmd.exe -Wait 

Теперь из нового окна cmd снова запустите PowerShell и в нем запустите второе окно cmd: cmd2> PowerShell

PS> Start-Process cmd.exe -Wait
PS>   

Второй экземпляр PowerShell больше не учитывает запрос -Wait, и ВСЕ фоновые процессы / задания возвращают статус «Завершено», даже если они все еще работают!

Я обнаружил это, когда моя программа C # Explorer используется для открытия окна cmd.exe, и PS запускается из этого окна, он также игнорирует запрос -Wait. Похоже, что любой PowerShell, который является «заданием win32» cmd.exe, не может выполнить запрос ожидания.

Я столкнулся с этим с PowerShell версии 3.0 на Windows 7 / x64

5 голосов
/ 30 августа 2011

Я обнаружил, что использование cmd хорошо работает в качестве альтернативы, особенно когда вам нужно передать вывод вызываемого приложения (особенно если оно не имеет встроенной регистрации, в отличие от msbuild)

cmd /C "$msbuild $args" >> $outputfile

1 голос
/ 22 марта 2009

Если OP не использует PowerShell Community Extensions, который предоставляет командлет Start-Process вместе с кучей других. Если это так, то решение Glennular сработает, так как оно соответствует позиционным параметрам pscx \ start-process: -path (position 1) -arguments (positon 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...