Я могу запустить это нормально:
$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 ()?
command-line
powershell
start-process
BuddyJoe
источник
источник
Ответы:
вы захотите разделить свои аргументы в отдельный параметр
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" $arguments = "/v:q /nologo" start-process $msbuild $arguments
источник
$args
поскольку имя переменной не работает, оно зарезервировано.$arguments
Вместо этого используйте или что-нибудь еще-ArgumentList
ищет строку, поэтому пример другого ответа со строками, разделенными запятыми (технически массив), может работать из-за того, как PowerShell потенциально разворачивает его, но если вы желая передать список аргументов из массива, вероятно, лучше заранее «распаковать» его в строку.get-help start-process
указывает, что -ArgumentList ожидаетString[]
Используя явные параметры, это будет:
$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe' start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'
РЕДАКТИРОВАТЬ: цитаты.
источник
-ArgumentList ('/v:q','/nologo')
git gui &
- как это просто (* nix конечно)! По сравнению сstart-Process git -ArgumentList gui
. Знаю, знаю, бесполезно. В последнее время я немного поигрался с Powershell и сделал много приятных вещей; но многословие убийца!sajb { git gui }
Предупреждение
Если вы запускаете 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
источник
Я обнаружил, что использование cmd хорошо работает как альтернатива, особенно когда вам нужно передать вывод из вызываемого приложения (особенно, когда оно не имеет встроенного журнала, в отличие от msbuild)
cmd /C "$msbuild $args" >> $outputfile
источник
Если только OP не использует PowerShell Community Extensions, которые предоставляют командлет Start-Process вместе с множеством других. Если это так, то решение Glennular работает отлично, поскольку оно соответствует позиционным параметрам pscx \ start-process: -path (position 1) -arguments (positon 2).
источник