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

如何在Azure Pipeline中动态构建两级参数:一级文件夹及对应文件

Azure Pipeline 动态构建两级依赖参数实现方案

方案1:启动管道前选择(Runtime Parameters)

这种方式让用户在启动管道时就能选择文件夹和对应的文件,需要借助脚本预生成参数选项:

步骤1:创建参数生成脚本

在仓库根目录新建generate-params.ps1,内容如下:

# 获取当前目录下的一级文件夹
$folders = Get-ChildItem -Directory -Path $PSScriptRoot -Depth 1 | Select-Object -ExpandProperty Name

# 生成参数YAML内容
$paramContent = @"
parameters:
  - name: targetFolder
    type: string
    default: '$($folders[0])'
    values:
"@

foreach ($folder in $folders) {
    $paramContent += "`n      - '$folder'"
}

$paramContent += @"

  - name: targetFile
    type: string
    default: ''
    values:
"@

# 如果有传入选中的文件夹,生成对应文件列表
if ($env:SELECTED_FOLDER) {
    $files = Get-ChildItem -File -Path "$PSScriptRoot/$env:SELECTED_FOLDER" | Select-Object -ExpandProperty Name
    foreach ($file in $files) {
        $paramContent += "`n      - '$file'"
    }
} else {
    $paramContent += "`n      - '请先选择文件夹'"
}

# 写入参数文件
$paramContent | Out-File -Path "$PSScriptRoot/params.yaml" -Encoding utf8

步骤2:主管道YAML配置

# 引用当前仓库资源
resources:
  repositories:
    - repository: self
      type: git
      ref: main

# 加载生成的参数文件
extends:
  template: params.yaml
  parameters:
    targetFolder: ${{ parameters.targetFolder }}

steps:
  - script: echo 选中的文件夹: ${{ parameters.targetFolder }}
    displayName: 输出选中文件夹
  - script: echo 选中的文件: ${{ parameters.targetFile }}
    displayName: 输出选中文件

注意事项

  • 首次运行时,第二个参数会显示"请先选择文件夹",选择文件夹并重新运行管道后,第二个参数会自动加载对应文件夹内的文件列表。
  • 确保管道服务账号有仓库文件的读取权限,脚本才能正常获取目录内容。

方案2:管道运行中交互式选择

如果不需要在启动前选择,可在管道运行过程中动态获取列表并让用户选择,步骤更简单:

steps:
  # 1. 获取一级文件夹列表并设置为输出变量
  - task: PowerShell@2
    name: FetchFolders
    displayName: 获取一级文件夹列表
    inputs:
      targetType: inline
      script: |
        $folders = Get-ChildItem -Directory -Path $(System.DefaultWorkingDirectory) -Depth 1 | Select-Object -ExpandProperty Name
        $folderStr = $folders -join ','
        Write-Host "##vso[task.setvariable variable=availableFolders;isOutput=true]$folderStr"
        Write-Host "检测到的文件夹:$folderStr"

  # 2. 让用户选择目标文件夹
  - task: ManualValidation@0
    name: SelectTargetFolder
    displayName: 选择目标文件夹
    inputs:
      instructions: |
        请在下方注释中输入要选择的文件夹名称(可选值:$(FetchFolders.availableFolders))
      onTimeout: reject

  # 3. 提取用户选择的文件夹并获取对应文件列表
  - task: PowerShell@2
    name: FetchFiles
    displayName: 获取目标文件夹内的文件列表
    inputs:
      targetType: inline
      script: |
        # 从ManualValidation的注释中提取用户输入的文件夹名称
        $selectedFolder = "$(SelectTargetFolder.Comments)"
        Write-Host "用户选中的文件夹:$selectedFolder"
        
        $files = Get-ChildItem -File -Path "$(System.DefaultWorkingDirectory)/$selectedFolder" | Select-Object -ExpandProperty Name
        $fileStr = $files -join ','
        Write-Host "##vso[task.setvariable variable=availableFiles;isOutput=true]$fileStr"
        Write-Host "检测到的文件:$fileStr"

  # 4. 让用户选择目标文件
  - task: ManualValidation@0
    name: SelectTargetFile
    displayName: 选择目标文件
    inputs:
      instructions: |
        请在下方注释中输入要选择的文件名称(可选值:$(FetchFiles.availableFiles))
      onTimeout: reject

  # 5. 使用选中的文件夹和文件执行后续操作
  - script: |
      echo 最终选中的文件夹:$(SelectTargetFolder.Comments)
      echo 最终选中的文件:$(SelectTargetFile.Comments)
    displayName: 输出选中结果

注意事项

  • ManualValidation任务需要用户手动在注释中输入选择的名称,适合需要人工确认的场景。
  • 如果需要更友好的下拉选择界面,可以安装Azure DevOps市场中的Input Task扩展。

内容的提问来源于stack exchange,提问作者Alessandro Bocchi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:24:58