Использование Powershell Start-Process для запуска Cmd Batch-файла, как прочитать уровень ошибки из Cmd Batch-файла? - PullRequest
1 голос
/ 27 марта 2020

Предположим, у меня есть два файла, script.ps1 и filename.cmd, и я запускаю .\script.ps1 из приглашения Powershell:

script.ps1

Write-Host "About to run filename.cmd"
$proc = Start-Process -FilePath filename.cmd -NoNewWindow -Wait
Write-Host "proc: [$proc]"
Write-Host "LASTEXITCODE: [$LASTEXITCODE]

filename.cmd

@echo off
ECHO File returns ErrorLevel=1
exit /b 1

Выход:

About to run filename.cmd
proc: []
LASTEXITCODE: []

И proc, и LASTEXITCODE равны $null. Насколько я понимаю, я каким-то образом смог получить доступ к ErrorCode?

Как прочитать уровень ошибки (в данном случае 1) в моем скрипте Powershell?

1 Ответ

1 голос
/ 27 марта 2020

Для синхронного выполнения консольных приложений, включая командные файлы, вызывайте их напрямую , делайте не используйте 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)]
...