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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:54:03