如何在Azure devops Powershell@2任务中的构建变量上编写foreach循环?

tvmytwxo  于 2022-12-14  发布在  Shell
关注(0)|答案(1)|浏览(138)

我有一个Azure管道,它维护一个保存项目名称变量-假设parameters.projects保存projectA, projectB, projectC
我希望执行foreach循环并对每个项目执行一个操作。
我目前使用

- ${{ each Project in parameters.projects}}:
   - task: PowerShell@2
     displayName: "operation on [${{ Project }}]."
     inputs:
       targetType: 'inline'
       workingDirectory: $(System.DefaultWorkingDirectory)
       script: |
            New-Item -Path '$(Build.ArtifactStagingDirectory)\${{ Project }}' -ItemType Directory
            ....

在上面的例子中,foreach参数(迭代值)是azure的,这意味着它将为管道中的每个项目生成一个任务。这是可行的,但速度很慢。
我希望能经营...

- task: PowerShell@2
  displayName: "operation on [${{ Project }}]."
  inputs:
    targetType: 'inline'
    workingDirectory: $(System.DefaultWorkingDirectory)
    script: |
        foreach ($Project in ${{ parameters.projects }}) 
        {
            New-Item -Path '$(Build.ArtifactStagingDirectory)\${{ Project }}' -ItemType Directory
            ....
        }

但是我不确定语法,也找不到有用的解释/例子。
什么是正确的语法?也是一个描述网页,它也有用。

jjhzyzn0

jjhzyzn01#

运行时参数使您可以更好地控制哪些值可以传递到管道。使用运行时参数,您可以:
在运行时为脚本和任务提供不同的值控制参数类型、允许的范围和默认值使用模板表达式动态选择作业和阶段
因此,当前脚本的语法是正确的。
我测试了对象类型参数;无法在PowerShell工作中使用。
你可以尝试使用字符串类型参数并拆分字符串for循环。
YAML,例如:

parameters:
 - name: projects
   type: string
   default: project1;project2

steps:
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      # Write your PowerShell commands here.
      $prjs = "${{parameters.projects}}"
      $projects = $prjs -Split ";"
      foreach($project in $projects){
          New-Item -Path '$(Build.ArtifactStagingDirectory)\$project' -ItemType Directory
        }

如需详细信息,请参阅执行阶段参数。

相关问题