PowerShell调用Usage Details API导出CSV数据出现截断问题如何解决
解决Invoke-RestMethod调用Azure Usage Details API导出CSV数据缺失问题
根因分析
- 分页未拉取完整:Azure Usage Details API单次返回数据上限为1000条,超出部分需通过返回体中的
nextLink字段循环拉取。Postman、Thunder Client默认开启自动跟进分页链接的配置,因此能拿到全量数据,而PowerShell的Invoke-RestMethod无自动分页处理逻辑,仅能拿到第一页数据。 - 嵌套结构未扁平化:接口返回的核心业务字段全部嵌套在
properties属性下,直接将原始响应对象导出CSV时,PowerShell仅会保留第一层顶层属性,嵌套内容会被识别为自定义对象无法正常写入CSV,表现为对应字段数据丢失。 - 列结构不统一:若多页返回的对象属性存在差异,
Export-Csv默认以第一页首个对象的属性作为CSV列列表,后续对象的独有属性会被直接忽略,导致对应字段数据丢失。
解决方案代码
直接使用以下标准化请求流程即可解决问题,按需替换占位符参数即可:
# 替换为实际鉴权令牌、订阅ID $token = "<你的Azure访问令牌>" $subscriptionId = "<你的订阅ID>" $apiVersion = "2023-05-01" $exportPath = "C:\temp\usage_details.csv" $headers = @{ Authorization = "Bearer $token" } $requestUri = "https://management.azure.com/subscriptions/$subscriptionId/providers/Microsoft.Consumption/usageDetails?api-version=$apiVersion" # 全量数据存储数组 $allData = @() $currentUri = $requestUri # 循环拉取所有分页 do { $response = Invoke-RestMethod -Uri $currentUri -Headers $headers -Method Get -ContentType "application/json" $allData += $response.value $currentUri = $response.nextLink } while ($null -ne $currentUri) # 扁平化嵌套属性 $exportData = $allData | ForEach-Object { $output = [PSCustomObject]@{} # 写入顶层属性 $_.PSObject.Properties | Where-Object { $_.Name -ne "properties" } | ForEach-Object { $output | Add-Member -NotePropertyName $_.Name -NotePropertyValue $_.Value -Force } # 写入嵌套的properties属性 $_.properties.PSObject.Properties | ForEach-Object { $output | Add-Member -NotePropertyName $_.Name -NotePropertyValue $_.Value -Force } $output } # 导出CSV,指定UTF8编码适配多语言场景 $exportData | Export-Csv -Path $exportPath -Encoding UTF8 -NoTypeInformation -Force
额外优化建议
- 若拉取3个月以上的历史数据,建议通过请求参数的
$filter参数按日/周拆分请求,避免单次请求超时或内存占用过高 - 如需获取计费项、附加信息等扩展字段,可在请求Uri中追加
&$expand=properties/meterDetails,properties/additionalInfo拉取展开后的可读内容 - 如果导出的CSV用Excel打开出现乱码,可将
-Encoding UTF8替换为-Encoding UTF8BOM适配Excel的编码识别逻辑
内容的提问来源于stack exchange,提问作者user13696433
相关产品推荐
相关产品推荐

