Function Get-DotnetExtraSDKs { <# .SYNOPSIS Delete extra runtimes for dotnet. Ensure that we only keep the latest around. This assumes that minors are as distinct as majors. Supply the flag RemoveNonMajorDupes to get non-latest minors per major. .PARAMETER RemoveNonMajorDupes Only consider majors as "unique" .PARAMETER ReturnExpiredSdks Returns the out of date SDKs .EXAMPLE Get-DotnetExtraSDKs #> [CmdletBinding()] [OutputType([System.Array])] param( [switch]$RemoveNonMajorDupes, [switch]$ReturnExpiredSdks ) $logLead = Get-LogLeadName $deleteSdks = @() $allSdks = @{} $sdks = dotnet --list-sdks Write-Host "$logLead : Dotnet SDKs installed on local machine:" foreach ($sdk in $sdks) { Write-Host "$logLead : $sdk" $sdkParentPath = (($sdk -split '\[')[1] -split '\]')[0] $sdkApp = "SDK" $sdkVersion = [System.Version]($sdk -split ' ')[0] $sdkPath = (Join-Path $sdkParentPath $sdkVersion) if ($allSdks.Keys -notcontains $sdkApp) { Write-Verbose "$logLead : adding version $sdkPath" $allSdks[$sdkApp] = @{ Version = [System.Version]$sdkVersion; Path = $sdkPath; }; } if ($allSdks[$sdkApp].Version.Major -lt $sdkVersion.Major) { } elseif ($allSdks[$sdkApp].Version.Minor -lt $sdkVersion.Minor -and $RemoveNonMajorDupes) { Write-Verbose "$logLead : adding delete sdk $($allSdks[$sdkApp].Path)" $deleteSdks += $allSdks[$sdkApp].Path; } elseif ($allSdks[$sdkApp].Version.Build -lt $sdkVersion.Build) { Write-Verbose "$logLead : adding delete sdk $($allSdks[$sdkApp].Path)" $deleteSdks += $allSdks[$sdkApp].Path; } $allSdks[$sdkApp] = @{ Version = $sdkVersion; Path = $sdkPath; }; } Write-Host "$logLead : Dotnet SDKs that should be deleted/out of date:" foreach ($deleteSdk in $deleteSdks) { Write-Host "$logLead : $deleteSdk" } if ($ReturnExpiredSdks) { Return $deleteSdks } }