You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求通用卸载命令:可移除控制面板中所有应用(含MSI/EXE区分方案)

区分MSI与EXE格式应用的方法
  • 安装包本质:
    • MSI是微软标准安装包格式,基于Windows Installer服务,拥有统一的安装/卸载逻辑
    • EXE是可执行文件,可能是自解压包、自定义安装程序,无统一卸载规范,内部可能嵌套MSI或采用独立安装逻辑
  • 注册表区分:
    • MSI安装的应用:在注册表路径HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall或HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall下,存在ProductID(GUID)且WindowsInstaller值为1
    • EXE安装的应用:上述路径下无WindowsInstaller项,通常包含UninstallString字段,值为对应exe卸载命令(如"C:\Program Files\xxx\uninstall.exe" /silent)
  • 卸载方式差异:
    • MSI可通过Windows Installer服务统一卸载,支持标准化静默卸载
    • EXE卸载依赖自身携带的卸载程序,参数无统一标准,需查阅对应软件文档
完善后的MSI应用卸载PowerShell脚本

原脚本使用的Get-WmiObject已被微软标记为过时,改用Get-CimInstance更高效稳定;同时优化交互逻辑,无需手动输入应用名称,直接从列表选择后卸载,增加卸载结果验证:

$ComputerName = Read-Host -Prompt '输入目标计算机名称'

# 获取所有MSI安装的应用并显示在网格视图,支持多选
$selectedApps = Get-CimInstance -ClassName Win32_Product -ComputerName $ComputerName |
    Select-Object Name, Version, Vendor, IdentifyingNumber |
    Out-GridView -Title "目标计算机上的MSI应用列表" -OutputMode Multiple

if (-not $selectedApps) {
    Write-Host "未选择任何应用,脚本退出"
    Start-Sleep -Seconds 3
    exit
}

foreach ($app in $selectedApps) {
    Write-Host "正在卸载:$($app.Name) 版本:$($app.Version)"
    # 执行卸载并获取返回码(0表示成功,其他为错误码)
    $uninstallResult = $app | Invoke-CimMethod -MethodName Uninstall
    
    switch ($uninstallResult.ReturnValue) {
        0 { Write-Host "✅ $($app.Name) 卸载成功" }
        1605 { Write-Host "❌ $($app.Name) 未安装在目标计算机" }
        1618 { Write-Host "❌ $($app.Name) 卸载正在进行中,已有安装/卸载任务运行" }
        default { Write-Host "❌ $($app.Name) 卸载失败,返回码:$($uninstallResult.ReturnValue)" }
    }
}

Start-Sleep -Seconds 10

脚本改进点:

  • 采用微软推荐的Get-CimInstance替代老旧的Get-WmiObject
  • 支持多选应用批量卸载
  • 显示应用版本、厂商信息,避免同名应用混淆
  • 输出标准化卸载返回码,明确结果状态
通用卸载方案(支持MSI和EXE应用)

1. 批量获取所有可卸载应用(含MSI/EXE)

# 获取32位和64位注册表中的卸载项
$uninstallPaths = @(
    "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*",
    "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*"
)

$allApps = Get-ItemProperty -Path $uninstallPaths -ErrorAction SilentlyContinue |
    Where-Object { $_.DisplayName -and $_.UninstallString } |
    Select-Object DisplayName, DisplayVersion, Publisher, UninstallString,
        @{Name='IsMSI'; Expression={ [bool]$_.WindowsInstaller }} |
    Sort-Object DisplayName

$allApps | Out-GridView -Title "所有可卸载应用列表" -OutputMode Multiple

2. 自动卸载选中的应用

在上述代码基础上,添加卸载逻辑:

$selectedApps = $allApps | Out-GridView -Title "选择要卸载的应用" -OutputMode Multiple

foreach ($app in $selectedApps) {
    Write-Host "正在卸载:$($app.DisplayName)"
    $uninstallCmd = $app.UninstallString

    if ($app.IsMSI) {
        # MSI应用用msiexec静默卸载
        $msiGuid = $uninstallCmd -replace 'msiexec.exe /X', '' -replace '[" ]', ''
        $process = Start-Process msiexec.exe -ArgumentList "/X$msiGuid /qn" -Wait -PassThru
    } else {
        # EXE应用执行卸载命令,尝试添加通用静默参数(部分软件支持)
        $process = Start-Process cmd.exe -ArgumentList "/c $uninstallCmd /silent /norestart" -Wait -PassThru
    }

    if ($process.ExitCode -eq 0) {
        Write-Host "✅ $($app.DisplayName) 卸载成功"
    } else {
        Write-Host "❌ $($app.DisplayName) 卸载失败,退出码:$($process.ExitCode)"
        Write-Host "提示:部分EXE卸载需要特定参数,请查阅软件文档调整卸载命令"
    }
}

注意:EXE应用的静默卸载参数不统一,常见参数有/silent、/verysilent、/uninstall /quiet等,若默认参数无效需自行替换为对应软件的专属参数。

内容的提问来源于stack exchange,提问作者Minus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:15:50