我正在尝试编写一个 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 开始,有一个名为
PSNativeCommandErrorActionPreference
的 experimental 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/