检查AZ CLI输出判断VNet对等连接存在性及获取name字段问题
解决VNet对等连接存在性判断及获取name字段的问题
问题分析
原代码的判断逻辑存在缺陷:当AZ CLI未找到指定的VNet对等连接时,会输出错误信息而非预期的JSON对象,此时$existing_peering会包含错误文本,if ($existing_peering)会误判为“存在”(非空字符串在PowerShell中会被视为True)。同时需要正确提取返回结果中的name字段值。
修正后的代码示例
# 执行AZ CLI命令,同时捕获标准输出和错误输出 $existing_peering_json = az network vnet peering show -g 'xx' -n 'ccc' --vnet-name 'ccc' 2>&1 # 通过AZ CLI的退出码判断命令是否执行成功(成功时退出码为0) if ($LASTEXITCODE -eq 0) { # 将JSON字符串转换为PowerShell对象 $existing_peering = $existing_peering_json | ConvertFrom-Json # 直接提取name字段值 $peering_name = $existing_peering.name Write-Output "Peering exists, name: $peering_name" } else { # 命令执行失败,说明对等连接不存在或出现其他错误 Write-Output "Peering does not exist or error occurred: $existing_peering_json" }
关键说明
- 捕获错误输出:使用
2>&1将AZ CLI的错误输出(stderr)重定向到标准输出(stdout),确保错误信息能被捕获到变量中。 - 依赖退出码判断:AZ CLI执行成功时
$LASTEXITCODE为0,失败时为非0,这是判断对等连接是否存在的可靠依据,避免错误文本干扰判断。 - JSON对象转换:将成功返回的JSON字符串转为PowerShell对象后,可直接通过
.运算符访问属性(如.name)提取字段值。 - 错误分支处理:失败分支可根据需求调整,比如仅判断“不存在”场景,可进一步匹配错误信息中的“not found”关键字。
简化写法(直接查询存在性)
如果仅需判断存在性并获取name,也可以通过列表查询过滤实现:
# 过滤指定名称的对等连接,返回name字段(无结果则为空) $peering_name = az network vnet peering list -g 'xx' --vnet-name 'ccc' --query "[?name=='ccc'].name | [0]" -o tsv if ($peering_name) { Write-Output "Peering exists, name: $peering_name" } else { Write-Output "Peering does not exist" }
这种方式通过--query直接过滤目标对等连接,返回结果为空则表示不存在,同时直接提取name字段值。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

