Public/GetCommonTenantVariable.ps1

function GetCommonTenantVariable {
   
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true)]
        [TenantSingleTransformation()]
        [Octopus.Client.Model.TenantResource]$Tenant,
        [parameter(Mandatory = $false,
            ValueFromPipeline = $true)]
        [LibraryVariableSetSingleTransformation()]
        [Octopus.Client.Model.LibraryVariableSetResource]$VariableSet,
        [parameter(Mandatory = $false)]
        [EnvironmentSingleTransformation()]
        [Octopus.Client.Model.EnvironmentResource]$Environment

    )
    begin {
        try {
            ValidateConnection
        }
        catch {
            $PSCmdlet.ThrowTerminatingError($_)
        }
    }
    process {
        # variables types [System.Enum]::GetNames([Octopus.Client.Model.VariableSetContentType])
        $tenantVar = $repo._repository.Tenants.GetVariables($Tenant)

        $environments = Get-Environment
        # Determine which Variable Sets to process
        $VariableSets = @()
        if ($PSBoundParameters['VariableSet']) {
            $VariableSets = $VariableSet
        }
        else {
            $VariableSets = Get-VariableSet | Where-Object { $_.id -in $tenantVar.LibraryVariables.Keys }
        }
        $results = @()
        foreach ($vSet in $VariableSets) {
            # get default variables from each set
            $libVars = $tenantVar.LibraryVariables."$($vSet.Id)"
            $results += $libVars.Templates | ForEach-Object { $setvar = $libVars.Variables."$($_.id)";
                # only output default values that are not overridden
                if ((-not $setvar.Value) -and (-not $setvar.SensitiveValue)) {
                    [pscustomobject]@{
                        VariableSetName = $vSet.Name
                        Name            = $_.name
                        Value           = $_.DefaultValue.value
                        ValueObject     = $_.DefaultValue
                        IsDefaultValue  = $true
                        Scope           = $null
                        ScopeIds        = $null
                        TemplateID      = $_.id
                        IsSensitive     = $_.DefaultValue.IsSensitive
                        VariableId      = $null
                        LibraryVariableSetId = $vSet.Id
                        origObject     = $_
                    }
                }  
            }
            # get all non default variables
            $commonTenantVarRequest = [Octopus.Client.Model.TenantVariables.GetCommonVariablesByTenantIdRequest]::new($Tenant.id, $Tenant.SpaceId)
            $tenantVars = $repo._repository.TenantVariables.get($commonTenantVarRequest)
        
           
            $vars = $tenantVars.Variables | Where-Object LibraryVariableSetId -EQ $vSet.Id
            
            $results += $vars | ForEach-Object {
                [pscustomobject]@{
                    VariableSetName = $vSet.Name
                    Name            = $_.template.name
                    Value           = $_.value.value
                    ValueObject   = $_.value
                    IsDefaultValue  = $false
                    Scope           = [String[]]($_.scope.EnvironmentIds | ForEach-Object { $environments | Where-Object id -Like $_ }).name
                    ScopeIds        = [String[]]($_.scope.EnvironmentIds)
                    TemplateID      = $_.TemplateId
                    IsSensitive     = $_.Value.IsSensitive
                    VariableId      = $_.Id
                    LibraryVariableSetId = $_.LibraryVariableSetId
                    origObject     = $_
                    
                }
            }
            # if an environment was specified, return all scoped variables for that environment and unscoped variables a far the variable has no environment scope
            if ($PSBoundParameters['Environment']) {
                [System.Array]$results = $results | Where-Object { ($_.Scope -contains $Environment.Name) -or ($null -eq $_.Scope -and ($results | Where-Object Name -EQ $_.name).count -eq 1) }  
            }
            
  
        
        }
        # order results and output
        $results = $results | Sort-Object VariableSetName, Name
        $results
    }

    end {}

}