Tag Archive upgrad

Byphunsanit

Winget: update script

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
  1. ให้สิทธิ์ในการ run ครั้งแรก โดยคำสั่ง
    chmod +x ./winget_update_major_minor_change.ps1
  2. เรียกใช้โดยคำสั่ง
    ./winget_update_major_minor_change.ps1