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

问题描述 投票:0回答:1

我正在尝试编写一个 PowerShell 脚本,每当我们的构建系统无法将 Docker 映像推送到 Docker Hub 时,该脚本都会发送 Slack 通知。如何检测和处理

Process exited with code 1
命令中的
docker push
?我已尝试以下操作,但未调用
catch
块。

try {
  docker push $dockerImage;
}catch{
  #Send error details to Slack
}
powershell error-handling try-catch exit-code
1个回答
4
投票
  • 从 PowerShell 7.3.x 开始,调用 外部程序(例如

    docker
    永远不会导致语句终止错误[1],您可以使用
    try
    /
    catch 捕获该错误
    ;同样,外部程序的 stderr 输出(正确地)被 PowerShell 视为错误输出,因此
    $ErrorActionPreference = 'Stop'
    对其没有影响(对于 Windows PowerShell 中的旧异常,请参阅 这个答案)。

    • 但是,选择加入与PowerShell错误处理的集成可能会在未来实现;从 v7.3 开始,有一个名为 PSNativeCommandErrorActionPreference实验功能

      可能成为正式功能):

        如果启用此功能 (
      • Enable-ExperimentalFeature PSNativeCommandErrorActionPreference
        ) 
        并且关联的$PSNativeCommandErrorActionPreference
        首选项变量
        设置为
        $true
        ,则任何报告
        非零退出代码自动的外部程序调用都会触发PowerShell 响应错误(无需显式 $LASTEXITCODE -ne 0
         检查),然后与 PowerShell 自己的错误处理集成。
        [2]
    • 一般来说,请注意,如果 PowerShell 甚至无法

      启动命令,则确实会发生

      ,例如,当您提供“不存在”的可执行文件名称或路径时;例如:
      try
      自动catch

      变量
      反映了最近执行的外部程序的
    • 进程退出代码
    。按照惯例,
  • 退出代码
  • try { nosuchexe foo bar } catch { Write-Warning "Failed to invoke nosuchexe: $_" }

    表示成功,其他任何情况都是错误情况

    
    因此:
    $LASTEXITCODE
    另请参阅:
    
    

    这个答案
  • 提供了有关 PowerShell 中退出代码处理的更多信息。

[1] 唯一的例外是 

bug

,存在于
    Windows PowerShell
  • 中,并且历史上出现在 PowerShell(核心)直至不再受支持的 v7.1.x 中,其中结合了 重定向 stderr 输出如果有实际的 stderr 输出,(
  • 0

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

)与 2> 会意外地导致 script 终止错误 - 请参阅这个答案


[2] 不幸的是,从 v7.3.0 开始,自动触发的 PowerShell 错误是一种“非终止”错误,而不是“语句终止”错误;后者更有意义,因为它允许它被 
有选择地 
捕获 *> 语句 - 请参阅
GitHub 问题 #18368。

© www.soinside.com 2019 - 2024. All rights reserved.