Last active
September 14, 2023 19:04
-
-
Save nouseforname/a8b7ebcb9d0c05e380c7e3c81c300923 to your computer and use it in GitHub Desktop.
Powershell filter winget upgrade
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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
i am using this
Start-Process powershell -ArgumentList "winget upgrade -u $($_.Id); Read-Host"
instead of
winget upgrade -u $_.Id
is there a problem with this aproach?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Much Obliged.