You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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

火山引擎 最新活动