PowerShell调用Azure DevOps API拉取项目团队成员分页失效问题
问题根因
- URL参数拼接错误:Azure DevOps API的分页参数是字面量
$top、$skip,原脚本中PowerShell双引号内的$会被识别为变量解析,导致最终请求的URL没有携带正确的分页参数,每次都返回第一页数据。 - 分页参数逻辑错误:
top参数固定为单次请求最大返回数1000即可,不需要每次累加;且团队查询、成员查询共用了同一套分页参数,导致成员查询分页逻辑完全混乱。 - 分页循环条件错误:API单次最多返回1000条,原判断条件
1000 -lt $TeamsResult.count永远不成立,且没有在每次遍历新项目时重置分页参数,会导致后续项目的查询直接跳过前N页数据。 - CSV导出逻辑错误:每次分页循环都将全量
$Members数组追加到CSV,会产生大量重复数据;同时缺失必填的api-version参数,也可能导致请求返回异常。
修正后代码
$Members = @() $Organization = 'org' $PAT = 'pat' $pageSize = 1000 $AzureDevOpsAuthenicationHeader = @{ Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$PAT")) } $UriOrganization = "https://dev.azure.com/$Organization/" # 拉取所有项目 $uriProject = $UriOrganization + "_apis/projects?api-version=6.0" $ProjectsResult = Invoke-RestMethod -Uri $uriProject -Method get -Headers $AzureDevOpsAuthenicationHeader Foreach ($project in $ProjectsResult.value) { # 每个项目查询团队前重置团队分页参数 $teamSkip = 0 do { # 拼接URL时转义$,保证参数名为$top、$skip $uriTeams = "$UriOrganization`_apis/projects/$($project.id)/teams?`$top=$pageSize&`$skip=$teamSkip&api-version=6.0" $TeamsResult = Invoke-RestMethod -Uri $uriTeams -Method get -Headers $AzureDevOpsAuthenicationHeader Foreach ($team in $TeamsResult.value) { # 每个团队查询成员前重置成员分页参数 $memberSkip = 0 do { $uriTeamMembers = "$UriOrganization`_apis/projects/$($project.id)/teams/$($team.id)/members?`$top=$pageSize&`$skip=$memberSkip&api-version=6.0" $TeamMembersResult = Invoke-RestMethod -Uri $uriTeamMembers -Method get -Headers $AzureDevOpsAuthenicationHeader Foreach ($teamMember in $TeamMembersResult.value) { $Members += [PSCustomObject]@{ ProjectID = $project.id ProjectName = $project.name TeamID = $team.id TeamName = $team.name TeamDescription = $team.description MemberID = $teamMember.identity.id MemberName = $teamMember.identity.displayName MemberEmail = $teamMember.identity.uniqueName } } $memberSkip += $pageSize # 单次返回数量等于页长说明还有下一页 } while ($TeamMembersResult.value.Count -eq $pageSize) } $teamSkip += $pageSize } while ($TeamsResult.value.Count -eq $pageSize) } # 全部数据拉取完成后统一导出CSV $Members | ConvertTo-Csv -NoTypeInformation | Out-File -FilePath "filepath\file.csv" -Encoding UTF8
内容的提问来源于stack exchange,提问作者Nicolás Zuleta
相关产品推荐
相关产品推荐

