如何通过Azure DevOps REST API获取近n个迭代的指定字段工作项
脚本调整方案说明
本次调整跳过原流程中手动填写单条迭代路径的步骤,核心逻辑完全匹配定义的“最新n个迭代”筛选规则:
- 自动拉取项目下所有正式排期的迭代节点,按迭代结束时间倒序排序,直接截取时间最新的n个迭代范围,无需遍历全部400余个迭代做冗余计算
- 将筛选得到的迭代路径集合直接嵌入WIQL查询的IN条件,一次性拉取范围内所有符合要求的工作项,避免循环逐个迭代发起请求
- 修复原脚本中JSON结构末尾多余逗号导致的解析报错问题
可配置参数说明
仅需要修改脚本开头的参数区内容,即可适配自身项目环境:
- $token:你的Azure DevOps个人访问令牌
- $orgName:所属Azure DevOps组织名称
- $projectName:具体项目名称
- $areaPath:需要筛选的区域路径
- $n:需要拉取的最新迭代总数,例如设置$n=5时,会覆盖从当前正在运行的迭代往前连续共5个时间最新的迭代
- $targetFields:自定义需要拉取的工作项字段列表
调整后完整可运行脚本
# ========== 可配置参数区,仅需修改以下内容即可运行 ========== $token = '你的个人访问令牌PAT' $orgName = '你的组织名' $projectName = '你的项目名' $areaPath = '你的区域路径,例如 组织名/项目名/业务模块' $n = 5 # 定义需要拉取的最新迭代总数,包含当前迭代 $targetFields = @( "System.Id", "System.Title", "System.WorkItemType", "System.State", "System.IterationPath", "Microsoft.VSTS.Common.Priority", "System.CreatedDate", "System.ChangedDate", "System.Tags", "System.CommentCount" ) # ============================================================ # 公共认证头初始化 $base64Auth = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$token")) $headers = @{ Authorization = "Basic $base64Auth" } # 拉取项目下所有迭代节点,按结束时间倒序取最新的n个 $iterationListUrl = "https://dev.azure.com/$orgName/$projectName/_apis/wit/classificationnodes/Iterations?`$depth=10&api-version=5.1" $iterationResponse = Invoke-RestMethod -Uri $iterationListUrl -Headers $headers -Method Get # 筛选有明确起止时间的正式排期迭代,按结束时间倒序排序 $sortedIterations = $iterationResponse.children | Where-Object { $_.attributes.finishDate } | Sort-Object -Property @{Expression={[datetime]$_.attributes.finishDate}} -Descending # 截取最新的n个迭代路径,若项目迭代总数不足n则自动取全部 $targetIterationPaths = $sortedIterations[0..([Math]::Min($n-1, $sortedIterations.Count-1))] | ForEach-Object { "'$($_.path)'" } $iterationPathFilter = "[System.IterationPath] IN ($($targetIterationPaths -join ', '))" # 按筛选条件查询符合要求的工作项ID列表 $wiqlUrl = "https://dev.azure.com/$orgName/$projectName/_apis/wit/wiql?api-version=5.1" $wiqlQuery = @" { "query": "SELECT [System.Id] FROM workitems Where [System.AreaPath] = '$areaPath' and $iterationPathFilter and [System.WorkItemType] = 'Story' order by [Microsoft.VSTS.Common.Priority] asc, [System.CreatedDate] desc" } "@ $wiqlResponse = Invoke-RestMethod -Uri $wiqlUrl -Headers $headers -Method Post -Body $wiqlQuery -ContentType "application/json" $workItemIdList = $wiqlResponse.workItems.id -join ',' # 批量拉取对应工作项的指定字段值 $workItemBatchUrl = "https://dev.azure.com/$orgName/$projectName/_apis/wit/workitemsbatch?api-version=5.0" $batchRequestBody = @" { "ids": [$workItemIdList], "fields": $($targetFields | ConvertTo-Json) } "@ $batchResponse = Invoke-RestMethod -Uri $workItemBatchUrl -Headers $headers -Method Post -Body $batchRequestBody -ContentType "application/json" # 输出最终结果 Write-Host "拉取到的指定字段工作项结果:" $batchResponse.value | ConvertTo-Json -Depth 100
运行注意事项
认证要求:PAT需要分配「项目-查看项目级信息」「工作项-读取工作项」的权限,否则会返回接口权限不足的报错
排序逻辑:直接采用迭代节点自带的finishDate做倒序排序,完全匹配“时间最新的n个迭代”的判定规则,不会因为迭代命名格式不统一出现排序偏差
性能表现:相比原脚本逐个迭代发起请求的逻辑,当前调整后的代码仅需3次接口请求即可完成全流程,不会因为项目有400余个迭代出现请求过多、触发限流的问题
内容的提问来源于stack exchange,提问作者Jennie
相关产品推荐
相关产品推荐

