如何在JMESPath查询表达式中集成PowerShell变量$zone.Name?
问题
我编写了如下PowerShell代码,试图获取指定资源组下所有私有DNS区域的A记录集,并给每条记录添加上所属的区域名称:
# Extract zones $Zones = az network private-dns zone list -g "rg-test-westeurope" --query '[].{Name: name}' --output json | ConvertFrom-Json # Initialize an empty array to store record sets $RecordSets = @() # Iterate over each zone foreach ($zone in $Zones) { $zone.Name # List record sets for the current zone and append to the array $RecordSets += az network private-dns record-set a list -g "rg-test-westeurope" -z $zone.Name --query '[].{Zone:$zone.Name, IPv4: aRecords[0].ipv4Address, Name: name}' --output json | ConvertFrom-Json }
但其中Zone:$zone.Name部分无法正常工作,请问如何将$zone.Name集成到查询中,以实现如下结果:
# Convert the array of record sets into a table $RecordSets | Format-Table -Property Zone, IPv4, Name
解决方案
问题出在Azure CLI的--query参数使用的是JMESPath语法,PowerShell变量$zone.Name无法直接在JMESPath表达式中被解析。你可以通过两种方式解决:
方法1:PowerShell字符串插值注入变量
用双引号包裹--query的查询字符串,让PowerShell先解析$zone.Name的值,再传递给Azure CLI:
# Extract zones $Zones = az network private-dns zone list -g "rg-test-westeurope" --query '[].{Name: name}' --output json | ConvertFrom-Json # Initialize an empty array to store record sets $RecordSets = @() # Iterate over each zone foreach ($zone in $Zones) { # 用字符串插值把$zone.Name注入到JMESPath查询中 $query = "[].{Zone:'$($zone.Name)', IPv4: aRecords[0].ipv4Address, Name: name}" $RecordSets += az network private-dns record-set a list -g "rg-test-westeurope" -z $zone.Name --query $query --output json | ConvertFrom-Json } # 输出表格 $RecordSets | Format-Table -Property Zone, IPv4, Name
这里用'$($zone.Name)'把变量值用单引号包裹,确保JMESPath将其识别为字符串常量。
方法2:获取记录后添加Zone属性
如果不想修改JMESPath查询,可以先获取记录集,再通过Add-Member给每个对象手动添加Zone属性:
# Extract zones $Zones = az network private-dns zone list -g "rg-test-westeurope" --query '[].{Name: name}' --output json | ConvertFrom-Json # Initialize an empty array to store record sets $RecordSets = @() # Iterate over each zone foreach ($zone in $Zones) { # 获取当前区域的记录集 $zoneRecords = az network private-dns record-set a list -g "rg-test-westeurope" -z $zone.Name --query '[].{IPv4: aRecords[0].ipv4Address, Name: name}' --output json | ConvertFrom-Json # 给每条记录添加Zone属性 $zoneRecords | ForEach-Object { $_ | Add-Member -MemberType NoteProperty -Name Zone -Value $zone.Name $RecordSets += $_ } } # 输出表格 $RecordSets | Format-Table -Property Zone, IPv4, Name
内容的提问来源于stack exchange,提问作者Kaja
相关产品推荐
相关产品推荐

