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 } } } } } |