【问题标题】:TFS/VSTS Custom variables that aren't string cannot be used不能使用非字符串的 TFS/VSTS 自定义变量
【发布时间】:2018-11-28 13:42:08
【问题描述】:

我一直在使用 TFS 从 PowerShell 创建一些发布变量。然后我可以在 TFS 的后续任务中使用 '$Env:Server' 来引用这个输出,这看起来很棒!例如:

任务 1 返回一个服务器名称,然后创建 TFS 变量:

Write-Host "##vso[task.setvariable variable=Server]"MySevrer

任务 2 使用此信息:

Write-Output $env:Server
MyServer

在以另一种格式(如数组或哈希表)输出时,这不起作用。创建的变量只是字符串,因为 documentation 使用“Write-Host”声明。

Task1 返回:

##vso[task.setvariable variable=Server] System.Collections.DictionaryEntry

任务 2 不能使用这个:

Write-Output $env:Server    
System.Collections.DictionaryEntry

Output that is created

我尝试将其输出为数组格式的字符串,例如:

[String]$Server = '@{MyServer=@("192.168.0.1")}'
Write-Host "##vso[task.setvariable variable=Server]"$Server

当我提到这个时,我尝试将它转换回 PowerShell 中的数组,但是,我在脚本中执行此操作时遇到了问题,因为它会将字符串视为单个数组对象。 (不是有值的数组)

有谁知道是否可以根据 Powershell 任务输出的信息在 Team Service 的任务/任务任务组之间解析哈希表或数组?

我目前已经通过编写一个包装器/编排函数来解决这个问题,但这对我们来说不是理想的方式。我们目前使用的是 15.117.26714.0 版本,但我在较新的版本中看不到任何内容。

【问题讨论】:

    标签: powershell variables tfs azure-devops task


    【解决方案1】:

    如 Daniel Mann 所述,ConvertTo-Json 可以解决问题。

    示例: 在 Azure Devops 发布管道中,有一个 Azure PowerShell 任务,代码如下:

        $apps = Get-AzureRmResource -ResourceGroupName "$(ResourceGroupName)" -ResourceType Microsoft.Web/sites
        $objectIdArray = New-Object System.Collections.ArrayList
        foreach ($app in $apps) {
        if (!$app.Identity) {
            Write-Host "Enabling identity for $($app.Name) app service..."
            $app = Set-AzureRmWebApp -Name $($app.Name) -ResourceGroupName "$(ResourceGroupName)" -AssignIdentity $true
        } else {
            Write-Host "$($app.Name) app service has $($app.Identity.PrincipalId) as the identity."
        }
        $objectIdArray.Add($($app.Identity.principalId))
        }
    
    $objectIdArrayJson = ($objectIdArray | ConvertTo-Json -Compress)
    Write-Host "##vso[task.setvariable variable=objectIdArray;]$objectIdArrayJson"
    
    Write-Host $env:objectIdArray
    

    以下任务是具有覆盖参数的 Azure 资源组部署任务:

    -objectIdArray "$(objectIdArray)"
    

    释放变量"$(objectIdArray)" 具有如下值:

    ["0512706a-0344-418a-9f25-5708d95e44aa","6047cbe6-c109-4aa7-8cfb-b473c088b1b1","68ee0d25-351f-44c8-aecf-cfc259f3cd97","44a6f3d6-23a3-443d-824b-445e0141f09c","805c3e6d-ab31-41f4-9d6c-8c9fc13ce
    460","aa13b9db-200d-4c38-abf8-562a915ed8cd","8d1d7ec1-faa6-4af6-b732-331e51e86a90","02222b28-6370-4995-a633-29a1cdd08fd0","a48c21b1-b6ef-4582-b9a0-050965cb3614","9111421b-8535-4326-bbe9-1e891
    33a0b56","5b1f6fca-599c-4895-ae4b-fabc0d3a4dd3","b12a935a-b1c3-4dec-b764-7c0a5307a766","8af7d615-c042-43b5-8ac0-736c6cf4ec3f","f0dd4dd9-e540-4e13-a8be-69ce08a6221c","b131e123-a87e-4faf-afed-4
    37d6dbae4ab","af7f679b-1ac8-4991-b467-93ba4a16ec22","1bbb649c-b5e6-4f5c-a050-3a0cee0af985","4a7b728e-e8c6-49c0-bde2-54811708d5ab","3b190d28-c390-43c7-9269-1177afaf7b00","49f3777f-8668-4c72-82
    60-753f65b933aa","727db5c4-ad56-457e-ad87-47b17c71e29b","801efff8-a852-4e7b-bc81-3d81d3bcfeb5","0947556e-7ece-4a36-a687-3c50f59e32f6"]
    

    【讨论】:

    【解决方案2】:

    将它们作为 JSON 传递,并使用 ConvertTo-JsonConvertFrom-Json 在 JSON 表示和 PowerShell 对象之间来回转换它们。使用ConvertTo-Json 时,请务必使用-Compress 标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 2023-04-02
      • 2019-01-05
      • 2023-03-09
      • 1970-01-01
      • 2020-11-14
      相关资源
      最近更新 更多