当卸载工具无法识别它们时如何卸载 .NET SDK 预览版和旧版本

我想卸载 .NET 5 和 .NET 6 预览版 - 只保留最新的 .NET 6。

但是,卸载实用程序只允许我卸载我想保留的版本。

在设置/应用程序和功能 (Windows 10) 中也不会删除旧版本。

所有 SDK 均已使用正确的安装实用程序(无 zip 文件)或由 Visual Studio 安装。

我已经卸载了 Visual Studio - 我改用 VSCode。

当前 SDK 列表:

C:>dotnet --list-sdks

5.0.400 [C:Program Filesdotnetsdk]
6.0.100-preview.7.21379.14 [C:Program Filesdotnetsdk]
6.0.101 [C:Program Filesdotnetsdk]

可卸载 SDK 列表(使用卸载实用程序):

C:Program Files (x86)dotnet-core-uninstall>dotnet-core-uninstall list

.NET Core SDKs:
  6.0.101  x64    [Used by Visual Studio. Specify individually or use --force to remove]

.NET Core Runtimes:

ASP.NET Core Runtimes:

.NET Core Runtime & Hosting Bundles:
C:Program Files (x86)dotnet-core-uninstall>dotnet-core-uninstall --version
1.5.255402+e07a3c995ec2d3cf449d37eb50c87e180da12544

非常感谢任何有关如何摆脱它们的提示。

stack overflow How to uninstall .NET SDK previews and older versions when uninstall tool doesn't recognise them
原文答案

答案:

作者头像

我知道这已经晚了几个月,但这最终在 Google 上的排名很高,所以只需在此处添加答案。

您可以使用 dotnet-core-uninstall 工具 https://learn.microsoft.com/en-us/dotnet/core/additional-tools/uninstall-tool?tabs=windows

并且可以运行: dotnet-core-uninstall remove --all-previews-but-latest 如果您只想删除预览/保留 .Net 5,您的问题只是保留 .Net 6,因此您可以使用 --all-below 6.0.101 --sdk

您可以通过将其添加到命令来进行试运行(试运行和 whatif 是同义词,您可以使用其中任何一个): dotnet-core-uninstall whatif --all-below 6.0.101 --sdk

作者头像

我找到了一个 GitHub Issue ,我从中制作了一个 Gist ,它列出了所有已安装的软件,包括任何不可见的软件。

### 例子

获取所有包含(区分大小写).NET 的软件
Get-Installed -Name .NET

获取所有包含(区分大小写).NET 和 3.1.10 的软件
Get-Installed -Name .NET | Where-Object {$_.DisplayName.Contains("3.1.10")}

获取所有包含(区分大小写).NET 和 3.1.10 的软件并删除该软件
Get-Installed -Name .NET | Where-Object {$_.DisplayName.Contains("3.1.10")} | Select -Expand PsChildName | Remove-Installed

function Get-Installed {
    [CmdletBinding()]
    param (
        # The name of the software
        [Parameter(Mandatory = $true)]
        [string] $Name
    )

    begin {
        $PATHS = @(
            "HKLM:SOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall",
            "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionUninstall"
        )

    }

    process {
        $installed = $null
        ForEach ($path in $PATHS) {
            $installed += Get-ChildItem -Path $path |
            ForEach-Object { Get-ItemProperty $_.PSPath } |
            Where-Object { $null -ne $_.DisplayName -and $_.DisplayName.Contains($Name) } |
            Select-Object DisplayName, DisplayVersion, PSChildName |
            Sort-Object -Property DisplayName
        }
        $installed
    }

    end {

    }
}

function Remove-Installed {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        $Guid
    )

    process {
        Write-Verbose "Removing $Guid"
        $a = "/x " + $Guid
        Start-Process msiexec -Wait -ArgumentList $a
    }

}

# Examples
#
# Get ALL software containing (case-SENSITIVE) .NET
# Get-Installed -Name .NET  
# 
# Get ALL software containing (case-SENSITIVE) .NET AND 3.1.10
# Get-Installed -Name .NET | Where-Object {$_.DisplayName.Contains("3.1.10")} 
#
# Get ALL software containing (case-SENSITIVE) .NET AND 3.1.10 AND Remove those software
# Get-Installed -Name .NET | Where-Object {$_.DisplayName.Contains("3.1.10")} | Select -Expand PsChildName | Remove-Installed
#