我正在尝试编写一个 PowerShell 脚本,每当我们的构建系统无法将 Docker 映像推送到 Docker Hub 时,该脚本都会发送 Slack 通知。如何检测和处理
Process exited with code 1
命令中的 docker push
?我已尝试以下操作,但未调用 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 中的旧异常,请参阅 这个答案)。
但是,选择加入与PowerShell错误处理的集成可能会在未来实现;从 v7.3 开始,有一个名为 PSNativeCommandErrorActionPreference
的实验功能
(可能成为正式功能):
Enable-ExperimentalFeature PSNativeCommandErrorActionPreference
)并且关联的
$PSNativeCommandErrorActionPreference
首选项变量设置为
$true
,则任何报告非零退出代码自动的外部程序调用都会触发PowerShell 响应错误(无需显式
$LASTEXITCODE -ne 0
检查),然后与 PowerShell 自己的错误处理集成。[2]
启动命令,则确实会发生
,例如,当您提供“不存在”的可执行文件名称或路径时;例如:
try
自动catch
变量反映了最近执行的外部程序的try { nosuchexe foo bar }
catch { Write-Warning "Failed to invoke nosuchexe: $_" }
因此:
$LASTEXITCODE
另请参阅:
这个答案[1] 唯一的例外是
bug
,存在于0
docker push $dockerImage
if ($LASTEXITCODE -ne 0) {
#Send error details to Slack
}
)与 2>
会意外地导致 script 终止错误 - 请参阅这个答案。
有选择地捕获
*>
语句 - 请参阅