src/Get-EnvVar.ps1

#!/usr/bin/env pwsh
$ErrorActionPreference = "Stop"
Set-StrictMode -Version Latest


<#
.SYNOPSIS
    Gets the names and values of environment variables at a given environment variable scope.
.PARAMETER Process
    Restricts the results to environment variables at the Process-level environment variable scope.
.PARAMETER User
    Restricts the results to environment variables at the User-level environment variable scope.
.PARAMETER Machine
    Restricts the results to environment variables at the Machine-level environment variable scope.
.PARAMETER Scope
    Restricts the results to environment variables at the specified environment variable scope.
.PARAMETER Name
    Restricts the results to environment variables with the exact specified name.
.PARAMETER NameLike
    Restricts the results to environment variables with names that match the specified wildcard pattern.
.PARAMETER NameMatch
    Restricts the results to environment variables with names that match the specified regular expression pattern.
.PARAMETER ValueOnly
    Indicates that this cmdlet gets only the value of the variable(s).
.EXAMPLE
    Get-EnvVar -Process -Name "PATH"
.OUTPUTS
    System.Collections.DictionaryEntry
    string
.COMPONENT
    env
#>

function Get-EnvVar() {
    [CmdletBinding(DefaultParameterSetName = "ProcessScopeSpecificName")]
    param(
        [Parameter(Mandatory=$true, ParameterSetName="MachineScopeAnyName", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="MachineScopeSpecificName", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="MachineScopeNameLike", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="MachineScopeNameMatch", Position=0)]
        [switch] $Machine,

        [Parameter(Mandatory=$true, ParameterSetName="ProcessScopeAnyName", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="ProcessScopeSpecificName", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="ProcessScopeNameLike", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="ProcessScopeNameMatch", Position=0)]
        [switch] $Process,

        [Parameter(Mandatory=$true, ParameterSetName="UserScopeAnyName", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="UserScopeSpecificName", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="UserScopeNameLike", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="UserScopeNameMatch", Position=0)]
        [switch] $User,

        [Parameter(Mandatory=$true, ParameterSetName="ScopeValueAnyName", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="ScopeValueSpecificName", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="ScopeValueNameLike", Position=0)]
        [Parameter(Mandatory=$true, ParameterSetName="ScopeValueNameMatch", Position=0)]
        [System.EnvironmentVariableTarget] $Scope,

        [Parameter(Mandatory=$false, ParameterSetName="MachineScopeSpecificName", Position=1)]
        [Parameter(Mandatory=$false, ParameterSetName="ProcessScopeSpecificName", Position=1)]
        [Parameter(Mandatory=$false, ParameterSetName="UserScopeSpecificName", Position=1)]
        [Parameter(Mandatory=$false, ParameterSetName="ScopeValueSpecificName", Position=1)]
        [ValidateNotNullOrEmpty()]
        [string] $Name = $null,

        [Parameter(Mandatory=$true, ParameterSetName="MachineScopeNameLike", Position=1)]
        [Parameter(Mandatory=$true, ParameterSetName="ProcessScopeNameLike", Position=1)]
        [Parameter(Mandatory=$true, ParameterSetName="UserScopeNameLike", Position=1)]
        [Parameter(Mandatory=$true, ParameterSetName="ScopeValueNameLike", Position=1)]
        [ValidateNotNullOrEmpty()]
        [string] $NameLike,

        [Parameter(Mandatory=$true, ParameterSetName="MachineScopeNameMatch", Position=1)]
        [Parameter(Mandatory=$true, ParameterSetName="ProcessScopeNameMatch", Position=1)]
        [Parameter(Mandatory=$true, ParameterSetName="UserScopeNameMatch", Position=1)]
        [Parameter(Mandatory=$true, ParameterSetName="ScopeValueNameMatch", Position=1)]
        [ValidateNotNullOrEmpty()]
        [string] $NameMatch,

        [Parameter(Mandatory=$false, Position=2)]
        [Alias("Value")]
        [switch] $ValueOnly
    )
    Begin {
        if ($Machine -and $Machine.IsPresent) {
            $Scope = [System.EnvironmentVariableTarget]::Machine
        } elseif ($Process -and $Process.IsPresent) {
            $Scope = [System.EnvironmentVariableTarget]::Process
        } elseif ($User -and $User.IsPresent) {
            $Scope = [System.EnvironmentVariableTarget]::User
        }

        if (-not [System.EnvironmentVariableTarget]::IsDefined($Scope)) {
            throw "Unrecognized EnvironmentVariableTarget '$Scope'"
        }
    }
    Process {
        if ($Name) {
            [string] $valueFound = [System.Environment]::GetEnvironmentVariable($Name, $Scope)
            if ($null -eq $valueFound) {
                if ($ValueOnly -and $ValueOnly.IsPresent) {
                    Write-Output $null
                } else {
                    # Intentionally left blank.
                }
            } else {
                if ($ValueOnly -and $ValueOnly.IsPresent) {
                    Write-Output $valueFound
                } else {
                    [System.Collections.DictionaryEntry] $de = [System.Collections.DictionaryEntry]::new($Name, $valueFound)
                    Write-Output $de
                }
            }
        } else {
            [System.Collections.DictionaryEntry[]] $allEnvItems = Get-ChildItem Env:
            foreach ($de in $allEnvItems) {
                if ($NameLike -and ($de.Name -notlike $NameLike)) {
                    continue
                }
                if ($NameMatch -and ($de.Name -notmatch $NameMatch)) {
                    continue
                }
                if ($null -eq [System.Environment]::GetEnvironmentVariable($de.Name, $Scope)) {
                    continue
                } else {
                    if ($ValueOnly) {
                        Write-Output $de.Value
                    } else {
                        Write-Output $de
                    }
                }
            }
        }
    }
}