求可查询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
相关产品推荐
相关产品推荐

