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

如何通过PowerShell分三列导出Azure近3个月VM用量至CSV

解决Azure虚拟机多时间段用量分列导出CSV的问题

你的脚本目前会循环覆盖/追加同一CSV文件,导致三个时间段的UsageQuantity都挤在同一列里。要实现每个时间段用量单独成列,需要先收集各时间段数据并按VM实例合并,再导出。

实现步骤

  • 为每个时间段的用量字段设置唯一列名(比如Nov-Dec_Usage)
  • 用VM的唯一标识(如ResourceId)作为键,合并不同时间段的同VM数据
  • 最后将合并后的结构化数据导出为CSV

修改后的脚本

# 基础变量配置
$startDate = Get-Date
$subscription = (Get-AzContext).Subscription.Name
$ResourceGroup = "你的资源组名称" # 替换为实际资源组名
$sku = "Virtual machine"
$Region = "目标区域" # 替换为实际区域

# 定义需要统计的三个时间段及对应列名
$timePeriods = @(
    @{ ColumnName = "Nov-Dec_Usage"; StartDate = $startDate.AddMonths(-2); EndDate = $startDate.AddMonths(-1) },
    @{ ColumnName = "Dec-Jan_Usage"; StartDate = $startDate.AddMonths(-1); EndDate = $startDate },
    @{ ColumnName = "Jan-Feb_Usage"; StartDate = $startDate.AddMonths(-3); EndDate = $startDate.AddMonths(-2) }
)

# 初始化字典存储合并后的VM数据
$mergedVmData = @{}

foreach ($period in $timePeriods) {
    # 获取当前时间段的用量详情
    $usageRecords = Get-AzConsumptionUsageDetail -StartDate $period.StartDate -EndDate $period.EndDate -ResourceGroup $ResourceGroup |
        Where-Object { $_.Product -like "*$sku*" -and $_.InstanceLocation -like "$Region" }

    foreach ($record in $usageRecords) {
        $vmUniqueId = $record.ResourceId
        # 如果是首次处理该VM,先初始化基础信息
        if (-not $mergedVmData.ContainsKey($vmUniqueId)) {
            $mergedVmData[$vmUniqueId] = [PSCustomObject]@{
                ResourceId = $record.ResourceId
                VMName = $record.ResourceName
                Location = $record.InstanceLocation
                ProductType = $record.Product
            }
        }
        # 添加当前时间段的用量字段
        $mergedVmData[$vmUniqueId] | Add-Member -MemberType NoteProperty -Name $period.ColumnName -Value $record.UsageQuantity -Force
    }
}

# 将合并后的数据导出为CSV
$mergedVmData.Values | Export-Csv -NoTypeInformation -Path ".\$subscription.csv"

注意事项

  • 时间段的日期计算是基于当前$startDate的,如果你需要严格对应Nov-Dec等固定月份,可以手动指定日期(比如[DateTime]"2023-11-01")替代AddMonths
  • 用ResourceId作为VM唯一标识是因为它全局唯一,避免重名VM导致数据混乱
  • 如果同一VM在单个时间段内有多条用量记录,需要求和的话,可以将$record.UsageQuantity替换为:($usageRecords | Where-Object { $_.ResourceId -eq $vmUniqueId }).UsageQuantity | Measure-Object -Sum | Select-Object -ExpandProperty Sum

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:50:28