gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:41:27 24 4
gpt4 key购买 nike

我正在尝试编写一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com