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.