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