Winget: update script

Byphunsanit

Winget: update script

WinGet สามารถดึงข้อมูลเวอร์ชั่นล่าสุดออกมาได้แทบจะเป็นตัวล่าสุดที่ออกอัพเดตมา แต่ในความเป็นจริง มีหลายโปรแกรมที่ไม่ได้ใช้บ่อย แต่มีการอัพเดตเล็ก ๆ น้อยแบบหลักที่ สาม ไม่ใช่ update ที่สำคัญอยากจะให้ update เฉพาะ major หรือ minor version เท่านั้น จะมาเลือกเองก็ไม่สะดวก เลยเขียน PowerShell สำหรับมาอัพเดต major / minor change แทน
winget_update_major_minor_change.ps1 ( Download )

# https://en.wikipedia.org/wiki/Software_versioning
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

About the author

phunsanit administrator