如何批量提取Azure DevOps全组织项目Release记录并修复JSON导出问题
问题原因梳理
$top参数在PowerShell中失效的核心原因:PowerShell默认会把URL中的$识别为变量前缀,未赋值的$top会被替换为空值,实际发出的请求中没有携带该参数,因此始终返回默认的100条记录- 单次100条上限问题:Azure DevOps REST API的单次返回上限就是100,即使设置更大的
$top值也不会生效,必须通过分页续传逻辑拉取全量数据 - 导出JSON无效问题:通常是循环请求时直接追加内容到文件,未维护合法的数组结构,或是导出时未设置足够的JSON序列化深度导致层级内容被截断
可用修改后PowerShell脚本
先替换脚本开头的三个自定义参数:Azure DevOps组织名、拥有Release (Read)权限的PAT令牌、导出文件路径。
# 自定义配置项 $organization = "替换为你的组织名" $pat = "替换为你的PAT令牌" $outputJsonPath = "C:\Temp\AllReleaseRecords.json" $outputCsvPath = "C:\Temp\AllReleaseRecords.csv" # 构造认证头 $base64Auth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$pat")) $headers = @{ Authorization = "Basic $base64Auth" "Content-Type" = "application/json" } # 初始化结果存储数组 $allReleases = @() $continuationToken = $null do { # URL中$前加转义符避免被识别为PowerShell变量,也可直接用%24top代替$top $reqUrl = "https://vsrm.dev.azure.com/$organization/_apis/release/releases?api-version=7.1-preview.8&`$top=100" if ($continuationToken) { $reqUrl += "&continuationToken=$continuationToken" } try { $res = Invoke-RestMethod -Uri $reqUrl -Headers $headers -Method Get if ($res.value) { $allReleases += $res.value } # 读取响应头中的续传令牌 $continuationToken = $res.headers.'x-ms-continuationtoken' } catch { Write-Host "请求异常: $_" break } } while ($continuationToken) # 导出合法JSON文件,设置Depth避免层级截断 $allReleases | ConvertTo-Json -Depth 10 | Out-File $outputJsonPath -Encoding utf8 Write-Host "全量Release记录导出完成,共$($allReleases.Count)条,JSON路径:$outputJsonPath" # 可选导出CSV格式,可直接用Excel打开 $allReleases | Select-Object id,name,status,createdOn,modifiedOn,@{n='项目名';e={$_.project.name}},@{n='发布定义名';e={$_.releaseDefinition.name}} | Export-Csv -Path $outputCsvPath -Encoding utf8 -NoTypeInformation Write-Host "CSV导出完成,路径:$outputCsvPath"
关键修改说明
- 修复
$top失效:URL中的$top前添加转义符,避免PowerShell变量解析 - 实现全量提取:通过循环读取响应头的
x-ms-continuationtoken分页拉取,直到续传令牌为空,突破100条限制 - 修复JSON格式问题:所有结果先存入统一数组,最后一次性序列化导出,设置足够的序列化深度保证结构完整,生成的是标准合法JSON数组,可直接转换为Excel
内容的提问来源于stack exchange,提问作者Den Wahlin
相关产品推荐
相关产品推荐

