public/Uninstall-PSOlderModule.ps1

<#
.Synopsis
    Uninstall-PSOlderModule function removes old modules.

.DESCRIPTION
    Default all modules version is removed except the latest.
    The function requires the custom object that it is return from Get-PSInstalledModule function.

.EXAMPLE
    PS C:\> Get-PSInstalledModule | Uninstall-PSOlderModule -Verbose -WhatIf

.EXAMPLE
   PS C:\> Get-PSInstalledModule | Uninstall-PSOlderModule -Verbose

.EXAMPLE
    PS C:\> Get-PSInstalledModule -Name dba* -Scope AllUsers | Update-PSModule -Verbose -Force

.EXAMPLE
    PS C:\> Get-PSInstalledModule -Name dba* | Uninstall-PSOlderModule -Verbose

.EXAMPLE
    PS C:\> Get-PSInstalledModule | Out-GridView -OutputMode Multiple | Uninstall-PSOlderModule -Verbose

.NOTES
    Author: Mateusz Nadobnik
    Link: akademiapowershell.pl

    Date: 15-04-2020
    Version: 0.0.1
    Keywords: remove, uninstall, module
    Notes:
    Changelog:
#>

#Requires -RunAsAdministrator
function Uninstall-PSOlderModule
{
    [cmdletbinding(SupportsShouldProcess = $true)]
    param(
        [Parameter(ValueFromPipeline, ParameterSetName = 'InputObject')]
        [PSTypeName('ModuleManagerList')]$InputObject
    )
    begin
    {
        # $LeaveAmountOfVersion = 1
    }
    process
    {
        # Write-Output $InputObject
        foreach ($Item in $InputObject)
        {
            $Versions = $Item.Modules.Version
            $Name = $Item.Modules.Name
            Write-Verbose "All existing versions of the $Name module: $Versions"

            try
            {
                if (($Versions | Measure-Object).Count -ge 2)
                {
                    $Count = $Versions.Count - 1
                    # $VersionsToRemove = $Versions[$LeaveAmountOfVersion..($Count)]
                    $VersionsToRemove = $Versions[1..($Count)]

                    foreach ($Version in $VersionsToRemove)
                    {
                        if ($PSCmdlet.ShouldProcess("Version '$Version' of module '$($Item.Name)'"))
                        {
                            # Get-InstalledModule -RequiredVersion $Version -Name $Item.Name
                            # Forces to run without asking for user confirmation
                            Get-InstalledModule -RequiredVersion $Version -Name $Item.Name | Uninstall-Module -Verbose:$VerbosePreference -Force
                        }

                    }
                }
            }
            catch
            {
                $Message = $_
                Write-Warning $Message
            }

        }
    }
}