如何修改PowerShell代码让Get-AzPolicyState返回策略显示名称而非GUID
解决方案
要获取策略的显示名称而非GUID,需要通过Get-AzPolicyDefinition查询策略定义的元数据,将策略ID(即原代码中的PolicyDefinitionName)映射为友好的显示名称。推荐预先缓存所有策略定义的映射关系,避免重复调用API影响效率。
修改后的完整代码:
$subscriptionId = 'abc' # 预先获取当前订阅内所有策略定义,建立ID到显示名称的映射哈希表 $policyDefinitions = Get-AzPolicyDefinition -SubscriptionId $subscriptionId $policyNameMap = @{} foreach ($policy in $policyDefinitions) { $policyNameMap[$policy.Name] = $policy.Properties.DisplayName } # 获取非合规策略状态 $nonCompliantPolicies = Get-AzPolicyState -SubscriptionId $subscriptionId # 生成包含策略显示名称的自定义对象 $customObjects = $nonCompliantPolicies | ForEach-Object { # 从映射表中获取显示名称,若找不到则保留原ID作为 fallback $displayName = $policyNameMap[$_.PolicyDefinitionName] ?? $_.PolicyDefinitionName [PSCustomObject]@{ PolicyName = $displayName ComplianceState = $_.ComplianceState ResourceType = $_.ResourceType ResourceGroup = $_.ResourceGroup SubscriptionId = $_.SubscriptionId # 修正原代码中的空格问题 IsCompliant = $_.IsCompliant PolicyAssignmentScope = $_.PolicyAssignmentScope } } # 输出结果 $customObjects | Format-Table -AutoSize
关键说明
- 映射哈希表:通过
Get-AzPolicyDefinition一次性拉取所有策略定义,构建ID -> DisplayName的映射,后续循环直接查表,大幅减少API调用次数。 - Fallback处理:使用
??空合并运算符,确保如果策略定义未找到(比如内置策略或跨订阅策略),仍能显示原ID,避免字段为空。 - 修正语法问题:原代码中
$_. subscriptionId存在多余空格,已修正为$_.SubscriptionId,避免运行报错。
内容的提问来源于stack exchange,提问作者Meghana
相关产品推荐
相关产品推荐

