Clear-OldModules.ps1

Function Clear-OldModules
{
    [CmdletBinding()]
    Param (
        [Parameter()]
        [Bool]$CheckOnly = $true,
        [Parameter()]
        [String]$ModulesPath = "C:\Program Files\WindowsPowerShell\Modules",
        [Parameter()]
        [ValidateSet("AllUsers","CurrentUser")]
        [String]$Scope = "AllUsers",
        [Parameter()]
        [String]$ModulesFilter,
        [Parameter()]
        [ValidateRange(1, [Int]::MaxValue)]
        [Int]$LatestModulesToKeep = 1
    )

    #Check PSResourceGet module
    if(!(Get-Module Microsoft.PowerShell.PSResourceGet -ListAvailable))
    {
        Install-Module Microsoft.PowerShell.PSResourceGet -Repository PSGallery -Force
    }

    #Get all modules from path and group them by name
    $Modules = Get-PSResource -Path $ModulesPath -Scope $Scope | Sort-Object Version -Descending | Select-Object Name, Version | Group-Object Name
    if($ModulesFilter)
    {
        $Modules = $Modules | Where-Object { $_.Name -match $ModulesFilter }
    }

    #Process each module group and uninstall old versions, keeping only the latest one
    foreach ($Module in $Modules)
    {
        $LatestVersion = $Module.Group | Sort-Object Version -Descending | Select-Object -First 1 | Sort-Object Version | Select-Object @{l="Version";e={$_.Version.ToString()}} | Select-Object -ExpandProperty Version
        $KeepVersions = $Module.Group | Sort-Object Version -Descending | Select-Object -First $LatestModulesToKeep | Sort-Object Version | Select-Object @{l="Version";e={$_.Version.ToString()}} | Select-Object -ExpandProperty Version
        $OldVersions = $Module.Group | Sort-Object Version -Descending | Select-Object -Skip $LatestModulesToKeep | Sort-Object Version | Select-Object @{l="Version";e={$_.Version.ToString()}} | Select-Object -ExpandProperty Version

        Write-Host "Latest version of $($Module.Name): $($LatestVersion). Keep versions: [$($KeepVersions -join ', ')]" -ForegroundColor Green
        if($OldVersions.Count -gt 0)
        {
            Write-Host "Uninstall old versions of $($Module.Name): [$($OldVersions -join ', ')]" -ForegroundColor Yellow

            $StartVersion = $OldVersions | Select-Object -First 1
            $EndVersion = $OldVersions | Select-Object -Last 1

            if($false -eq $CheckOnly)
            {
                Uninstall-PSResource -Name $Module.Name -Version "[$StartVersion,$EndVersion]" -SkipDependencyCheck -Scope $Scope
            }
        }
    }
}

#Clear-OldModules -ModulesFilter "Microsoft.Graph.Beta" -LatestModulesToKeep 2 -CheckOnly $true
#Clear-OldModules -LatestModulesToKeep 1 -CheckOnly $true