如何从通过从 CMD 调用的 PowerShell Start-Process 启动的进程中获取 ErrorLevel?

How do I get the ErrorLevel from a process started via PowerShell Start-Process called from CMD?

我希望能够从此示例命令中获得 Process.exe 的错误级别:

C:\>PowerShell -NoP -C "Start-Process "C:\Process.exe""

如果 Process.exe 以 5 的 ErrorLevel 退出,我希望能够通过 CMD 捕获它,最好是在 %ErrorLevel% 变量中。我对 PowerShell 不够熟练,无法执行此操作。

使用以下内容,假设 C:\process.exe 是一个 console 应用程序:[1]

PowerShell -NoP -C "C:\Process.exe; exit $LASTEXITCODE"

注意:如果可执行路径包含空格,请用'...'括起来;如果它包含 ' 本身,要么转义封闭的 ' 字符。作为 '',或将路径括在 \"...\"(原文如此)中 - 请参阅 了解更多信息。

为了获得进程的退出代码,您必须等待它终止。

Start-Process 默认情况下 不会 等待终止,除非你添加 -Wait 开关 - 但是你还需要 -PassThru 为了 return 一个 process-information 对象,其 .ExitCode 属性 您需要通过 exit.

报告

直接执行目标可执行文件,如上图,(a)导致同步执行console applications[1] 开始并且 (b) 自动反映 automatic $LASTEXITCODE variable 变量中的进程退出代码。

如果没有 exit $LASTEXITCODE 语句,进程的退出代码将映射到 抽象的 退出代码:0(成功)将被报告 as-is,但 任何非零 退出代码将映射到 1 - 有关详细信息,请参阅

无论如何,PowerShellpowershell.exe的)退出代码将反映在cmd.exe的动态%ErrorLevel%变量中。


[1] 如果您的应用程序恰好是 GUI 子系统应用程序,您确实需要基于 Start-Process 的解决方案;正如您自己在评论中指出的那样,解决方案是:
PowerShell -NoP -C "exit (Start-Process 'C:\Process.exe' -Wait -PassThru).ExitCode"