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

如何在PowerShell中识别存在多个诊断设置的Azure资源

解决Azure资源多诊断设置筛选问题

问题分析

你之前的错误核心在于两点:

  • 逻辑判断错误:($_.Name -gt 1)是用诊断设置的字符串名称和数字1比较,PowerShell会将无法转换为数字的字符串默认判定为大于1,导致所有诊断设置都被保留。
  • 逻辑方向错误:你在筛选诊断设置条目,但需求是筛选拥有多个诊断设置的资源,需要先统计每个资源的诊断设置总数,再判断总数是否大于1。

修正后的脚本

以下脚本会遍历订阅内资源,找出拥有多个诊断设置的资源(每个资源仅保留一条记录):

# 获取订阅中所有资源(可按需添加资源类型筛选,比如 -ResourceType 'Microsoft.Compute/virtualMachines')
$allResources = Get-AzResource

# 初始化结果集合
$resourcesWithMultipleDiags = @()

foreach ($resource in $allResources) {
    # 获取当前资源的所有诊断设置(忽略无权限/无设置的资源)
    $diagSettings = Get-AzDiagnosticSetting -ResourceId $resource.ResourceId -ErrorAction SilentlyContinue

    # 诊断设置数量大于1时,记录资源信息
    if ($diagSettings.Count -gt 1) {
        $resourcesWithMultipleDiags += [PSCustomObject]@{
            ResourceId       = $resource.ResourceId
            ResourceName     = $resource.Name
            ResourceType     = $resource.ResourceType
            DiagSettingCount = $diagSettings.Count
        }
    }
}

# 输出结果(可按需转成CSV等格式)
$resourcesWithMultipleDiags | Format-Table -AutoSize

可选:排除特定名称的诊断设置

如果你需要排除setbypolicy、setbypolicy_logAnalytics这类特定设置,再统计剩余设置数量是否大于1,修改获取诊断设置的代码即可:

$diagSettings = Get-AzDiagnosticSetting -ResourceId $resource.ResourceId -ErrorAction SilentlyContinue |
    Where-Object { $_.Name -notin @('setbypolicy', 'setbypolicy_logAnalytics') }

内容的提问来源于stack exchange,提问作者Meehan86

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:22:17