【问题标题】:PowerShell and process exit codesPowerShell 和进程退出代码
【发布时间】:2019-12-19 11:11:10
【问题描述】:
这个自我回答的问题试图解决在 PowerShell 中处理 process exit codes 的两个不同方面:
在 PowerShell 代码中,如何查询外部进程设置的退出代码(对外部程序的调用),这些退出代码如何与 PowerShell 的错误处理集成?
当其他人通过其 CLI、pwsh(PowerShell 核心)/powershell.exe(Windows PowerShell)调用 PowerShell 时,决定 PowerShell 进程的退出代码的因素将成功与失败传达给调用进程(例如,它可以是构建 / CI / 自动化服务器任务、计划任务或不同的 shell)。
【问题讨论】:
标签:
powershell
error-handling
exit-code
【解决方案1】:
当前为 PowerShell [Core] 7.2.1
PowerShell-内部使用退出代码:
PowerShell-内部,本地 PowerShell 命令通常在进程内运行,从运行的子进程退出代码>外部程序发挥的作用非常有限:
当 PowerShell 从外部调用 时,如何控制 PowerShell 报告为 its 退出代码的内容:
设置一个退出代码,至少传达成功(0)与失败(通常为非零)是让外部调用者的重要机制了解您的 PowerShell 代码是否总体成功,例如从计划任务或通过 PowerShell CLI(命令行界面)从 Jenkins 等自动化服务器调用时 - @ 987654331@ 用于 PowerShell [Core] 与 powershell.exe 用于 Windows PowerShell。
CLI 提供了两种执行 PowerShell 代码的方式,您可以使用exit <n> 设置退出代码,其中<n> 是所需的退出代码:
如果您的代码是从通过退出代码检查成功的工具调用的,请确保所有代码路径都明确使用exit <n> 来终止。
警告:如果 PowerShell 进程由于 未处理的脚本终止错误而终止 - 无论 CLI 是使用 -File 还是 -Command 调用的 - 退出代码始终为1。
-
脚本终止(致命)错误是通过使用 throw 语句从 PowerShell 代码生成的,或者通过使用
-ErrorAction Stop 或 $ErrorActionPreference = 'Stop' 升级不太严重的本机 PowerShell 错误,或者通过按 Ctrl-C 强制终止脚本。
-
如果退出代码1 不够具体(通常是,因为通常只需要传达成功与失败),您可以将您的代码包装在try / catch 语句中,并使用catch 块中的exit <n>。
PowerShell 如何设置其进程退出代码的确切规则很复杂;在下面找到摘要。
PowerShell 如何设置其进程退出代码:
PowerShell 7.0 的不一致和缺陷: