-
-
Save nouseforname/a8b7ebcb9d0c05e380c7e3c81c300923 to your computer and use it in GitHub Desktop.
| # add id to skip the update | |
| $skipUpdate = @( | |
| 'Microsoft.DotNet.SDK.6', | |
| 'Microsoft.WindowsSDK' | |
| ) | |
| # object to be used basically for view only | |
| class Software { | |
| [string]$Name | |
| [string]$Id | |
| [string]$Version | |
| [string]$AvailableVersion | |
| } | |
| # get the available upgrades | |
| $upgradeResult = winget upgrade -u | |
| # run through the list and get the app data | |
| $upgrades = @() | |
| $idStart = -1 | |
| $isStartList = 0 | |
| $upgradeResult | ForEach-Object -Process { | |
| if ($isStartList -lt 1 -and -not $_.StartsWith("Name") -or $_.StartsWith("---") -or $_.StartsWith("The following packages")) | |
| { | |
| return | |
| } | |
| if ($_.StartsWith("Name")) | |
| { | |
| $idStart = $_.toLower().IndexOf("id") | |
| $isStartList = 1 | |
| return | |
| } | |
| if ($_.Length -lt $idStart) | |
| { | |
| return | |
| } | |
| $Software = [Software]::new() | |
| $Software.Name = $_.Substring(0, $idStart-1) | |
| $info = $_.Substring($idStart) -split '\s+' | |
| $Software.Id = $info[0] | |
| $Software.Version = $info[1] | |
| $Software.AvailableVersion = $info[2] | |
| $upgrades += $Software | |
| } | |
| # view the list | |
| $upgrades | Format-Table | |
| # run through the list, compare with the skip list and execute the upgrade (could be done in the upper foreach as well) | |
| $upgrades | ForEach-Object -Process { | |
| if ($skipUpdate -contains $_.Id) | |
| { | |
| Write-Host "Skipped upgrade to package $($_.id)" | |
| return | |
| } | |
| Write-Host "Going to upgrade $($_.Id)" | |
| winget upgrade -u $_.Id | |
| } | |
Nice work! There's some minor issue with a package though. This is the winget update output:
Name Id Version Available Source ---------------------------------------------------------------------------------------------------------------------------------------- Microsoft 365 Apps for enterprise - en-us Microsoft.Office 16.0.14931.21024 16.0.16327.20214 winget Oh My Posh version 17.3.0 JanDeDobbeleer.OhMyPosh 17.3.0 17.4.0 winget Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.28.29914 Microsoft.VCRedist.2015+.x64 14.28.29914.0 14.36.32532.0 winget DisplayLink Graphics DisplayLink.GraphicsDriver 10.3.6400.0 11.0.2412.0 winget Teams Machine-Wide Installer Microsoft.Teams 1.4.0.19572 1.6.00.6754 winget 5 upgrades available.And for some reason the Microsoft Visual C++ package info is not being formatted properly.
Name Id Version AvailableVersion ---- -- ------- ---------------- Microsoft 365 Apps for enterprise - en-us Microsoft.Office 16.0.14931.21024 16.0.16327.20214 Microsoft Visual C++ 2015-2019 Redistributable (Ô ª Microsoft.VCRedist.2015+.x64 14.28.29914.0 DisplayLink Graphics DisplayLink.GraphicsDriver 10.3.6400.0 11.0.2412.0 Teams Machine-Wide Installer Microsoft.Teams 1.4.0.19572 1.6.00.6754 Skipped upgrade to package Microsoft.Office Going to upgrade ª No installed package found matching input criteria. Skipped upgrade to package DisplayLink.GraphicsDriver Skipped upgrade to package Microsoft.Teams
The problem is, the text for VisualC++ Name is too long for the column and in my Powershell window it shows me 3 dots (...) at the end, but that's not three dots, it's a special character that looks like 3 dots and that messes up the script.
I assume you are using Visual Studio Code, which also shows me .
Insert after line 17:
# Remove ellipsis character (Unicode 2026) and other potential problematic encodings
$upgradeResult = $upgradeResult -replace [char]0x2026, ' ' # Replace Unicode ellipsis with a space
$upgradeResult = $upgradeResult -replace '', ' ' # Replace other potential ellipsis encodings with a space
i am using this
Start-Process powershell -ArgumentList "winget upgrade -u $($_.Id); Read-Host"instead of
winget upgrade -u $_.Idis there a problem with this aproach?