public/Push-EnvironmentStack.ps1

#requires -Version 3
Set-StrictMode -Version Latest

function Push-EnvironmentStack{
    <#
    .SYNOPSIS
        Adds the current Environment Variables to the top of a Environment stack.
    .DESCRIPTION
        The Push-EnvironmentStack cmdlet adds, or pushes, the current Environment Variables onto a Environment stack.
    .EXAMPLE
        PS C:\> Push-EnvironmentStack
    #>

    [CmdletBinding(DefaultParametersetName="Stack")]
    Param(
        # Specifies the Environment stack to which the current Environment Variables is added.
        # Enter a Environment Variables stack name.
        # If the stack does not exist, Push-EnvironmentStack creates it.
        [Parameter(Position=0, ParameterSetName="Stack", ValueFromPipelineByPropertyName)]
        [String]$StackName = ""
        ,
        # Stack Message
        [Parameter(ParameterSetName="Stack", ValueFromPipelineByPropertyName)]
        [String]$Message = ""
    )
    Process
    {

        if($StackName -eq ""){
            $name = $script:DefaultEnvStackName
        }else{
            $name = $StackName
        }

        if(-not $script:EnvStack.Contains($name)){
            $script:EnvStack[$name] = New-InternalStack $name
        }

        $envs = New-InternalEnvHashTable

        Get-EnvironmentVariable | ForEach-Object {
            $envs[$_.Name] = $_
        }

        $envs.Message = $Message

        $script:EnvStack[$name].Push($envs)

    }
}