Это потому, что Start-Process
немедленно возвращается.Используйте параметр -Wait
.
Start-Process -FilePath 'c:\Temp\test.bat' -NoNewWindow -Wait -PassThru
microsoft :
-PassThru
Возвращает объект процесса для каждого процесса, которыйКомандлет запущен.По умолчанию этот командлет не создает никаких выходных данных.
-Wait Указывает, что этот командлет ожидает завершения указанного процесса и его потомков, прежде чем принимать дополнительные входные данные.Этот параметр подавляет командную строку или сохраняет окно до завершения процессов.
-PassThru
возвращает вам объект процесса, где вы можете проверить параметр ExitCode
:
$p = Start-Process -FilePath your_command -ArgumentList "arg1", "arg" -NoNewWindow -Wait -PassThru
if ($p.ExitCode -ne 0) {
throw "Failed to clone $buildItemName from $buildItemUrl to $($tmpDirectory.FullName)"
}
В качестве альтернативы Start-Process
вы также можете использовать Invoke-Expression
, который вернет вам стандартный вывод консоли.
Чтобы проверить, успешно ли Invoke-Expression
вы можете использовать:
$output = Invoke-Expression $command
if ((-not $?) -or ($LASTEXITCODE -ne 0)) {
throw "invoke-expression failed for command $command. Command output: $output"
}