public/Uninstall-OldModules.ps1

<#
.SYNOPSIS
Uninstalls old module versions (ignoring old Windows PowerShell modules).
 
.FUNCTIONALITY
PowerShell Modules
 
.EXAMPLE
Uninstall-OldModules
 
Cleans up redundant old modules.
#>


[CmdletBinding(ConfirmImpact='High',SupportsShouldProcess=$true)] Param(
# Indicates the modules should be forced to uninstall.
[switch] $Force
)
if(Get-Command Uninstall-PSResource -ErrorAction Ignore)
{
    Get-Module -ListAvailable |
        Where-Object {$_.ModuleBase -notlike '*\WindowsPowerShell\*'} |
        Group-Object Name |
        Where-Object Count -gt 1 |
        ForEach-Object {$_.Group |Sort-Object Version -Descending |Select-Object -Skip 1} |
        Where-Object {$Force -or $PSCmdlet.ShouldProcess("$($_.Name) v$($_.Version)",'Uninstall-PSResource')} |
        ForEach-Object {Uninstall-PSResource $_.Name -Version $_.Version -Confirm:$false}
}
elseif($PSVersionTable.PSVersion -lt [version]'6.0')
{
    Get-Module -ListAvailable |
        Group-Object Name |
        Where-Object Count -gt 1 |
        ForEach-Object {$_.Group |Sort-Object Version -Descending |Select-Object -Skip 1} |
        Where-Object {$Force -or $PSCmdlet.ShouldProcess("$($_.Name) v$($_.Version)",'Uninstall-Module')} |
        ForEach-Object {Uninstall-Module $_.Name -RequiredVersion $_.Version -Force:$Force}
}
else
{
    Get-Module -ListAvailable |
        Where-Object {$_.ModuleBase -notlike '*\WindowsPowerShell\*'} |
        Group-Object Name |
        Where-Object Count -gt 1 |
        ForEach-Object {$_.Group |Sort-Object Version -Descending |Select-Object -Skip 1} |
        Where-Object {$Force -or $PSCmdlet.ShouldProcess("$($_.Name) v$($_.Version)",'Uninstall-Module')} |
        ForEach-Object {Uninstall-Module $_.Name -RequiredVersion $_.Version -Force:$Force}
}