VSTS (Azure DevOps) 管道中的动态变量名称

Dynamic variable name in VSTS (Azure DevOps) pipeline

我有一个名为 TestVariable 的管道变量。

我可以像这样从 PS 脚本轻松访问此变量:

write-host $(TestVariable)

但是如果该变量的名称是动态的,有什么方法可以从 PS 访问变量值?

例如,变量的名称将进入字符串变量。我已经尝试过这些组合作为实验......它们只是 return 变量名,而不是值(不足为奇):

$varname="TestVariable"

write-host $($varname)
write-host $("$varname")
write-host $"($varname)"
write-host $("($varname)")

我认为答案是否定的,但我想确定一下。非常感谢任何帮助!

编辑 - 备注

两个答案都回答了问题,但没有解决我的问题。在尝试了这些解决方案之后,我意识到我错过了一个额外的并发症,不幸的是答案对它没有帮助。我在这里指出,以防有人试图做类似的事情。

更复杂的是,变量的值是在发布期间设置的(我正在尝试访问 ARM 模板输出变量)。

我以为我可以点击 API 并获得 'live' 变量值,但不幸的是,在发布完成之前,发布数据不存在(来自 API) .

所以当我在发布期间调用它时:

https://vsrm.dev.azure.com/{company}/{project}/_apis/release/releases/$($releaseId)?api-version=5.0

我得到 "Release with ID 38 does not exist"。

这在 YAML 中是不可能的,但您可以使用例如 az cli。有了这个,您可以以编程方式设置变量名并获取它的值

$variableName = "some"

az pipelines variable list --org "https://dev.azure.com/thecodemanual" --project "DevOps Manual" --pipeline-name "DevOps Manual-CI" --query ($variableName + '.value')

$variableName = "test"

az pipelines variable list --org "https://dev.azure.com/thecodemanual" --project "DevOps Manual" --pipeline-name "DevOps Manual-CI" --query ($variableName + '.value')

现在您可以在 powershell 任务中使用此代码来获取变量的值。

Here 您知道如何安装扩展。

Dynamic variable name in VSTS (Azure DevOps) pipeline

同意 Krzysztof Madej 的观点。没有开箱即用的方法来实现这一点。

那是因为 (例如 $($varname) 在构建管道中尚不支持。

要解决此问题,您可以使用 Definitions - Get 获取动态变量的值:

GET https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?api-version=5.1

下面是我的测试 powershell 脚本:

$varname="TestVariable"

$url = "https://dev.azure.com/YourOrganizationName/YourtProjectName/_apis/build/definitions/<definitionsId>?api-version=5.0"

Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}


$VFDV= $pipeline.variables.$varname.value


Write-Host This is Value For Dynamic Variable: $VFDV

输出:

希望对您有所帮助。

聚会迟到了,但我想分享一下。

Defined Variables doc中所述,管道变量可通过 环境变量。虽然 $(varname) 在任务开始之前得到处理,但 $env:varname 可以在 运行 中调用。所以你可以通过使用作弊:

Write-Host ('$env:'+"$(varname)" | Invoke-Expression)

任务将在任务开始前将 $(varname) 解析为它的值。所以脚本读作

Write-Host ("$env:TestVariable" | Invoke-Expression)

它会吐出与调用 $(TestVariable) 相同的结果。

尽管您确实需要遵守规则,例如“ ”和“。” -> "_".

我知道为时已晚,但我可以告诉你一个完美的解决方案。正如我们所知,所有管道变量都可用作环境变量,因此我们可以访问以下值

$var=TestVariable
upper= ${var^^} //convert the variable to uppercase as env variables are upper
echo ${!upper}

请注意,以上解决方案已经过测试,仅适用于 bash。我还没有写 PS