I have a HelloWorld variable library in Azure DevOps containing the variable $foo=bar.
I want to read it in my pipeline using Get-Variable but regardless of the scope I give to my search, the variable is nowhere to be found. It is however, accessible "directly" (as shown below):
variables:
- group: HelloWorld
stages:
- stage: test
jobs:
- job:
displayName: Retrieve variables
steps:
- task: Powershell@2
displayName: Variable retrieval
inputs:
targetType: inline
verbose: true
script: |
# This works
Write-Host "Direct access: $(foo)"
# All of the following returns nothing
$indirectAccess = Get-Variable -Name "foo" -ValueOnly -ErrorAction SilentlyContinue
$indirectAccess = Get-Variable -Name "foo" -ValueOnly -ErrorAction SilentlyContinue -Scope Global
$indirectAccess = Get-Variable -Name "foo" -ValueOnly -ErrorAction SilentlyContinue -Scope Script
Write-Host "Indirect access: $indirectAccess"
Can I in any way retrieve library variables with Get-Variable?
The reason it's so important for me to know whether it's possible is because I need to retrieve values with variables which name is a variable itself... And so far I haven't found a way to do it except than with Get-Variable.
CodePudding user response:
$(foo)is Azure's macro expansion syntax, meaning that the value of the variable is injected into the script, so the script doesn't know the name of the variable whose value was used.From what I understand, Azure also defines variables as environment variables, with the original name transformed to all-uppercase, with
.replaced with_, if applicable. Thus, try accessing the variable as:$env:FOO(direct access)$name = 'FOO'; Get-Content env:$name(indirect access)
Note that Get-Variable only works for regular (PowerShell-only) variables, not for environment variables; the latter must be accessed via the env: drive, as shown above.
