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

如何用Invoke-AzCostManagementQuery实现自定义时间范围Azure用量查询?

使用Invoke-AzCostManagementQuery查询自定义用量数据的问题解决

问题分析

你遇到的空值返回问题,核心源于时间范围计算错误和参数格式不匹配,加上Azure用量数据的同步延迟特性,共同导致了查询结果异常。以下是具体问题点和修正方案:

原代码的核心问题

  1. 上月日期计算逻辑错误:
    原代码中$prev_month_same_day = (Get-Date).AddMonths(-1).AddDays(-1)会导致日期偏移错误,比如4月1日执行时,会得到2月28/29日,而非预期的3月1日。
  2. 时间参数格式不兼容:
    Invoke-AzCostManagementQuery的-TimePeriodFrom和-TimePeriodTo要求传入ISO 8601格式的字符串(如2024-03-01T00:00:00Z),直接传入DateTime对象可能引发API解析异常。
  3. 忽略数据同步延迟:
    Azure用量数据通常有24-48小时的同步延迟,月初查询当月数据返回空值属于正常现象,需等待数据同步完成。

修正后的代码

# 获取当前日期
$currentDate = Get-Date

# 计算上月对应日期区间
# 上月第一天:取当前年份+上月月份的1号
$prevMonthFirstDay = Get-Date -Year $currentDate.Year -Month ($currentDate.Month - 1) -Day 1
# 上月对应日:取当前日期的日数,若上月无该日(如3月31日查2月),自动取上月最后一天
$prevMonthSameDay = try {
    Get-Date -Year $currentDate.Year -Month ($currentDate.Month - 1) -Day $currentDate.Day
} catch {
    Get-Date -Year $currentDate.Year -Month ($currentDate.Month - 1) -Day ([DateTime]::DaysInMonth($currentDate.Year, $currentDate.Month - 1))
}

# 转换为Azure API要求的ISO 8601格式字符串(UTC时间)
$prevMonthFirstDayStr = $prevMonthFirstDay.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
$prevMonthSameDayStr = $prevMonthSameDay.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")

# 定义资源组范围
$scope_managed_rg = "/subscriptions/$subscription_id/resourceGroups/$db_managed_rg"
$scope_unmanaged_rg = "/subscriptions/$subscription_id/resourceGroups/$db_unmanaged_rg"

# 查询当月累计用量
$rg1_currMonthRaw = Invoke-AzCostManagementQuery -Type "Usage" -Scope $scope_managed_rg -Timeframe "MonthToDate"
$rg2_currMonthRaw = Invoke-AzCostManagementQuery -Type "Usage" -Scope $scope_unmanaged_rg -Timeframe "MonthToDate"

# 查询上月对应区间用量(使用Custom时间范围,传入正确格式的时间字符串)
$rg1_prevMonthRaw = Invoke-AzCostManagementQuery -Type "Usage" -Scope $scope_managed_rg `
    -Timeframe "Custom" `
    -TimePeriodFrom $prevMonthFirstDayStr `
    -TimePeriodTo $prevMonthSameDayStr
$rg2_prevMonthRaw = Invoke-AzCostManagementQuery -Type "Usage" -Scope $scope_unmanaged_rg `
    -Timeframe "Custom" `
    -TimePeriodFrom $prevMonthFirstDayStr `
    -TimePeriodTo $prevMonthSameDayStr

额外注意事项

  • 权限验证:确保执行脚本的账号拥有目标订阅/资源组的Cost Management Reader或Reader角色,无权限会直接返回空值。
  • 结果解析:返回的查询对象需通过$rg1_currMonthRaw.Properties.Rows提取具体用量数据,直接输出对象只能看到元信息。
  • 延迟规避:若查询最近24小时内的数据,建议等待1-2天后再尝试,避免因数据未同步导致空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 15:08:24