-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDeduplicateModules.ps1
More file actions
72 lines (60 loc) · 2.74 KB
/
DeduplicateModules.ps1
File metadata and controls
72 lines (60 loc) · 2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<#
.SYNOPSIS
Uninstalls older duplicate versions of installed PowerShell modules.
.DESCRIPTION
Scans all installed modules, identifies modules with multiple versions,
and uninstalls all but the latest version of each. Supports -WhatIf and
-Confirm for safe operation.
.EXAMPLE
.\DeduplicateModules.ps1 -Verbose
Uninstalls older module versions with verbose output.
.EXAMPLE
.\DeduplicateModules.ps1 -WhatIf
Shows which modules would be uninstalled without making changes.
#>
[CmdletBinding(SupportsShouldProcess)]
param ()
$allModules = Get-Module -ListAvailable
$multiversionGroups = $allModules |
Group-Object -Property Name |
Where-Object { $PSItem.Count -gt 1 }
if (-not $multiversionGroups) {
Write-Verbose -Message 'No duplicate module versions found.'
return
}
$outerProgressId = 1
$innerProgressId = 2
foreach ($group in $multiversionGroups) {
$outerIndex = [array]::IndexOf($multiversionGroups, $group)
$sortedModules = $group.Group | Sort-Object -Property Version -Descending
$latestVersion = $sortedModules | Select-Object -First 1 -ExpandProperty Version
$allVersions = ($sortedModules | ForEach-Object { $PSItem.Version }) -join ', '
$outerProgressParams = @{
Id = $outerProgressId
Activity = 'Uninstalling older versions'
Status = "$($group.Name) — versions: $allVersions (keeping $latestVersion)"
PercentComplete = (($outerIndex + 1) * 100 / $multiversionGroups.Count)
}
Write-Progress @outerProgressParams
$olderModules = $sortedModules |
Where-Object { $PSItem.Version -lt $latestVersion } |
Sort-Object -Property Version
foreach ($olderModule in $olderModules) {
$innerIndex = [array]::IndexOf($olderModules, $olderModule)
$innerProgressParams = @{
Id = $innerProgressId
ParentId = $outerProgressId
Activity = 'Uninstalling older version'
Status = "$($olderModule.Version) (latest $latestVersion)"
PercentComplete = (($innerIndex + 1) * 100 / $olderModules.Count)
}
Write-Progress @innerProgressParams
$actionMessage = "Uninstall $($olderModule.Name) $($olderModule.Version) (latest $latestVersion)"
Write-Verbose -Message "Uninstalling older version of $($olderModule.Name) $($olderModule.Version) (latest $latestVersion)"
if ($PSCmdlet.ShouldProcess($olderModule.Name, $actionMessage)) {
Uninstall-PSResource -Name $olderModule.Name -Version $olderModule.Version
}
Write-Progress -Id $innerProgressId -Activity 'Uninstalling older version' -Completed
}
Write-Progress -Id $outerProgressId -Activity 'Uninstalling older versions' -Completed
}