求通用卸载命令:可移除控制面板中所有应用(含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安装的应用:在注册表路径
- 卸载方式差异:
- 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
相关产品推荐
相关产品推荐

