如何通过Azure CLI根据资源组名称获取资源组ID?
问题:通过Azure CLI根据资源组名称获取资源组ID失败
尝试用Azure CLI从$exemption对象的ResourceGroupName字段获取对应资源组ID,以下两段代码均未成功:
$scopeId = (az group list --query $exemption.ResourceGroupName).Id
以及:
$scopeId = (az group list --query "[?name==$exemption.ResourceGroupName]").Id
$exemption的JSON结构(部分字段已处理):
[ { "scope": "Resource Group", "scopeName": "", "scopeNameFull": "/providers/Microsoft.Management/managementgroups/", "exemptionCategory": "Waiver", "name": "", "description": "My Exemption description", "expiresOn": null, "ResourceName": null, "ResourceGroupName": "rg", "subscriptionId": "123", "policyDefinitionReferenceIds": [ "policy1", "policy2"] } ]
解决方案
错误原因分析
- 第一段代码的
--query参数直接传入资源组名称,不符合JMESPath查询语法,az group list返回的是资源组数组,直接传字符串会导致语法错误。 - 第二段代码存在两处问题:JMESPath字符串比较未用引号包裹目标值,且PowerShell环境下变量插值需要处理引号冲突;另外Azure CLI返回的资源组ID字段是小写
id,而非代码中的大写Id,同时查询结果是数组,需提取具体元素后再获取字段值。
正确实现方式
方式1:用az group show直接查询(推荐,效率更高)
不需要列出所有资源组,直接指定名称查询:
$rgName = $exemption.ResourceGroupName $scopeId = az group show --name $rgName --query "id" --output tsv
--output tsv会直接返回纯字符串格式的资源组ID,无需额外处理。
方式2:修正az group list的查询语法
如果必须用az group list,按以下方式修正:
$rgName = $exemption.ResourceGroupName $scopeId = (az group list --query "[?name=='$rgName'].id[]" --output json | ConvertFrom-Json)[0]
- JMESPath查询中用单引号包裹变量值,避免PowerShell引号冲突
.id[]提取所有匹配资源组的id字段形成数组- 通过
ConvertFrom-Json转成PowerShell对象后取第一个元素
内容的提问来源于stack exchange,提问作者Raymondo
相关产品推荐
相关产品推荐

