Remove-sthPreviousModuleVersions.ps1

<#
.synopsis
Function for uninstalling previous versions of modules, installed from PowerShell Gallery
 
.description
Function for uninstalling previous versions of modules, installed from PowerShell Gallery.
 
Useful for removing previous versions of existing modules, after updating them to current versions
with Update-Module cmdlet.
 
You can specify one or more module names in -ModuleName parameter.
 
If -ModuleName parameter is omitted, function removes previous versions of all modules
installed from PowerShell Gallery.
 
Function uses Write-Output cmdlet, so that you can redirect output to text file, for example:
Remove-sthPreviousModuleVersions -ModuleName AzureRM.profile, AzureRM.Resources >> c:\log.txt
 
Function also supports -WhatIf and -Confirm parameters.
 
.example
Remove-sthPreviousModuleVersions -ModuleName AzureRM.profile, AzureRM.Resources
 
Module: AzureRM.profile
Latest version: 3.1.0
Removing version: 3.0.1
Removing version: 3.0.0
 
Module: AzureRM.Resources
Latest version: 4.1.0
Removing version: 4.0.1
Removing version: 4.0.0
 
Remove previous versions of modules AzureRM.profile and AzureRM.Resources.
 
.example
Remove-sthPreviousModuleVersions
 
Remove previous versions of all modules, installed from PowerShell Gallery.
 
.example
Remove-sthPreviousModuleVersions >> c:\logs\log.txt
 
Remove previous versions of all modules, installed from PowerShell Gallery
and redirect output to text file for logging purposes.
 
.example
Remove-sthPreviousModuleVersions -ModuleName AzureRM.profile, AzureRM.Resources -WhatIf
 
What if:
Module: AzureRM.profile
Latest version: 3.1.0
Removing Version: 3.0.1
Removing Version: 3.0.0
What if:
Module: AzureRM.Resources
Latest version: 4.1.0
Removing Version: 4.0.1
Removing Version: 4.0.0
 
Displays the names and versions of modules, that will be uninstalled,
when the command is invoked without -WhatIf parameter.
 
.example
Remove-sthPreviousModuleVersions -ModuleName AzureRM.profile, AzureRM.Resources -Confirm
 
 
Confirm
Are you sure you want to perform this action?
 
Module: AzureRM.profile
Latest version: 3.1.0
Removing Version: 3.0.1
Removing Version: 3.0.0
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Y
 
Module: AzureRM.profile
Latest version: 3.1.0
Removing version: 3.0.1
Removing version: 3.0.0
 
Confirm
Are you sure you want to perform this action?
 
Module: AzureRM.Resources
Latest version: 4.1.0
Removing Version: 4.0.1
Removing Version: 4.0.0
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): Y
 
Module: AzureRM.Resources
Latest version: 4.1.0
Removing version: 4.0.1
Removing version: 4.0.0
 
Request confirmation before uninstalling previous versions of modules.
#>


function Remove-sthPreviousModuleVersions
{
    [CmdletBinding(SupportsShouldProcess = $true)]
    Param(
        # Module Names, for which to uninstall previous versions.
        [string[]]$ModuleName = "*"
    )

    $Modules = Get-InstalledModule -Name $ModuleName

    foreach ($m in $Modules)
    {
        $AllModuleVersions = @(Get-InstalledModule -Name $m.Name -AllVersions)

        if ($AllModuleVersions.Count -gt 1)
        {
            $AllModuleVersionsSorted = $AllModuleVersions | Sort-Object -Property Version -Descending
            $toUninstall = $AllModuleVersionsSorted | Select-Object -Skip 1

            $out = "`nModule: {0}`nLatest version: {1}" -f $($AllModuleVersionsSorted[0].Name), $($AllModuleVersionsSorted[0].Version)

            if ($PSCmdlet.ShouldProcess("$out $($toUninstall.Version | ForEach-Object { Write-Output -InputObject "`nRemoving Version: $PSItem"})", "", ""))
            {
                Write-Output -InputObject $out
                
                foreach ($u in $toUninstall)
                {
                    Write-Output "Removing version: $($u.Version)"
                    Uninstall-Module -InputObject $u
                }
            }
        }
    }
}