Functions/Get-SpecialFolder.ps1

function Get-SpecialFolder {
<#
.SYNOPSIS
    Gets special folder name location
.DESCRIPTION
    Gets special folder name location
.PARAMETER Name
    The name of the special folder
.PARAMETER IncludeInput
    Switch to include the input in the output
.EXAMPLE
    Get-SpecialFolder -Name CommonDocuments -IncludeInput
 
    Would return
    SpecialFolder Path
    ------------- ----
    CommonDocuments C:\Users\Public\Documents
.EXAMPLE
    Get-SpecialFolder -Name MyDocuments -IncludeInput
 
    Would return the following if logged in as 'SampleUser'
    SpecialFolder Path
    ------------- ----
    MyDocuments C:\Users\SampleUser\Documents
#>


    [CmdletBinding(ConfirmImpact = 'None')]
    Param (
        [ValidateSet( 'AdminTools', 'ApplicationData', 'CDBurning',
            'CommonAdminTools', 'CommonApplicationData', 'CommonDesktopDirectory',
            'CommonDocuments', 'CommonMusic', 'CommonOemLinks', 'CommonPictures',
            'CommonProgramFiles', 'CommonProgramFilesX86', 'CommonPrograms',
            'CommonStartMenu', 'CommonStartup', 'CommonTemplates', 'CommonVideos',
            'Cookies', 'Desktop', 'DesktopDirectory', 'Favorites', 'Fonts', 'History',
            'InternetCache', 'LocalApplicationData', 'LocalizedResources', 'MyComputer',
            'MyDocuments', 'MyMusic', 'MyPictures', 'MyVideos', 'NetworkShortcuts',
            'Personal', 'PrinterShortcuts', 'ProgramFiles', 'ProgramFilesX86', 'Programs',
            'Recent', 'Resources', 'SendTo', 'StartMenu', 'Startup', 'System', 'SystemX86',
            'Templates', 'UserProfile', 'Windows' )]
        [string] $Name,

        [switch] $IncludeInput
    )

    begin {
        Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]"
    }

    process {
        if ($Name) {
            $SpecialFolders = [System.Enum]::GetNames([System.Environment+SpecialFolder]) | Where-Object {$_ -eq $Name}
        } else {
            $SpecialFolders = [System.Enum]::GetNames([System.Environment+SpecialFolder]) | Sort-Object
        }
        foreach ($curSpecial in $SpecialFolders) {
            if (-not $IncludeInput) {
                Write-Output -InputObject ([Environment]::GetFolderPath($curSpecial))
            } else {
                New-Object -TypeName psobject -Property ([ordered] @{
                    SpecialFolder = $curSpecial
                    Path = [Environment]::GetFolderPath($curSpecial)
                })
            }
        }
    }

    end {
        Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]"
    }
}

Set-Alias -Name 'Show-SpecialFolder' -Value 'Get-SpecialFolder' -Description 'Alias for Get-SpecialFolder for backward compatibility'