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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:05:15