删除捆绑包中的 MSI 包而不包括源
Posted
技术标签:
【中文标题】删除捆绑包中的 MSI 包而不包括源【英文标题】:Removing an MSI package in a bundle without including the source 【发布时间】:2018-08-16 08:51:38 【问题描述】:我有一个 WIX Bootstrapper Burn 包,其中包含 4 个 MsiPackage 并已在生产中发布。我们最新版本的捆绑包不再提供其中一个包,如果该包存在,则应将其卸载。在不提供捆绑包中的整个 msi 的情况下卸载 MsiPackage 的最佳方法是什么?
我试过了:
-
从链中完全删除 PackageGroup - 这将留下产品。
添加 MsiPackage 并将安装级别设置为 0 - 这需要非常大的负载,因为要删除的 msi 很大。
我也尝试使用产品搜索来查找状态
<util:ProductSearch Id="AppX" UpgradeCode="XXXXXX-XXXX-XXXX-XXXX-XXXXXXXX" Result="state" Variable="APPXSTATE" />
但尝试将其连接到 ExePackage 以运行 msiexec /x UpgradeCode 但我认为卸载方式是错误的。
如果更新代码 X 存在于这个较新的刻录安装程序中,我用 UpgradeCode X 清除 msi 的最佳方法是什么?
谢谢
【问题讨论】:
【参考方案1】:注意:我不知道有任何自动魔术构造可与 util:ProductSearch 合作使用以卸载现有的 MSI 安装。
升级表:我假设四种不同的产品有不同的升级代码“每个家庭”?如果是这样 - 如果您确定它永远不需要再次安装 - 那么我想您可以指定应该通过对您将继续交付的一个或多个软件包的重大升级来卸载它。 注意:即使所有设置共享相同的升级代码,也可以卸载,但这需要更多的关注和测试。
此解决方案涉及将要删除的 MSI 的升级代码添加到要保留的那些 MSI 设置的升级表中,并指定将卸载所有“已知的先前版本”的版本范围。可以在此处找到有关如何执行此操作的技术详细信息:Adding entries to MSI UpgradeTable to remove related products。如前所述,对于将保留的产品之一这样做就足够了,但您可以确保所有产品都这样做。如果产品已被卸载,则不会出现错误。我可能想为目标版本设置一个比该技术示例中显示的范围更小的范围。
ExePackage:应该可以按照您的建议通过使用 ExePackage
来卸载。我想它可以直接运行 msiexec.exe
,或者可能启动一个 VBScript、Powershell 脚本,甚至是一个批处理文件,或者你自己从 C++ 或 C# 编译的 EXE 文件(后者具有不幸的运行时要求)。我从未尝试过这种方法。
请注意,您不会像使用 msiexec.exe /x UpgradeCode
那样通过升级代码卸载 - 至少我从来没有能够使这项工作(暂时未测试)。相反,您需要通过 产品代码 (How can I find the product GUID of an installed MSI setup?) 进行卸载,或者您可以使用 VBScript 和 MSI API 自动化通过 Installer.RelatedProducts
进行卸载strong> 功能,然后以这种方式开始卸载,如下所示:Powershell: Uninstall application by UpgradeCode。这类似于 Windows Installer 处理升级表时发生的情况。所有相关产品 - 共享相同升级代码的产品 - 都会被列举出来,您可以按照自己的方式处理它们。
一些链接:
Powershell: Uninstall application by UpgradeCode WIX (remove all previous versions) Wix upgrade goes into maintenance mode and never does upgrade【讨论】:
感谢您的建议,我将通读它们,看看它们在我的解决方案中是如何工作的。是的,所有 4 款产品都有不同的升级代码,捆绑包中的 3 款将收到新版本。我曾考虑过仅提供升级代码和更新版本的剥离 MSI 并进行卸载。当我有更多结果时会回复。 一般而言,您可以使用任何其他 MSI 设置中的任何升级代码卸载 MSI 文件。只需正确编写升级表以针对您要卸载的正确版本。以上是关于删除捆绑包中的 MSI 包而不包括源的主要内容,如果未能解决你的问题,请参考以下文章