如何使用 powershell “解析” Azure 资源 ID 对象

Posted

技术标签:

【中文标题】如何使用 powershell “解析” Azure 资源 ID 对象【英文标题】:How to "parse" Azure resource id object with powershell 【发布时间】:2021-06-03 14:59:04 【问题描述】:

我目前正在尝试从 Azure 策略中提取数据以实现一些自动化:

(Get-AzPolicyState -Filter "ComplianceState eq 'NonCompliant'" | Where-Object $.PolicyDefinitionReferenceId -eq "应为虚拟机_1 启用天蓝色备份" | Where-Object $ .SubscriptionId -eq "0000").ResourceId

类型名称:System.String

示例输出

/subscriptions/00/resourcegroups/rg-test/providers/microsoft.compute/virtualmachines/vm-test

/subscriptions/00/resourcegroups/rg-test2/providers/microsoft.compute/virtualmachines/vm-test2

我对如何将资源组名称和虚拟机名称仅拉入变量数组感到困惑。 资源组名称始终以 /resourcegroups/ 开头,VM 名称始终以 /virtualmachines/ 开头。

任何指导将不胜感激。谢谢!

【问题讨论】:

$rg,$vm= '/subscriptions/00/resourcegroups/rg-test/providers/microsoft.compute/virtualmachines/vm-test' -replace '^.*/resourcegroups/([^/]+)/.*virtualmachines/([^/]+)','$1/$2' -split '/' 怎么样?您的问题解决了吗? 【参考方案1】:

如果您只想从resourceID 中提取您的虚拟机名称和组名,请尝试以下代码:

function parseGroupAndName
     param (
        [string]$resourceID
    )
    $array = $resourceID.Split('/') 
    $indexG = 0..($array.Length -1) | where $array[$_] -eq 'resourcegroups'
    $indexV = 0..($array.Length -1) | where $array[$_] -eq 'virtualmachines'
    $result = $array.get($indexG+1),$array.get($indexV+1)
    return $result


$resourceID = '/subscriptions/00/resourcegroups/rg-test/providers/microsoft.compute/virtualmachines/vm-test'

parseGroupAndName -resourceID $resourceID

结果:

【讨论】:

嘿斯坦利,谢谢!我仍然对如何将其扩展到 Get-AzPolicyState 的输出感到有些困惑,因为它会输出多个资源 ID 字符串。我会使用带有函数的 foreach 循环来实现这一点吗?非常感谢,请原谅我的问题,因为我是 powershell 的新手。 @EG92,是的,如果 Get-AzPolicyState 回复多个字符串,您可以使用 foreach 循环来执行此操作。如果您还有其他问题,请告诉我。如果我的帖子有帮助,请将其标记为答案,谢谢!

以上是关于如何使用 powershell “解析” Azure 资源 ID 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何解析csv文件,查找触发器并使用PowerShell拆分成新文件

如何在 C# 中解析 powershell 样式的命令行参数 [重复]

如何在powershell中解析json响应

exec:“powershell”:在 Terraform 中运行 local-exec 时在 $PATH 中找不到可执行文件

使用 powershell 将嵌套的复杂 XML 解析为 CSV

如何在 PowerShell 中引用 UWP 类