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 { } } |