PowerShell-пуск-процесс и коммутаторы Cmdline

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

$msbuild = "C:WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.exe" 
start-process $msbuild -wait

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

$msbuild = "C:WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.exe /v:q /nologo" 
start-process $msbuild -wait

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

когда у меня есть
C:WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.exe / v: q / nologo
в строке самостоятельно, как это обрабатывается в Powershell?

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

5 ответов


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

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

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

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

EDIT: кавычки.


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

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

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

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

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

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

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

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


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

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


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