Azure DevOps-将Powershell列表变量传递给yml模板数组

时间:2020-06-04 13:40:35

标签: powershell azure-devops yaml

我想在Powershell任务中生成一个列表作为输出变量,并在yml模板中将其用作列表以执行任务循环。

#Main
- task: PowerShell@2
  condition: succeeded()
  displayName: "Create a list"
  inputs:
    targetType: 'inline'
    script: |

      $myList = New-Object System.Collections.ArrayList

      $myList.Add("wow")

      Write-Output ("##vso[task.setvariable variable=MyList;]$myList")

- template: myRandomListTaskTemplate.yml
  parameters:
      MyList: $(MyList)


#Template
parameters:
  MyList: []

steps:

- ${{ each myList in parameters.MyList }}:
    - task: PowerShell@2
      condition: succeeded()
      displayName: "WOW a list"
      inputs:
          targetType: 'inline'
          script: |
            Write-Host("A list string: ${{ myList }}")

我遇到错误

Expected a sequence or mapping. Actual value '$(MyList)'

注意:模板中的Powershell任务只是一个示例,它可以是与Powershell不相关的其他任务(例如:DotNetCoreCLI @ 2)

2 个答案:

答案 0 :(得分:0)

它将无法按预期工作。

$myList = New-Object System.Collections.ArrayList

$myList.Add("wow")

Write-Output ("##vso[task.setvariable variable=MyList;]$myList")

您不会在这里拥有一个数组。将其分配给变量后,它将为纯字符串。这就是为什么您会收到此错误。

如果运行此命令:

- template: myRandomListTaskTemplate2.yml
  parameters:
    MyList: 
    - item1
    - item2

一切顺利。但是,目前无法做什么。

请检查this developer community topic

答案 1 :(得分:0)

Azure DevOps-将Powershell列表变量传递给yml模板数组

就像Krzysztof Madej所说的那样,您无法在Powershell代码中包含数组。

作为测试,我使用powershell脚本创建了一个数组,然后将Powershell列表变量传递给yml模板数组:

stages:
  - stage: Deploy_Cluster
    jobs:
    - job: A
      pool:
        name: MyPrivateAgent
      steps:
      - task: PowerShell@2
        condition: succeeded()
        displayName: "Create a list"
        inputs:
          targetType: 'inline'
          script: |
              $id = '2,0,1,2'
                  Write-Host "##vso[task.setvariable variable=valuefiles;isOutput=true]$id"                
        name: fileoutput


    - job: B
      dependsOn: A
      pool:
        name: MyPrivateAgent
      variables: 
        allfiles: $[dependencies.A.outputs['fileoutput.valuefiles']]
      steps:
      - template: loopTemplate.yml
        parameters: 
          files : $(allfiles)

我的测试loopTemplate.yml

parameters:
  files: []

steps :
- task: PowerShell@2
  displayName: 'Fetching ValueFiles'
  inputs:
    targetType: 'inline'
    script: >

      foreach ($i in ${{parameters.files}})
      {
        Write-Host "filenames=$i"
      }

我的测试结果:

enter image description here

希望这会有所帮助。