You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:02:09