Для синхронного выполнения консольных приложений, включая командные файлы, вызывайте их напрямую , делайте не используйте Start-Process
- см. этот ответ .
Поэтому:
Write-Host "About to run filename.cmd"
# For security reasons, PowerShell requires that you explicitly
# signal the intent to run an executable located *in the current directory*,
# hence the need for `./` (or `.\`)
# Only direct invocation of external programs (batch files) sets
# the automatic $LASTEXITCODE variable.
./filename.cmd
Write-Host "LASTEXITCODE: [$LASTEXITCODE]
Что касается того, что вы пытались :
Start-Process
выходы по умолчанию - кроме случаев, когда вы передадите переключатель -PassThru
, в этом случае возвращается экземпляр System.Diagnostics.Process
, представляющий вновь запущенный процесс.
Предполагается, что вы Также указано -Wait
, так как в вашем случае вы можете получить доступ к свойству .ExitCode
возвращаемого объекта, чтобы сразу определить код выхода.
Обратите внимание, что automati c переменная $LASTEXITCODE
устанавливается только после прямого вызова внешних программ, как показано выше.
Поэтому, если бы вы использовали Start-Process
- то есть не необходимо в этом случае, как описано выше - вам придется использовать следующее:
Write-Host "About to run filename.cmd"
$proc = Start-Process -PassThru -FilePath filename.cmd -NoNewWindow -Wait
Write-Host "proc: [$proc]"
Write-Host "exit coe: [$($proc.ExitCode)]