private/Add-PhpFolderToPath.ps1

Function Add-PhpFolderToPath
{
    <#
    .Synopsis
    Adds a folder to the PATH environment variable.

    .Parameter Path
    The path of the directory to be added to the PATH environment variable.

    .Parameter Persist
    Permamently set the PATH for either the current user ('User') or for the whole system ('System').

    .Parameter CurrentProcess
    Specify this switch to add Path to the current PATH environment variable.
    #>

    Param (
        [Parameter(Mandatory = $True, Position = 0, HelpMessage = 'The path of the directory to be added to the PATH environment variable')]
        [ValidateNotNull()]
        [ValidateLength(1, [int]::MaxValue)]
        [string]$Path,
        [Parameter(Mandatory = $False, Position = 1, HelpMessage = 'Permamently set the PATH for either the current user (''User'') or for the whole system (''System'')')]
        [ValidateSet('User', 'System')]
        [string]$Persist,
        [switch]$CurrentProcess
    )
    Begin {
    }
    Process {
        $pathSeparator = [System.IO.Path]::PathSeparator
        $directorySeparator = [System.IO.Path]::DirectorySeparatorChar
        $Path = [System.IO.Path]::GetFullPath($Path).TrimEnd($directorySeparator)
        $alternativePath = $Path + $directorySeparator
        $targets = @()
        If ($CurrentProcess) {
            $targets += $Script:ENVTARGET_PROCESS
        }
        If ($null -ne $Persist) {
            If ([System.Environment]::GetEnvironmentVariable[0].OverloadDefinitions.Count -lt 2) {
                If ($CurrentProcess) {
                    Write-Warning "The current PowerShell version does not support persisting environment variables: we'll set the Path only for the current process"
                } Else {
                    Write-Warning "The current PowerShell version does not support persisting environment variables"
                }
            } Else {
                If ($Persist -eq 'User') {
                    $targets += $Script:ENVTARGET_USER
                } ElseIf ($Persist -eq 'System') {
                    $targets += $Script:ENVTARGET_MACHINE
                }
            }
        }
        ForEach ($target in $targets) {
            If ($target -eq $Script:ENVTARGET_PROCESS) {
                $currentPath = $Env:Path
            } Else {
                $currentPath = [System.Environment]::GetEnvironmentVariable('Path', $target).Split($pathSeparator)
            }
            If ($null -eq $currentPath) {
                $currentPath = ''
            }
            $currentPathParts = $currentPath.Split($pathSeparator)
            $found = $currentPathParts | Where-Object {$_ -eq $Path -or $_ -eq $alternativePath}
            if ($null -eq $found) {
                $currentPathParts += $Path
                $joinedPath = $currentPathParts -join $pathSeparator
                $requireRunAs = $false
                If ($target -eq $Script:ENVTARGET_MACHINE) {
                    $currentUser = [System.Security.Principal.WindowsPrincipal] [System.Security.Principal.WindowsIdentity]::GetCurrent()
                    If (-Not($currentUser.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))) {
                        $requireRunAs = $true
                    }
                }
                If ($requireRunAs) {
                    $escapedJoinedPath = $joinedPath -replace "'", "''"
                    $exeCommand = "[System.Environment]::SetEnvironmentVariable('Path', '$escapedJoinedPath', '$Script:ENVTARGET_MACHINE')"
                    Start-Process -FilePath 'powershell.exe' -ArgumentList "-Command ""$exeCommand""" -Verb RunAs
                } else {
                    If ($target -eq $Script:ENVTARGET_PROCESS) {
                        $Env:Path = $joinedPath
                    } Else {
                        [System.Environment]::SetEnvironmentVariable('Path', $joinedPath, $target)
                    }
                }
            }
        }
    }
    End {
    }
}