Updaten PowerShell laatste versie

Updaten PowerShell laatste versie

Het updaten van PowerShell in Visual Studio Code naar de laatste versie zou een fluitje van een cent moeten zijn. Dat is het ook, maar deze site heeft amper bestaansrecht als ik niet tegen problemen zou aanlopen. Ik werd door de blog op Tweakers op de hoogte gebracht dat er een nieuwe versie zou zijn.

Allereerst vraag ik aan CoPilot om een script om alle versies te tonen.

# Function to check installed versions of .NET SDK, PowerShell, WinGet, and CLI tools
function Get-InstalledVersions {
        # Check .NET SDK versions
        $dotnetSDKs = dotnet --list-sdks
        Write-Host "Installed .NET SDKs:"
        Write-Host $dotnetSDKs
    
        # Check PowerShell version
        $powershellVersion = $PSVersionTable.PSVersion
        Write-Host "Installed PowerShell Version:"
        Write-Host $powershellVersion
    
        # Check WinGet version
        $wingetVersion = winget --version
        Write-Host "Installed WinGet Version:"
        Write-Host $wingetVersion
    }
    
    # Call the function to display the versions
    Get-InstalledVersions

De output was de volgende.

Installed .NET SDKs:
9.0.105 [C:\Program Files\dotnet\sdk] 9.0.203 [C:\Program Files\dotnet\sdk]
Installed PowerShell Version:
7.5.0
Installed WinGet Version:
v1.10.390

Starten we Visual Studio op, dan komt het volgende bericht op het scherm.

Klikken we op Yes, dan redirect Visual Studio Code mij naar deze PowerShell site. Ik vroeg me dus af, of we dit niet konden automatiseren. Uiteraard vragen het aan CoPilot. Natuurlijk kan dat was het antwoord. Dat kan dus via de volgende code.

winget install --id Microsoft.Powershell --version $latestVersion

We lopen nu echter tegen een bekend probleem. Dat probleem lijkt bij elke versie upgrade te spelen. Bijvoorbeeld beschreven op deze site. Er zijn verschillende mogelijkheden. Na wat zoeken, heb ik de suggestie van CoPilot aangepast met winget upgrade.

function Update-PowerShell {
        # Fetch the latest PowerShell version from GitHub
        $latestVersionInfo = Invoke-RestMethod -Uri "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"
        $latestVersion = $latestVersionInfo.tag_name.TrimStart("v")
    
        # Check the current PowerShell version
        $currentVersion = $PSVersionTable.PSVersion
        Write-Host "Current PowerShell Version: $currentVersion"
    
        # Compare versions
        if ($currentVersion -lt [version]$latestVersion) {
            Write-Host "Updating PowerShell to version $latestVersion..."
    
            # Install the latest version using Winget
            winget upgrade --id Microsoft.PowerShell --version $latestVersion
    
            Write-Host "PowerShell updated to version $latestVersion. Please restart your terminal."
        } else {
            Write-Host "You already have the latest version of PowerShell installed."
        }
    }
    
    # Call the function to check and update PowerShell
    Update-PowerShell

Helaas werkte deze oplossing ook niet (meer). Wat dan wel te doen? Deze site gaf echter uitkomst. De nieuwe functie wordt dan.

Oplossing updaten PowerShell laatste versie

function Update-PowerShell {
        # Fetch the latest PowerShell version from GitHub
        $latestVersionInfo = Invoke-RestMethod -Uri "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"
        $latestVersion = $latestVersionInfo.tag_name.TrimStart("v")
    
        # Check the current PowerShell version
        $currentVersion = $PSVersionTable.PSVersion
        Write-Host "Current PowerShell Version: $currentVersion"
    
        # Compare versions
        if ($currentVersion -lt [version]$latestVersion) {
            Write-Host "Updating PowerShell to version $latestVersion..."
    
            # Install the latest version using Winget
            winget install --id Microsoft.PowerShell --source winget
    
            Write-Host "PowerShell updated to version $latestVersion. Please restart your terminal."
        } else {
            Write-Host "You already have the latest version of PowerShell installed."
        }
    }
    
    # Call the function to check and update PowerShell
    Update-PowerShell

De output van de eerste functie geeft nu aan:

Get-InstalledVersions

Installed .NET SDKs:
9.0.105 [C:\Program Files\dotnet\sdk] 9.0.203 [C:\Program Files\dotnet\sdk]
Installed PowerShell Version:
7.5.1
Installed WinGet Version:
v1.10.390

En als we de functie om te updaten nogmaals uitvoeren, dan wordt de laatste versie gedetecteerd. Nice!

Update-PowerShell
Current PowerShell Version: 7.5.1
You already have the latest version of PowerShell installed.

Tijdens het analyseren en proberen om het probeem op te lossen, heb ik ook PowerShell 7.5.0 verwijderd via de volgende code.

function Force-ReinstallPowerShell {
        # Uninstall existing PowerShell
        Write-Host "Uninstalling existing PowerShell..."
        winget uninstall --id Microsoft.Powershell -e
    
        # Wait for uninstallation to complete
        Start-Sleep -Seconds 10
    
        # Install the latest version of PowerShell
        Write-Host "Installing the latest version of PowerShell..."
        winget install --id Microsoft.Powershell -e
    
        Write-Host "PowerShell has been reinstalled. Please restart your terminal."
    }
    
# Call the function to force reinstall PowerShell
Force-ReinstallPowerShell

Nadat ik Visual Studio Code herstart had, kwam er de melding dat PowerShell 7 niet gevonden kon worden in de omgevingsvariabele. En wat ik ook deed, PowerShell 5.x was de default. Om deze blog post compleet te maken, voeg ik ook een functie toe die dit herstelt. Moet je wel eerst PowerShell 7.5.1 correct hebben geïnstalleerd.

function Set-PowerShell7AsDefault {
        $newPath = "C:\Program Files\PowerShell\7"
        $currentPath = [System.Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::Machine)
    
        if ($currentPath -notcontains $newPath) {
            $updatedPath = "$newPath;$currentPath"
            [System.Environment]::SetEnvironmentVariable("Path", $updatedPath, [System.EnvironmentVariableTarget]::Machine)
            Write-Host "Environment variable updated. Please restart your system for changes to take effect."
        } else {
            Write-Host "PowerShell 7 path already exists in environment variables."
        }
    }
    
    # Call the function to update environment variables
    Set-PowerShell7AsDefault

Tot slot. Zo zijn we toch weer een tijdje bezig met PowerShell om een probleem veroorzaakt door Microsofts winget op te lossen. Hopelijk kunnen andere mensen die hetzelfde probleem hebben met deze blog uit de voeten.

Meer informatie over de auteur van deze blog post vind je hier.

0 Shares:
Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

You May Also Like
Self-signed certificate via PowerShell
Read More

Overzicht van PowerShell

Microsoft ontwikkelde PowerShell als een krachtige scriptingtaal en opdrachtregelshell voor het beheer en de automatisering van Windows-besturingssystemen. Het…