【问题标题】:How To Get Exit Code From PowerShell Script如何从 PowerShell 脚本中获取退出代码
【发布时间】:2021-08-16 23:05:31
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:
  • 从 PowerShell 7.2 开始,对外部程序(例如 docker)的调用永远不会导致语句终止错误[1]您可以使用try / catch 进行捕获

    • 不过,opt-in 计划在未来与 PowerShell 的错误处理集成 - 请参阅 this RFC 和 discussion that preceded it。

    • 一般情况下,请注意,如果 PowerShell 无法执行以下操作,则会发生语句终止 PowerShell 错误(可以使用try / catch 捕获)确实 em>launch 一个命令,例如当您提供一个不存在的 可执行文件名或路径时;例如:

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

因此:

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

另见:

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

[1] 唯一的例外是 bug,出现在 PowerShell 7.1 之前,其中 重定向 stderr 输出的组合(2> 或 @987654337 @) 和 $ErrorActionPreference = 'Stop' 如果有实际的 stderr 输出,则会意外导致 脚本 终止错误 - 请参阅 this answer。

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多