Public/Update-GistGetPackage.ps1

function Update-GistGetPackage {
    [CmdletBinding()]
    param(
    )

    [GistGetPackage[]] $gistGetPackages = Get-GistGetPackage

    # インストール済みのパッケージを取得
    Write-Host "Getting installed packages..."
    $updatablePackages = Get-WinGetPackage | Where-Object { $_.IsUpdateAvailable }

    $needRebootPackageIds = @()
    
    foreach ($updatablePackage in $updatablePackages) {
        $updatablePackageId = $updatablePackage.Id
        $installedVersion = $updatablePackage.InstalledVersion
        $gistGetPackage = $gistGetPackages | Where-Object { $_.Id -eq $updatablePackageId }
        
        if ($gistGetPackage) {
            # GistGetPackageにパッケージがある場合、バージョンを比較してアップデートするかどうかを判定
            if ($gistGetPackage.Version) {
                # GistGetPackageにバージョンがある場合、バージョンを比較
                if ($gistGetPackage.Version -eq $installedVersion) {
                    # インストール済みのバージョンとGistGetPackageのバージョンが同じ場合はアップデートしない
                    $needUpdate = $false
                } else {
                    # インストール済みのバージョンとGistGetPackageのバージョンが異なる場合は
                    # 置き換えるかどうかを確認する
                    $replace = Confirm-ReplacePackage -Id $updatablePackageId -InstalledVersion $installedVersion -GistGetVersion $gistGetPackage.Version
                    if ($replace) {
                        # アンインストールしてアップデートする
                        $needUpdate = $false
                        Write-Host "Uninstall package $updatablePackageId"
                        $uninstalled = Uninstall-WinGetPackage -Id $updatablePackageId -Force
                        if ($uninstalled.RebootRequired) {
                            $needRebootPackageIds += $updatablePackageId
                        }

                        Write-Host "Installing package $updatablePackageId"
                        $installed = Install-WinGetPackage -Id $updatablePackageId -Version $gistGetPackage.Version -Force
                        if ($installed.RebootRequired) {
                            # needRebootPackageIdsにすでに追加されている場合は追加しない
                            if ($needRebootPackageIds -notcontains $updatablePackageId) {
                                $needRebootPackageIds += $updatablePackageId
                            }
                        }
                    } else {
                        $needUpdate = $false
                    }
                }
            }
            else {
                # GistGetPackageにバージョンがない場合は、無条件でアップデートする
                $needUpdate = $true
            }
        } else {
            # GistGetPackageにパッケージがない場合は、無条件でアップデートする
            $needUpdate = $true
        }

        if ($needUpdate) {
            Write-Host "Updating package $updatablePackageId"
            $updated = Update-WinGetPackage -Id $updatablePackageId
            if ($updated.RebootRequired) {
                $needRebootPackageIds += $updatablePackageId
            }
        }
    }

    Write-Host

    # $needRebootPackages にリブートが必要なパッケージがある場合、パッケージIDをすべて表示
    if ($needRebootPackageIds.Count -gt 0) {
        # リブートするかどうかを確認
        $reboot = Confirm-Reboot -PackageIds $needRebootPackageIds
        if ($reboot) {
            Write-Host "Rebooting..."
            Restart-Computer -Force
        }
    }
}