<# .SYNOPSIS Installs pyenv-win .DESCRIPTION Installs pyenv-win to $HOME\.pyenv If pyenv-win is already installed, try to update to the latest version. .PARAMETER Uninstall Uninstall pyenv-win. Note that this uninstalls any Python versions that were installed with pyenv-win. .INPUTS None. .OUTPUTS None. .EXAMPLE PS> install-pyenv-win.ps1 .LINK Online version: https://pyenv-win.github.io/pyenv-win/ #> param ( [Switch] $Uninstall = $False ) $PyEnvDir = "${env:USERPROFILE}\.pyenv" $PyEnvWinDir = "${PyEnvDir}\pyenv-win" $BinPath = "${PyEnvWinDir}\bin" $ShimsPath = "${PyEnvWinDir}\shims" Function Remove-PyEnvVars() { $PathParts = [System.Environment]::GetEnvironmentVariable('PATH', "User") -Split ";" $NewPathParts = $PathParts.Where{ $_ -ne $BinPath }.Where{ $_ -ne $ShimsPath } $NewPath = $NewPathParts -Join ";" [System.Environment]::SetEnvironmentVariable('PATH', $NewPath, "User") [System.Environment]::SetEnvironmentVariable('PYENV', $null, "User") [System.Environment]::SetEnvironmentVariable('PYENV_ROOT', $null, "User") [System.Environment]::SetEnvironmentVariable('PYENV_HOME', $null, "User") } Function Remove-PyEnv() { Write-Host "Removing $PyEnvDir..." If (Test-Path $PyEnvDir) { Remove-Item -Path $PyEnvDir -Recurse } Write-Host "Removing environment variables..." Remove-PyEnvVars } Function Get-CurrentVersion() { $VersionFilePath = "$PyEnvDir\.version" If (Test-Path $VersionFilePath) { $CurrentVersion = Get-Content $VersionFilePath } Else { $CurrentVersion = "" } Return $CurrentVersion } Function Get-LatestVersion() { $LatestVersionFilePath = "$PyEnvDir\latest.version" (New-Object System.Net.WebClient).DownloadFile("https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/.version", $LatestVersionFilePath) $LatestVersion = Get-Content $LatestVersionFilePath Remove-Item -Path $LatestVersionFilePath Return $LatestVersion } Function Main() { If ($Uninstall) { Remove-PyEnv If ($? -eq $True) { Write-Host "pyenv-win successfully uninstalled." } Else { Write-Host "Uninstallation failed." } exit } $BackupDir = "${env:Temp}/pyenv-win-backup" $CurrentVersion = Get-CurrentVersion If ($CurrentVersion) { Write-Host "pyenv-win $CurrentVersion installed." $LatestVersion = Get-LatestVersion If ($CurrentVersion -eq $LatestVersion) { Write-Host "No updates available." exit } Else { Write-Host "New version available: $LatestVersion. Updating..." Write-Host "Backing up existing Python installations..." $FoldersToBackup = "install_cache", "versions", "shims" ForEach ($Dir in $FoldersToBackup) { If (-not (Test-Path $BackupDir)) { New-Item -ItemType Directory -Path $BackupDir } Move-Item -Path "${PyEnvWinDir}/${Dir}" -Destination $BackupDir } Write-Host "Removing $PyEnvDir..." Remove-Item -Path $PyEnvDir -Recurse } } New-Item -Path $PyEnvDir -ItemType Directory $DownloadPath = "$PyEnvDir\pyenv-win.zip" (New-Object System.Net.WebClient).DownloadFile("https://github.com/pyenv-win/pyenv-win/archive/master.zip", $DownloadPath) Start-Process -FilePath "powershell.exe" -ArgumentList @( "-NoProfile", "-Command `"Microsoft.PowerShell.Archive\Expand-Archive -Path $DownloadPath -DestinationPath $PyEnvDir`"" ) -NoNewWindow -Wait Move-Item -Path "$PyEnvDir\pyenv-win-master\*" -Destination "$PyEnvDir" Remove-Item -Path "$PyEnvDir\pyenv-win-master" -Recurse Remove-Item -Path $DownloadPath # Update env vars [System.Environment]::SetEnvironmentVariable('PYENV', "${PyEnvWinDir}\", "User") [System.Environment]::SetEnvironmentVariable('PYENV_ROOT', "${PyEnvWinDir}\", "User") [System.Environment]::SetEnvironmentVariable('PYENV_HOME', "${PyEnvWinDir}\", "User") $PathParts = [System.Environment]::GetEnvironmentVariable('PATH', "User") -Split ";" # Remove existing paths, so we don't add duplicates $NewPathParts = $PathParts.Where{ $_ -ne $BinPath }.Where{ $_ -ne $ShimsPath } $NewPathParts = ($BinPath, $ShimsPath) + $NewPathParts $NewPath = $NewPathParts -Join ";" [System.Environment]::SetEnvironmentVariable('PATH', $NewPath, "User") If (Test-Path $BackupDir) { Write-Host "Restoring Python installations..." Move-Item -Path "$BackupDir/*" -Destination $PyEnvWinDir } If ($? -eq $True) { Write-Host "pyenv-win is successfully installed. You may need to close and reopen your terminal before using it." } Else { Write-Host "pyenv-win was not installed successfully. If this issue persists, please open a ticket: https://github.com/pyenv-win/pyenv-win/issues." } } Main