PowerShell - Коммутаторы Start-Process и Cmdline
Я могу запустить это нормально:
$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() вместо этого?
6 ответов
Вы хотите разделить ваши аргументы на отдельный параметр
$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'
РЕДАКТИРОВАТЬ: цитаты.
Предупреждение
Если вы запускаете PowerShell из окна cmd.exe, созданного Powershell, 2-й экземпляр больше не ожидает выполнения заданий.
cmd> PowerShell
PS> Start-Process cmd.exe -Wait
Теперь из нового окна cmd снова запустите PowerShell и в нем запустите второе окно cmd2: 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).
Если вы хотите, чтобы он ждал, добавьте флаг -wait в операторы запуска процессов.
# Start EXE as a detected process
function StartExe {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true, Position=0)]
[string]$ProcessName,
[Parameter(Mandatory=$false, Position=1, ValueFromRemainingArguments=$true)]
[string[]]$Arguments
)
# Command line as Multiple Arguments:
# PS> StartExe tclsh myscript.tcl arg1 arg2 arg3
if ($Arguments) {
$argumentString = $Arguments -join ' '
Start-Process -FilePath $ProcessName -ArgumentList $argumentString -NoNewWindow
}
# Command line as a Single Argument:
# PS> StartExe "tclsh myscript.tcl arg1 arg2 arg3"
else {
Start-Process -FilePath 'cmd.exe' -ArgumentList "/c $ProcessName" -NoNewWindow
}
}