UpdatePwsh.ps1
#requires -RunAsAdministrator <#PSScriptInfo .VERSION 1.0.3 .GUID 48fcb5e2-0e6a-4a93-9699-f44fc7156482 .AUTHOR kvprasoon .COMPANYNAME PSBUG .COPYRIGHT kvprasoon .TAGS pwsh powershell upgrade .LICENSEURI .PROJECTURI https://github.com/kvprasoon/PwshUtils/blob/master/Utilities/UpdatePwsh.ps1 .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES 7/21/2018 Added -Prerelease switch which option of installing Release or pre release version. 7/20/2018 Upgrade pwsh script support is currently available only for below Operating Systems. - Windows 5/21/2019 Added some error handling incase if no release available. #> <# .DESCRIPTION Script to upgrade pwsh to the latest available release(Only for windows now) .EXAMPLE .\UpgarePwsh.ps1 The above command will install the latest released version of PowerShell core. .EXAMPLE .\UpgarePwsh.ps1 -PreRelease The above command will install the latest pre release version of PowerShell core. #> Param( # Use -PreRelease switch to install pre release version of PowerShell core. [Parameter()] [switch]$Prerelease ) function InstallForWindows { Param( $Release ) $OutputPath = "$env:HOMEPATH\Downloads" if ( [Environment]::Is64BitOperatingSystem ) { $FilterCriteria = { ($_.Name -match '.msi') -and ($_.Name -match "x64") } } else { $FilterCriteria = { ($_.Name -match '.msi') -and ($_.Name -match "x86") } } Write-Host "Latest released packages are below" $RequiredPackage = $Release | Where-Object $FilterCriteria $DownloadPath = "$OutputPath\$($RequiredPackage.Name)" Write-Host "Downloading latest release $($RequiredPackage.Name) " Invoke-WebRequest $RequiredPackage.Browser_Download_Url -Out "$DownloadPath" -ErrorAction Stop Write-Host "Installing $($RequiredPackage.Name)" @" msiexec /i $DownloadPath /quiet start pwsh "@ | Out-File -FilePath $env:Temp\UpdatePwsh.bat Start-Process -FilePath $env:Temp\UpdatePwsh.bat -ErrorAction Stop Write-Host -ForegroundColor Green "Have fun using Pwsh ..." } try { $Script:pwsh = 'pwsh' $ReleaseUrl = "https://api.github.com/repos/PowerShell/PowerShell/releases" $MetadataUrl = "https://raw.githubusercontent.com/PowerShell/PowerShell/master/tools/metadata.json" $CurrentVersion = $PSVersionTable.PSVersion -as [string] Write-Host "Installed pwsh version is $CurrentVersion" Write-Host "Fetching latest releases" $ReleaseMetadata = Invoke-RestMethod -Uri $MetadataUrl -ErrorAction Stop If ( $Preview.IsPresent ) { $ReleseToDownload = $ReleaseMetadata.NextReleaseTag } else { $ReleseToDownload = $ReleaseMetadata.StableReleaseTag } $Releases = Invoke-RestMethod -Uri $ReleaseUrl $LatestRelease = ($Releases | Where-Object -FilterScript { $_.Tag_Name -eq $ReleseToDownload }).assets | Select-Object -Property Name, Browser_Download_Url -ErrorAction Stop if(($null -eq $LatestRelease)){ Write-Warning -Message "$ReleseToDownload is not yet available, try a different version" break } If ( $LatestRelease.Name -like "*$CurrentVersion*" ) { Write-Host "Currenlty executing pwsh is with latest available version" } else { InstallForWindows -Release $LatestRelease Stop-Process -Name pwsh -Force -ErrorAction Stop } } Catch { Throw "pwsh update failed due to $_" } |