You need to enable JavaScript to run this app. 求可查询30/60天未使用Azure资源的PowerShell脚本
优惠活动
大模型
产品
解决方案
定价
更多

求可查询30/60天未使用Azure资源的PowerShell脚本

Azure 闲置资源查询PowerShell脚本

前置依赖

执行前需先安装Azure Az PowerShell模块并完成身份验证:

  • 安装模块命令:Install-Module -Name Az -AllowClobber -Scope CurrentUser
  • 登录Azure命令:Connect-AzAccount
  • 如需指定订阅执行:Set-AzContext -SubscriptionId "你的订阅ID"

脚本功能说明

可自定义查询30天/60天未使用的Azure资源,默认覆盖资源类型包括虚拟机、应用服务、服务总线、Blob存储、未挂载磁盘,可根据需求扩展其他资源类型。

完整脚本

# 配置闲置天数,如需查询60天未使用资源修改为60即可
$idleDays = 30
$startTime = (Get-Date).AddDays(-$idleDays).ToUniversalTime()
$outputPath = ".\Azure_Idle_Resources_$(Get-Date -Format 'yyyyMMdd').csv"
$idleResources = @()

# 1. 查询闲置虚拟机(已停止且近$idleDays无启动操作)
Write-Host "正在查询闲置虚拟机..."
$vms = Get-AzVM -Status
foreach ($vm in $vms) {
    if ($vm.PowerState -eq "VM deallocated") {
        $startLogs = Get-AzLog -ResourceId $vm.Id -StartTime $startTime | Where-Object {$_.OperationName.Value -eq "Microsoft.Compute/virtualMachines/start/action"}
        if (-not $startLogs) {
            $idleResources += [PSCustomObject]@{
                资源名称 = $vm.Name
                资源类型 = "Virtual Machine"
                资源组 = $vm.ResourceGroupName
                位置 = $vm.Location
                闲置判定依据 = "近$idleDays天无启动记录,当前状态为已解除分配"
            }
        }
    }
}

# 2. 查询闲置应用服务
Write-Host "正在查询闲置应用服务..."
$apps = Get-AzWebApp
foreach ($app in $apps) {
    $metrics = Get-AzMetric -ResourceId $app.Id -MetricName "Requests" -StartTime $startTime -AggregationType Total
    $totalRequests = ($metrics.Data | Measure-Object Total -Sum).Sum
    if ($totalRequests -eq 0) {
        $idleResources += [PSCustomObject]@{
            资源名称 = $app.Name
            资源类型 = "App Service"
            资源组 = $app.ResourceGroupName
            位置 = $app.Location
            闲置判定依据 = "近$idleDays天无请求记录"
        }
    }
}

# 3. 查询闲置服务总线
Write-Host "正在查询闲置服务总线..."
$serviceBuses = Get-AzServiceBusNamespace
foreach ($sb in $serviceBuses) {
    $inMetrics = Get-AzMetric -ResourceId $sb.Id -MetricName "IncomingMessages" -StartTime $startTime -AggregationType Total
    $outMetrics = Get-AzMetric -ResourceId $sb.Id -MetricName "OutgoingMessages" -StartTime $startTime -AggregationType Total
    $totalIn = ($inMetrics.Data | Measure-Object Total -Sum).Sum
    $totalOut = ($outMetrics.Data | Measure-Object Total -Sum).Sum
    if ($totalIn -eq 0 -and $totalOut -eq 0) {
        $idleResources += [PSCustomObject]@{
            资源名称 = $sb.Name
            资源类型 = "Service Bus Namespace"
            资源组 = $sb.ResourceGroupName
            位置 = $sb.Location
            闲置判定依据 = "近$idleDays天无消息收发记录"
        }
    }
}

# 4. 查询闲置Blob存储账户
Write-Host "正在查询闲置存储账户..."
$storageAccounts = Get-AzStorageAccount
foreach ($sa in $storageAccounts) {
    $transactionMetrics = Get-AzMetric -ResourceId $sa.Id -MetricName "Transactions" -StartTime $startTime -AggregationType Total
    $totalTransactions = ($transactionMetrics.Data | Measure-Object Total -Sum).Sum
    if ($totalTransactions -eq 0) {
        $idleResources += [PSCustomObject]@{
            资源名称 = $sa.StorageAccountName
            资源类型 = "Blob Storage Account"
            资源组 = $sa.ResourceGroupName
            位置 = $sa.Location
            闲置判定依据 = "近$idleDays天无存储交易记录"
        }
    }
}

# 5. 查询未挂载闲置磁盘
Write-Host "正在查询闲置磁盘..."
$disks = Get-AzDisk
foreach ($disk in $disks) {
    if (-not $disk.ManagedBy) {
        $diskOps = Get-AzLog -ResourceId $disk.Id -StartTime $startTime | Where-Object {$_.OperationName.Value -like "*disk/write*" -or $_.OperationName.Value -like "*disk/read*"}
        if (-not $diskOps) {
            $idleResources += [PSCustomObject]@{
                资源名称 = $disk.Name
                资源类型 = "Managed Disk"
                资源组 = $disk.ResourceGroupName
                位置 = $disk.Location
                闲置判定依据 = "未关联虚拟机,且近$idleDays天无读写记录"
            }
        }
    }
}

# 导出结果
$idleResources | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8
Write-Host "查询完成,结果已导出到:$outputPath"

使用说明

  • 如需查询60天未使用资源,只需将脚本开头的$idleDays = 30修改为$idleDays = 60即可
  • 脚本默认查询当前登录上下文绑定的所有订阅资源,如需限定单个订阅可在执行前先运行Set-AzContext -SubscriptionId "目标订阅ID"
  • 输出的CSV文件可直接用表格工具打开查看,包含资源名称、类型、所属资源组、位置、判定依据字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 17:57:04