我有一个名为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的发布不存在”。
答案 0 :(得分:2)
VSTS(Azure DevOps)管道中的动态变量名称
同意Krzysztof Madej。没有开箱即用的方法来实现这一目标。
因为在构建管道中尚不支持nested variables(如$($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
输出:
希望这会有所帮助。
答案 1 :(得分:1)
这不可能直接在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,您了解如何安装扩展程序。
答案 2 :(得分:0)
晚了聚会,但我想和大家分享。
如Defined Variables doc中所述,可以通过以下方式访问管道变量 环境变量。虽然$(varname)在任务开始之前得到处理,但是$ env:varname可以在运行期间被调用。因此,您可以使用以下方法作弊:
Write-Host ('$env:'+"$(varname)" | Invoke-Expression")
任务将在任务开始前将$(varname)解析为其值。因此该脚本的读为
Write-Host ("$env:TestVariable" | Invoke-Expression)
它会吐出与调用$(TestVariable)相同的内容。
尽管您确实需要遵守规则,例如“”和“”。 ->“ _”。