powershell - 如何从 PowerShell 脚本中获取退出代码

标签 powershell error-handling try-catch exit-code

我正在尝试编写一个 PowerShell 脚本,每当我们的构建系统无法将 Docker 镜像推送到 Docker Hub 时,它就会发送一个 Slack 通知。如何检测和处理 docker push 命令中的 Process exited with code 1?我尝试了以下方法,但未调用 catch block 。

try {
  docker push $dockerImage;
}catch{
  #Send error details to Slack
}

最佳答案

  • 从 PowerShell 7.3 开始,调用外部程序(例如 docker)从不导致语句终止error[1] 你可以用 try / catch 陷阱;同样,来自外部程序的stderr 输出(正确地)被PowerShell 视为错误输出,因此$ErrorActionPreference = 'Stop' 对其没有影响(对于 Windows PowerShell 中的遗留异常,请参阅 this answer)。

    • 但是,选择加入与 PowerShell 错误处理的集成可能在未来实现;从 v7.3 开始,有一个名为 PSNativeCommandErrorActionPreferenceexperimental feature(可能成为官方功能):

      • 如果此功能已启用(Enable-ExperimentalFeature PSNativeCommandErrorActionPreference)并且关联的 $PSNativeCommandErrorActionPreference preference variable 设置为 $true,任何外部程序调用报告非零退出代码自动触发PowerShell响应错误(避免显式$LASTEXITCODE -ne 0 检查),然后与 PowerShell 自身的错误处理集成。[2]
    • 一般来说,请注意语句终止的 PowerShell 错误(可以try/catch 捕获) 确实如果 PowerShell 甚至无法启动一个命令,例如当您提供一个不存在的 可执行文件名称或路径;例如:

      try   { nosuchexe foo bar }
      catch { Write-Warning "Failed to invoke nosuchexe: $_" }
      
  • automatic $LASTEXITCODE variable 反射(reflect)了最近执行的外部程序的进程退出代码。按照惯例,退出代码 0 表示成功,其他任何情况都是错误情况

因此:

docker push $dockerImage
if ($LASTEXITCODE -ne 0) {
  #Send error details to Slack
}

另见:

  • This answer 包含有关 PowerShell 中退出代码处理的更多信息。

[1] 唯一的异常(exception)是一个 错误,出现在 PowerShell 7.1 之前,其中重定向 stderr 输出 (2>*>) 与 $ErrorActionPreference = 'Stop' 意外导致 script - 如果有实际的 stderr 输出 - 参见 this answer .

[2] 不幸的是,从 v7.3.0 开始,自动触发的 PowerShell 错误是一个非终止错误,而不是一个语句终止错误;后者会更有意义,因为它可以有选择地try 语句捕获它 - 请参阅 GitHub issue #18368

关于powershell - 如何从 PowerShell 脚本中获取退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67743279/

相关文章:

go - 如何检测自定义错误

error-handling - 用户输入为空时应该抛出什么异常?

powershell - 在PowerShell中获取文件的完整路径

.net - 哪些版本的 Microsoft.NET 框架适用于 Windows Powershell?

xml - 使用 PowerShell 解析带有命名空间的 XML

c# - TopShelf 服务在异常时卡在 'Stopping' 状态

java - Spring RestTemplate - 错误处理

c# - 有没有办法知道 finally 是在 try 还是 catch 之后执行的?

node.js - Node : never use try-catch?

powershell - Powershell,检索用户管理器