如何通过PowerShell卸载非微软应用?解决脚本报错与工具局限
解决PowerShell卸载非微软应用的问题
我来帮你搞定这个PowerShell卸载非微软应用的问题~先拆解下原来方法失效的原因,再给你靠谱的解决方案。
为什么原来的代码会报错?
你遇到的「null值表达式无法调用方法」问题,根源在Get-WmiObject -Class Win32_Product这个命令:
- 它只追踪通过MSI安装包部署的软件,很多非微软软件(比如用EXE安装、绿色版或者其他小众安装包的)根本不会出现在这个查询结果里,所以过滤后
$app就成了空值,调用Uninstall()自然报错。 - 另外
Get-RemoteProgram默认可能只读取了微软相关的注册表路径,漏掉了非微软软件的存储位置,所以只能列出微软软件。
第一步:先正确找到所有已安装软件(包括非微软)
Windows会把所有已安装软件的信息存在几个注册表路径里,我们直接读取这些路径就能拿到完整列表:
# 定义所有存储卸载信息的注册表路径 $uninstallPaths = @( "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*", # 32位软件 "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*", # 64位软件 "HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" # 当前用户安装的软件 ) # 读取并整理软件信息 Get-ItemProperty $uninstallPaths | Where-Object { $_.DisplayName -ne $null } | # 过滤掉无名称的条目 Select-Object DisplayName, DisplayVersion, UninstallString, PSPath | Sort-Object DisplayName
运行这段代码后,你能看到所有软件的UninstallString字段——这就是该软件的卸载命令。
第二步:卸载目标软件
方法1:手动执行卸载命令
找到你要卸载的软件对应的UninstallString,比如如果是"C:\Program Files\XXX\uninstall.exe" /quiet,直接在PowerShell里执行:
& "C:\Program Files\XXX\uninstall.exe" /quiet
/quiet是静默卸载参数,大部分软件支持;如果是MSI安装的软件,可能需要用/qn参数。
方法2:自动化脚本匹配卸载
如果想自动匹配并卸载,把下面脚本里的$targetSoftware换成你要卸载的软件名称(支持通配符*)即可:
$targetSoftware = "*你的软件名称*" $uninstallPaths = @( "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" ) # 查找目标软件的卸载信息 $targetApp = Get-ItemProperty $uninstallPaths | Where-Object { $_.DisplayName -like $targetSoftware -and $_.UninstallString -ne $null } if ($targetApp) { foreach ($app in $targetApp) { # 处理卸载字符串,去掉多余的引号 $uninstallCmd = $app.UninstallString -replace '"', '' Write-Host "正在卸载: $($app.DisplayName)" # 执行卸载命令,静默等待完成 Start-Process -FilePath "cmd.exe" -ArgumentList "/c $uninstallCmd" -Wait -NoNewWindow } } else { Write-Host "未找到目标软件: $targetSoftware" }
关于Get-RemoteProgram的小问题
这个命令默认可能只查询了部分注册表路径,你可以查看它的参数说明,或者修改它的逻辑,让它包含上面提到的三个注册表路径,这样就能列出所有非微软软件了。
内容的提问来源于stack exchange,提问作者Pogo




