public/Switch-Php.ps1
function Switch-Php { <# .Synopsis Initializes the PHP Switcher. .Parameter Name The symbolic name of the PHP installation to activate. .Parameter Force Force the creation of a PHP Switcher even if there are other PHP installations available in the current path. .Example Initialize-PhpSwitcher C:\PHP Add-PhpToSwitcher 5.6 C:\PHP5.6 Add-PhpToSwitcher 7.2 C:\PHP7.2 Switch-Php 5.6 #> [OutputType()] param ( [Parameter(Mandatory = $true, Position = 0, HelpMessage = 'The symbolic name of the PHP installation to activate')] [ValidateNotNull()] [ValidateLength(1, [int]::MaxValue)] [string]$Name, [switch]$Force ) begin { } process { $switcher = Get-PhpSwitcher if ($null -eq $switcher) { throw 'PHP Switcher is not initialized: you can initialize it with the Initialize-PhpSwitcher command' } if ($switcher.Targets.Count -eq 0) { throw 'PHP Switcher does not contain any PHP installation: you can add PHP installation with the Add-PhpToSwitcher command' } if (-Not($switcher.Targets.Contains($Name))) { throw ("PHP Switcher does not contain a PHP installation with the symbolic name ""$Name"".`nThe available names are:`n- " + ($switcher.Targets.Keys -join "`n -")) } $aliasItem = $null if (Test-Path -LiteralPath $switcher.Alias -PathType Container) { $aliasItem = Get-Item -LiteralPath $switcher.Alias if ($aliasItem.LinkType -ne 'Junction') { throw ($switcher.Alias + ' already exist and it''s not a junction.') } } elseif (Test-Path -LiteralPath $switcher.Alias) { throw ($switcher.Alias + ' already exist and it''s not a junction.') } $target = $switcher.Targets[$Name] if (-Not(Test-Path -LiteralPath $target -PathType Container)) { throw "$Name points to $target, which is not a directory" } $targetItem = Get-Item -LiteralPath $target if ($targetItem.LinkType -eq 'Junction') { throw "$Name points to $target, which is a junction" } $dsc = [System.IO.Path]::DirectorySeparatorChar if (-Not($Force)) { $extraPhpInPaths = @() foreach ($phpVersion in @([PhpVersionInstalled]::FromEnvironment())) { $folder = $phpVersion.Folder if ($folder -ne $switcher.Alias.TrimEnd($dsc)) { $extraPhpInPaths += $folder } } if ($extraPhpInPaths.Count -gt 0) { throw ("PHP is currently available in the following directories:`n- " + ($extraPhpInPaths -join "`n -") + "`nPHP Switcher is meant to have PHP in PATH only as " + $switcher.Alias + "`nYou can override this behavior by calling Switch-Php with the -Force flag.") } } if ($null -eq $aliasItem -or $switcher.Alias.TrimEnd($dsc) -ne $target.TrimEnd($dsc)) { if ($null -ne $aliasItem) { Remove-Item -LiteralPath $switcher.Alias -Recurse -Force } New-Item -ItemType Junction -Path $switcher.Alias -Value $target | Out-Null Edit-FolderInPath -Operation Add -Path $switcher.Alias -Persist $(if ($switcher.Scope -eq 'AllUsers') { 'System' } else { 'User' } ) -CurrentProcess } } end { } } |