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



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

try {
docker push $dockerImage;
}catch{
#Send error details to Slack
}
  • 从PowerShell 7.3.x开始,对外部程序(如docker(调用从不导致语句终止错误[1],您可以使用try/catch捕获该错误;类似地,来自外部程序的stderr输出(正确地(被PowerShell视为错误输出,因此$ErrorActionPreference = 'Stop'对其没有影响(对于Windows PowerShell中的遗留异常,请参阅此答案(。

    • 然而,opt-in与PowerShell的错误处理的集成可能在未来实现;从v7.3开始,有一个名为PSNativeCommandErrorActionPreference的实验功能(可能会成为官方功能(:

      • 如果启用了此功能(Enable-ExperimentalFeature PSNativeCommandErrorActionPreference(并且相关的$PSNativeCommandErrorActionPreference首选项变量设置为$true,则任何报告非零退出代码的外部程序调用都会自动触发PowerShell错误作为响应(无需显式$LASTEXITCODE -ne 0检查(,然后与PowerShell自己的错误处理集成[2]
    • 通常,请注意,如果PowerShell甚至未能启动命令,则会出现终止PowerShell错误的语句(可以用try/catch捕获该错误(,例如当您提供不存在的可执行文件名或路径时;例如:

      try   { nosuchexe foo bar }
      catch { Write-Warning "Failed to invoke nosuchexe: $_" }
      
  • 自动$LASTEXITCODE变量反映最近执行的外部程序的进程退出代码。按照惯例,退出代码0表示成功,其他任何情况都是错误条件

因此:

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

另请参阅:

  • 此答案包含有关PowerShell中退出代码处理的详细信息

[1]唯一的例外是错误,该错误存在于Windows PowerShell中,并且历史上存在于PowerShell(Core(中,直到不再支持的v7.1.x版本,其中重定向stderr输出(2>*>(与$ErrorActionPreference = 'Stop'的组合意外导致脚本-如果存在实际stderr输出来,则终止错误-请参阅此答案

[2]不幸的是,从v7.3.0开始,自动触发的PowerShell错误是非终止错误,而不是语句终止请参阅GitHub问题#18368。

最新更新