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

3
我有一个管道变量叫做TestVariable
我可以像这样轻松地从PS脚本访问这个变量:
write-host $(TestVariable)

但是,如果该变量的名称是动态的,有没有办法从PS访问该变量的值?
例如,变量的名称将进入一个字符串变量。我尝试了这些组合作为实验...它们只返回变量名称,而不是值(并不奇怪):
$varname="TestVariable"

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

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

编辑-注意事项

两个回答都回答了问题,但没有解决我的问题。在尝试了这些解决方案之后,我意识到我错过了一个额外的复杂情况,而这些答案不幸的是无法帮助我解决。在这里记录一下,以防有人尝试做类似的事情。

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

我以为我可以调用 API 并获取“实时”变量值,但不幸的是,发布数据直到发布完成后才存在(来自 API)。

因此,在发布期间调用此代码时:

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

我得到了“ID为38的发布不存在”的错误信息。

看起来很有希望,明天会有时间测试一下。谢谢! - wallismark
这两个答案都值得采纳,因为它们都能正常工作,只是对于使用哪种方法有一点偏好而已。 - wallismark
4个回答

3
VSTS(Azure DevOps)管道中的动态变量名
同意Krzysztof Madej的观点。目前没有现成的方法可以实现这一点。
这是因为构建管道中尚不支持嵌套变量(如$($varname) )。
要解决此问题,您可以使用定义-获取来获取动态变量的值:
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

enter image description here

输出:

enter image description here

希望这有所帮助。

这是否允许在库中检索标记为秘密的变量? - Huzaim

3

虽然有点晚,但我想分享一下。

正如在定义变量文档中提到的那样,管道变量可以通过环境变量进行访问。虽然$(varname)在任务启动之前被处理,但$env:varname可以在运行过程中被调用。所以你可以使用以下方法:

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

在任务开始之前,该任务将会把 $(varname) 解析为其值。因此脚本可表示为:

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

它将输出与调用$(TestVariable)相同的内容。

虽然您需要遵守规则,例如 " " 和 "." -> "_"。


那第一行末尾有一个多余的引号字符。应该是:Write-Host ('$env:'+"$(varname)" | Invoke-Expression) - Dustin C
很遗憾,并非所有变量都可用作环境变量。 - Karpik

2
这在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任务中使用此代码来获取变量的值。 这里提供有关如何安装扩展程序的信息。

-1

我知道现在已经太晚了,但是我可以告诉你一个完美的解决方案。我们都知道所有的管道变量都作为环境变量可用,因此我们可以按照以下方式访问这些值。

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

请注意,上述解决方案仅在bash中经过测试并且有效。我没有为PS编写过。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接