WinGet สามารถดึงข้อมูลเวอร์ชั่นล่าสุดออกมาได้แทบจะเป็นตัวล่าสุดที่ออกอัพเดตมา แต่ในความเป็นจริง มีหลายโปรแกรมที่ไม่ได้ใช้บ่อย แต่มีการอัพเดตเล็ก ๆ น้อยแบบหลักที่ สาม ไม่ใช่ update ที่สำคัญอยากจะให้ update เฉพาะ major หรือ minor version เท่านั้น จะมาเลือกเองก็ไม่สะดวก เลยเขียน PowerShell สำหรับมาอัพเดต major / minor change แทน
winget_update_major_minor_change.ps1 ( Download )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | function GetVersion { param ( [string]$versionString ) $cleanVersionString = $versionString -replace '^>\s*', '' $versionParts = $cleanVersionString -split '\.' $versionMajor = if ($versionParts.Length -ge 1) { $versionParts[0] } else { 0 } $versionMinor = if ($versionParts.Length -ge 2) { $versionParts[1] } else { 0 } return $versionMajor, $versionMinor } # Clear the screen Clear-Host # Run the winget list command and parse the result $wingetList = winget list --disable-interactivity --nowarn # Loop through the list of installed applications foreach ($line in $wingetList) { $columns = $line -split '\s{2,}' $Update = $false $Name = $columns[0].Trim() # Skip the first line if ($Name -eq '' -or $Name -eq 'Name' -or $Name.StartsWith('-')) { continue } $Id = if ($columns.Length -ge 2) { $columns[1].Trim() } else { '' } $VersionInstalled = if ($columns.Length -ge 3) { $columns[2].Trim() } else { '' } $Source = if ($columns.Length -ge 4) { $columns[3].Trim() } else { '' } $VersionNew = winget show $Id | Select-String -Pattern 'Version:\s*(\S+)' -AllMatches | ForEach-Object { $_.Matches.Groups[1].Value } $VersionInstalledMajor, $VersionInstalledMinor = GetVersion -versionString $VersionInstalled $VersionNewMajor, $VersionNewMinor = GetVersion -versionString $VersionNew if ($VersionInstalledMajor -eq 0 -or $VersionInstalledMinor -eq 0) { #$Update = $true } elseif ($VersionInstalledMajor -lt $VersionNewMajor) { $Update = $true } elseif (($VersionInstalledMajor -eq $VersionNewMajor) -and ($VersionInstalledMinor -lt $VersionNewMinor)) { $Update = $true } if ($Update) { Write-Host "Updating $Name ($Id) from version ($VersionInstalled) to ($VersionNew)" try { winget upgrade --id $Id --accept-package-agreements --accept-source-agreements --silent Write-Host "Successfully updated $Name ($Id) to version $VersionNew" } catch { Write-Host "Failed to update $Name ($Id). Error: $_" } } else { Write-Host "Skip $Name ($Id)" } } # Display the parsed list in a table format $parsedList | Format-Table -Property Name, Id, @{Name = 'Version Installed'; Expression = { $_.VersionInstalled } }, @{Name = 'Version New'; Expression = { $_.VersionNew } }, Update, Source -AutoSize |
- ให้สิทธิ์ในการ run ครั้งแรก โดยคำสั่ง
chmod +x ./winget_update_major_minor_change.ps1
- เรียกใช้โดยคำสั่ง
./winget_update_major_minor_change.ps1