如何清理损坏或丢失的安装(在 add/remove 程序中不可见):此产品的另一个版本已安装错误

How to clean up a corrupted or missing installation (not visible in add/remove programs) : Another version of this product is already installed error

我在 windows Server 2012 机器上,但有些东西出了问题。我试图从 add/remove 程序工具中卸载我的应用程序。当我尝试这样做时,我看到以下错误消息:

所以我继续删除了以下注册表项,Windows 管理 add/remove 程序工具中所有已安装应用程序的列表:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{C14DB2B2-6089-4C96-A878-77BA377BABBF}]

在这个特定路径中,借助其中的 DisplayName 密钥,我能够确定 C14DB2B2-6089-4C96-A878-77BA377BABBF guid 配置单元属于我的产品

此后,我不再在 add/remove 程序工具 window 中看到我的应用程序。所以,我以为我完成了。

<<看到@Nikolay的回答后更新>>

在这个混乱之后尝试进行全新安装时,有两种方法可以遇到我遇到的错误。我正在解释这两条路线:

  1. 当我尝试通过 运行 相同的 myapplication.msi 文件安装应用程序时,当我在欢迎屏幕上单击 "Next" 按钮时,它显示在屏幕下方。好像程序还在安装:

  1. 在另一个混乱中,我的 MSI 在构建过程中以某种方式被重命名,开始发出新的 MSI 名称 myapplication_x.msi。当我尝试通过 运行 新命名的 myapplication_x.msi 文件安装应用程序时,它会给我如下所示的错误消息框:

总的来说,我无法为我的产品安装新的 MSI,而且我在 "add/remove programs" window 中也没有看到任何东西。看来我仍然缺少注册表 stand-point 中的某些内容。有人可以通过清理更多的注册表项或更好的方法来帮助我解决这个问题吗?

删除条目 Uninstall\{xxxxxxxxx} 并没有真正卸载该产品。它类似于从桌面删除程序快捷方式。这并没有真正删除程序。

尝试点击 "Remove" 而不是 add/remove 控制面板中的 "Modify" 按钮。如果只有一个按钮 "Modify/Remove",那么您可以尝试从命令行中删除该程序,如下所示:

> msiexec /x {C14DB2B2-6089-4C96-A878-77BA377BABBF}

在最坏的情况下,如果您通过编辑注册表将系统完全搞砸了,可能还有另一种选择:MsiZap.exe tool已弃用不支持不安全 工具),可以清除指定 MSI 的所有注册表项。

更新:如果您有无法卸载的应用程序,可以尝试新的 FixIt tool from Microsoft

该错误表明您正在尝试将软件包 "related" 安装到当前计算机上的软件包,而没有向 msiexec 提供适当的说明。这个包大概是一个小更新或小升级(虽然可能不是有效的,我会特别怀疑任何以后的卸载问题)。通常要安装此类更新,您需要指定

msiexec /i myapplication.msi REINSTALL=all REINSTALLMODE=vomus

或者,如 Nikolay 所述,使用 msiexec /x {product-code} 正确卸载现有软件包(您在注册表的卸载项中看到的 guid 是您的产品代码)。

如果这不起作用,请将您的测试 VM 恢复到干净状态并重新开始。

@Nikolay 的回答帮助我解决了我的问题,并且是一种非常干净的方法。但是在解决这个问题的适当过程中,我想出了一个注册表项,如果您的机器上的情况更加混乱,它可能会有所帮助。删除此注册表项最初也有助于解决此问题。删除此注册表项后,我的新安装程序开始运行。

此注册表项存在于 HKEY_CLASSES_ROOT 中。您将必须通过在 HKEY_CLASSES_ROOT 配置单元上使用您的产品名称启动搜索来搜索所需的注册表。完整路径如下:

[HKEY_CLASSES_ROOT\Installer\ProductsB2BD41C980669C48A8777AB73B7BAFB]

注意:以上路径中显示的guid不是产品代码,而是运行安装程序在产品注册时随机生成的guid。

我刚刚提到了这个注册表路径,以防有人发现它在更混乱的情况下有用,比如我遇到的情况。