使用PowerShell通过PAT获取ADO项目列表时JSON转换报错求助
问题:Azure DevOps项目列表获取脚本报错,需导出数据到Excel
我尝试用个人访问令牌(PAT)和以下PowerShell脚本从Azure DevOps(ADO)获取项目列表:
$token = "PAT" $url="https://dev.azure.com/adient/_apis/projects?api-version=4.1" $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)")) $response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Get -ContentType application/json $Projects = $response.value.name ForEach( $project in $Projects) { $url1="https://dev.azure.com/adient/_apis/projects/$($project)?includeCapabilities=true&includeHistory=true&api-version=4.1" $response1 = Invoke-RestMethod -Uri $url1 -Headers @{Authorization = "Basic $token"} -Method Get -ContentType application/json Write-Host "result= $($response1 | ConvertTo-Json -Depth 100)" } $ActiveProjects = $response1 | ConvertFrom-Json $ActiveProjects | FT
执行时出现错误:
ConvertFrom-Json : Invalid JSON primitive: .
At line:15 char:32
- $ActiveProjects = $response1 | ConvertFrom-Json
~~~~~~~~~~~~~~~~- CategoryInfo : NotSpecified: (:) [ConvertFrom-Json], ArgumentException
- FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand
需要解决错误并将部分JSON数据导出到Excel。
解决方案
1. 修复脚本错误
报错核心原因:
Invoke-RestMethod返回的是已解析的PowerShell对象,无需再用ConvertFrom-Json转换- 循环外的
$response1仅保留最后一个项目的数据,未收集所有项目信息
修改后的完整脚本:
# 配置参数 $token = "你的PAT令牌" $orgUrl = "https://dev.azure.com/adient" $apiVersion = "4.1" # 转换令牌为Basic认证格式 $authToken = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$token")) $headers = @{Authorization = "Basic $authToken"} # 获取所有项目名称列表 $projectsListUrl = "$orgUrl/_apis/projects?api-version=$apiVersion" $projectsResponse = Invoke-RestMethod -Uri $projectsListUrl -Headers $headers -Method Get -ContentType application/json $projectNames = $projectsResponse.value.name # 收集所有项目的详细信息 $allProjectDetails = @() foreach ($project in $projectNames) { $projectDetailsUrl = "$orgUrl/_apis/projects/$project?includeCapabilities=true&includeHistory=true&api-version=$apiVersion" $projectDetail = Invoke-RestMethod -Uri $projectDetailsUrl -Headers $headers -Method Get -ContentType application/json # 打印当前项目进度(可选) Write-Host "已获取项目详情: $($projectDetail.name)" # 将项目信息添加到集合 $allProjectDetails += $projectDetail } # 预览收集到的数据 $allProjectDetails | Format-Table -AutoSize
2. 导出数据到Excel
方法1:使用专业Excel模块(推荐)
先安装ImportExcel模块(PowerShell Gallery提供):
Install-Module -Name ImportExcel -Scope CurrentUser -Force
在脚本末尾添加导出代码(可自定义导出字段):
# 选择需要导出的字段(根据需求调整) $exportData = $allProjectDetails | Select-Object name, id, state, lastUpdateTime, url # 导出到Excel文件 $exportPath = "C:\temp\ADO_Projects.xlsx" $exportData | Export-Excel -Path $exportPath -AutoSize -BoldTopRow -FreezeTopRow Write-Host "数据已导出到: $exportPath"
方法2:导出为CSV(无需额外模块)
如果不想安装模块,可先导出为CSV格式,再用Excel打开:
# 选择需要导出的字段 $exportData = $allProjectDetails | Select-Object name, id, state, lastUpdateTime, url # 导出到CSV文件 $exportPath = "C:\temp\ADO_Projects.csv" $exportData | Export-Csv -Path $exportPath -NoTypeInformation -Encoding UTF8 Write-Host "数据已导出到: $exportPath"
内容的提问来源于stack exchange,提问作者Raviteja Atchuta
相关产品推荐
相关产品推荐

