如何用PowerShell筛选指定Azure DevOps项目(API调用)
Azure DevOps 指定项目信息获取方案
需求背景
我正在编写PowerShell脚本,用于从Azure DevOps获取各类项目信息(如项目名称、仓库、流水线、任务等),目前已实现全量获取功能。但现在需要仅获取指定项目(例如EANAll、EducationTest、Oppt1),或者排除70+项目中30+无需获取的项目(如标记为“inactive”或不需要的项目)。尝试过单个项目的IF判断,但不适用于多场景;了解到Where方法但觉得复杂,现附上当前调用API获取项目的代码,寻求高效实现方法。
现有代码
function projectsGet() { $apiProjects="$Organization/_apis/projects?continuationToken=$ContinuationToken&$apiVersion" $projects = @() do { $response = Invoke-WebRequest -Uri $projectsUri -Method Get -UseDefaultCredentials $ContinuationToken=$response.Headers.'x-ms-continuationtoken' $projectsData = $response.Content | ConvertFrom-Json $projectsData.value | ForEach-Object { $projectName=$_.name $projectUni="$Organization/$projectName" $projects+=$projectUni } $apiProjects="$Organization/_apis/projects?continuationToken=$ContinuationToken&$apiVersion" } while ($null -ne $ContinuationToken) return $projects }
高效实现方案
方案1:白名单模式(仅获取指定项目)
定义一个允许的项目名称列表,用Where-Object一次性过滤,简洁适配多项目场景:
function projectsGet() { # 定义需要获取的项目白名单 $allowedProjects = @("EANAll", "EducationTest", "Oppt1") $projects = @() $ContinuationToken = $null do { # 修正原代码变量不一致问题:统一使用$projectsUri作为请求地址 $projectsUri = "$Organization/_apis/projects?continuationToken=$ContinuationToken&$apiVersion" $response = Invoke-WebRequest -Uri $projectsUri -Method Get -UseDefaultCredentials $ContinuationToken = $response.Headers.'x-ms-continuationtoken' $projectsData = $response.Content | ConvertFrom-Json # 过滤出白名单内的项目 $filteredProjects = $projectsData.value | Where-Object { $allowedProjects -contains $_.name } $filteredProjects | ForEach-Object { $projects += "$Organization/$($_.name)" } } while ($null -ne $ContinuationToken) return $projects }
方案2:黑名单模式(排除不需要的项目)
如果需要排除特定项目或状态为inactive的项目,同样用Where-Object组合条件过滤:
function projectsGet() { # 定义需要排除的项目黑名单 $excludedProjects = @("ProjectA", "ProjectB") $projects = @() $ContinuationToken = $null do { $projectsUri = "$Organization/_apis/projects?continuationToken=$ContinuationToken&$apiVersion" $response = Invoke-WebRequest -Uri $projectsUri -Method Get -UseDefaultCredentials $ContinuationToken = $response.Headers.'x-ms-continuationtoken' $projectsData = $response.Content | ConvertFrom-Json # 排除黑名单项目 + 排除inactive状态的项目 $filteredProjects = $projectsData.value | Where-Object { $excludedProjects -notcontains $_.name -and $_.state -ne "inactive" } $filteredProjects | ForEach-Object { $projects += "$Organization/$($_.name)" } } while ($null -ne $ContinuationToken) return $projects }
关键优化说明
- 修正了原代码中
$apiProjects定义后未实际使用的变量不一致问题 - 用
Where-Object替代多个IF判断,代码更简洁易维护,适配多项目场景 - 白名单/黑名单模式可根据实际需求快速切换,扩展性强
内容的提问来源于stack exchange,提问作者Alberto Smith
相关产品推荐
相关产品推荐

