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

问题描述 投票:0回答:3

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

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

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

所有 SDK 均已使用正确的安装实用程序安装 - 无 zip 文件 - 或通过 Visual 工作室。

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

当前SDK列表:

C:\>dotnet --list-sdks

5.0.400 [C:\Program Files\dotnet\sdk]
6.0.100-preview.7.21379.14 [C:\Program Files\dotnet\sdk]
6.0.101 [C:\Program Files\dotnet\sdk]

可卸载的 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

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

.net .net-core uninstallation
3个回答
10
投票

我知道这已经晚了几个月了,但这最终在谷歌上的排名相当高,所以只是在这里添加答案。

您可以使用 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

您可以通过将其添加到命令中来进行试运行(dry-run 和 Whatif 是同义词,您可以使用其中之一):

dotnet-core-uninstall whatif --all-below 6.0.101 --sdk


7
投票

我发现了一个 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:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall",
            "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
        )

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

0
投票

如果

dotnet-core-uninstall
没有帮助,请使用此脚本

# Path to the installer folder
$InstallerFolder = Resolve-Path "C:\Windows\Installer"

# Search for all .msi files in the current folder
$MsiFiles = Get-ChildItem -Path $InstallerFolder -Filter *.msi

# Get the ShellFolder once
$Shell = New-Object -COMObject Shell.Application
$ShellFolder = $Shell.NameSpace($InstallerFolder.Path)

# Loop through each .msi file
foreach ($File in $MsiFiles) {
    $ShellFile = $ShellFolder.ParseName($File.Name)

    # Get the subject of the .msi file
    $Subject = $ShellFile.ExtendedProperty("System.Subject")

    # Check if the subject contains either specified string format
    if ($Subject -like "*9.0.100-rc.2*" -or $Subject -like "*9.0.0 RC 2*") {
        # Execute uninstallation and wait for it to complete
        Write-Host "Uninstalling $File"
        $process = Start-Process msiexec.exe -ArgumentList "/x $($File.FullName) /norestart" -Wait
        Write-Host "Uninstalled $File"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.