我搞砸了,我该如何卸载我的程序?

Posted

技术标签:

【中文标题】我搞砸了,我该如何卸载我的程序?【英文标题】:I screwed up, how can I uninstall my program? 【发布时间】:2012-03-30 20:01:42 【问题描述】:

我的 Wix 安装程序可以安装我的程序,但卸载时已损坏。一个文件被过早地删除了,并且需要进一步向下行。卸载程序失败并恢复其更改。

这意味着我无法从我的机器中删除该软件包,因此无法安装我的安装程序的任何其他版本(相当不便)。如何强制删除包?

【问题讨论】:

有两种主要方法:修复包(使用像 orca 这样的工具,或通过安装小升级),或者,仅针对内部案例,尝试删除痕迹并伪装它从未安装过。你想做什么? (如果是后者,你为什么不使用虚拟机?) 在尝试以下操作之前,请尝试运行Microsoft's own tool to solve installation / uninstallation problems。尝试下载并运行它,看看这是否首先解决了您的问题。下面应该可以工作,但有点hacky。 @SteinÅsmul 有正确答案。接受的答案搞砸了卸载程序 MSI,当尝试卸载它时,它一直说它与我的开发目录中的原始 MSI“不同步”(?!?!?)。 MS 的这个工具破坏了整个安装的东西。 @SteinÅsmul 使用该工具后我搞砸了。这可能是由于我取消了不完整的卸载造成的。它留下了一些注册表项,因此正常安装后的后续卸载不再删除文件和快捷方式。幸运的是,最近的系统还原点救了我。任何尝试使用此工具的人都不得取消卸载! 这样的清理总是不安全的,并且存在损坏和错误的风险。然而,其他清理方法甚至更危险——通常。如果您之前通过入侵注册表之类的方式完成了“半清理”,那么该工具几乎肯定会失败。 【参考方案1】:

更新,Stein ÅsmulInjecting this newer list of cleanup approaches


    C:\Windows\Installer 中查找您的程序包,Windows 会在其中保存已安装的 MSI 程序包的副本。名称是随机生成的,因此您必须查看文件的创建日期。

    使用Orca 打开 MSI 文件。 (可惜orca安装器没有简单的下载,可以通过安装Windows 10 SDK的“MSI Tools”,然后在C:\Program Files (x86)\Windows Kits中搜索orca.msi获取。)

    从CustomAction table 中删除有问题的自定义操作

现在您应该可以卸载软件包了。

更新:You can find the actual cache MSI file using Powershell。这是一个包,you can also get for all packages(向下滚动到第一个屏幕截图)。

【讨论】:

Wim,一位编辑建议修改。您可以查看编辑历史记录,看看您是否要进行任何更改? 我提出了这个建议,只是为了澄清它只有在您尝试通过运行已编辑的包而不是其他方式(例如 Ctrl 面板/程序和功能/卸载)来卸载它时才有效。也许我应该将通知添加为评论。 @BigJoe:通过程序和功能卸载实际上会使用 c:\windows\installer 中的 msi 文件 @WimCoenen 我认为它会,但在我的情况下它什么也没做,但是当我运行我编辑的 MSI 包时它卸载得很好(这导致我更新答案以节省其他人尝试它)。我一定是做错了什么,请原谅编辑并感谢您的回答! :) 这适用于几台计算机(通常是您的主开发箱),但如果您已将一个包大规模部署到多台计算机(企业部署),通常的解决方法是部署一个次要的升级,它会修复已安装产品的卸载顺序(以任何必要的方式)。【参考方案2】:

这个命令通常对我有用:

msiexec /fv installer.msi

它会重新缓存安装程序,因此您可以使用更正的安装程序重试。

有一次这个命令不起作用,我不得不使用 Microsoft FixIt。它解决了问题(对我来说相当震惊)。

【讨论】:

这对我有帮助 - 我在没有 .net 4 的机器上安装了具有 .net 4 自定义操作的软件包失败。而且我也无法卸载它。我已经修复了 msi 并且能够使用 /fv 开关运行它,之后我能够像往常一样卸载它。 让我感到困惑的一件事是,我将产品代码设置为在每次构建时生成,因此我必须记住获取缓存包的产品代码并在构建固定安装程序时使用它.【参考方案3】:

根据您描述的行为的确切原因,您可能至少有几个选择。

如果失败的原因是在卸载时运行的自定义操作,并且此自定义操作以您可以影响的某些属性为条件,您可以尝试通过命令行传递所需的值:

msiexec /x YOUR-PRODUCTCODE-HERE RUNMYACTION=false

在此示例中,RUNMYACTION 是参与自定义操作条件的 Windows Installer 属性,如果您将 false 作为其值传递,则操作将不会运行。

否则,您可以修复逻辑(或直接禁用自定义操作)并构建新的 MSI 包。然后将其上传到目标机器,并像这样运行:

msiexec /i YourPackage.msi REINSTALL=ALL REINSTALLMODE=vomus

这里YourPackage.msi是一个新的固定包,REINSTALL=ALL指示msiexec使用这个新包重新安装产品,REINSTALLMODE=vomus(它的v部分)将重新缓存MSI 包,之后您就可以正常删除它了。

附注:您应该在虚拟机上测试您的安装,以免冒您真正的风险。

【讨论】:

【参考方案4】:

仅供参考:在 Windows 8.1 中,安装程序已移至此处:C:\ProgramData\Package Cache\

【讨论】:

不,这实际上是不正确的。 ProgramData 中有一个缓存,但它是 WiX 生成的 MSI 文件 (info towards the bottom here) 的源文件的缓存。 Windows Installer 引擎本身仍缓存在%SystemRoot%\Installer,但there are some changes to how the caching is performed。【参考方案5】:

如果您真的很绝望并且以上所有解决方案都不起作用,请尝试

msizap.exe

这将清除安装程序在机器上的所有内容 小警告

在不知道要使用哪些选项运行 msizap 的情况下不要运行它(对于选项列表,请先运行 msizap /?)。

【讨论】:

【参考方案6】:

我也用过这个来自微软的小工具

https://support.microsoft.com/en-us/help/17588/fix-problems-that-block-programs-from-being-installed-or-removed

基本上,此工具可用于“修复问题,包括阻止您安装或删除程序的损坏的注册表项”

修复了什么:

    64 位操作系统上的注册表项损坏

    控制更新数据的注册表项损坏

    阻止安装新程序的问题

    阻止完全卸载或更新现有程序的问题

    阻止您通过控制面板中的添加或删除程序(或程序和功能)卸载程序的问题

可用于:

Windows 7 Windows 8 Windows 8.1 Windows 10

【讨论】:

【参考方案7】:

我通常只是在注册表中查找<Your Installer's Name>.msi<Your Installer's Company Name> 并从Windows 安装程序树下的一些Products 中删除一些卸载密钥,之后一切正常且花花公子,尽管这WOULD 会留下一些东西,比如缓存的安装程序,以及可能为每个安装的文件留下大量其他注册表项,等等。但它 总是 在开发安装程序时对我有用,因为老实说,谁在乎剩下一个 MSI 并缓存在某处?反正你是用机器来开发的,对吧?

【讨论】:

以上是关于我搞砸了,我该如何卸载我的程序?的主要内容,如果未能解决你的问题,请参考以下文章

无法实例化抽象类我认为我搞砸了我的构造函数 C++

具有express-sessions和express-mysql-session的NodeJS没有设置会话。我搞砸了哪里?

Gradle 在 Android Studio 中搞砸了我的应用程序,如何修复?

scikit-learn 回归预测结果太好了。我搞砸了啥?

日期选择器搞砸了

如何卸载 RVM? [复制]