调用az network vnet peering show时如何屏蔽AZ CLI错误?
解决PowerShell中az cli命令NotFound错误的静默处理问题
核心问题原因
ErrorActionPreference仅对PowerShell原生命令的错误生效,az cli属于外部命令,它的错误会直接输出到标准错误流(stderr)。而你开启了failOnStandardError: true,只要stderr有内容流水线就会判定失败,所以普通的try/catch和ErrorActionPreference无法屏蔽这类错误。
具体解决方法
方法1:直接重定向stderr到null
把az命令的标准错误流直接丢弃,既不会显示错误信息,也不会触发流水线的失败判定:
$peering = az network vnet peering show -g xxx -n enter-wrong-peering --vnet-name vnet_name --query "name" --output tsv 2>$null
2>$null是PowerShell中丢弃stderr(文件描述符2)输出的写法,这样az的错误信息不会流入stderr,流水线就不会触发失败逻辑。
方法2:结合退出码做后续处理
如果需要根据对等连接是否存在执行不同逻辑,可以捕获az命令的退出码:
$peering = az network vnet peering show -g xxx -n enter-wrong-peering --vnet-name vnet_name --query "name" --output tsv 2>$null if ($LASTEXITCODE -eq 0) { # 对等连接存在时的处理逻辑 Write-Host "对等连接存在:$peering" } else { # 对等连接不存在时的处理逻辑 Write-Host "对等连接不存在" }
az cli执行成功时退出码为0,失败(如NotFound)时退出码非0,通过$LASTEXITCODE可以获取外部命令的执行状态,配合stderr重定向就能实现静默处理同时完成后续业务逻辑。
注意事项
- 不要试图用PowerShell的try/catch捕获外部命令的错误,外部命令的错误不会触发PowerShell异常(除非额外配置
$ErrorActionPreference = 'Stop'并结合2>&1转流,没必要复杂化)。 - 保留流水线的
failOnStandardError: true即可,它能正常捕获Bicep本身的执行错误,仅针对这类特定az命令做stderr重定向就够了。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

