在不包含源的情况下删除捆绑包中的 MSI 包

Removing an MSI package in a bundle without including the source

我有一个 WIX Bootstrapper Burn 包,其中包含 4 个 MsiPackages 并已在生产中发布。我们最新版本的捆绑包将不再提供其中一个包,如果存在该包,则应将其卸载。在不提供捆绑包中的整个 msi 的情况下卸载 MsiPackage 的最佳方法是什么?

我试过:

  1. 从链中完全删除 PackageGroup - 这会留下产品。
  2. 添加 MsiPackage 并将安装级别设置为 0 - 这需要非常大的负载,因为要删除的 msi 很大。

我也试过使用产品搜索来查找状态

<util:ProductSearch Id="AppX" UpgradeCode="XXXXXX-XXXX-XXXX-XXXX-XXXXXXXX" Result="state" Variable="APPXSTATE" />

但试图将它连接到一个 ExePackage 到 运行 msiexec /x UpgradeCode 但我认为卸载的方法是错误的。

如果更新的刻录安装程序中存在 UpgradeCode X 清除 msi 的最佳方法是什么?

谢谢

Note: I am not aware of any auto-magic constructs to use in collaboration with util:ProductSearch to uninstall existing MSI installations.

升级Table:我假设四种不同的产品有不同的升级代码 "per family"?如果是这样 - 如果您确定它永远不需要再次安装 - 那么我想您可以指定应该通过对您将继续交付的一个或多个软件包进行重大升级来卸载它。 注意:即使所有设置共享相同的升级代码也可能卸载,但这需要更多的关注和测试。

此解决方案涉及将要删除的 MSI 的升级代码添加到要保留的那些 MSI 安装程序的升级 table 中,指定的版本范围将卸载所有 "known prior editions"。有关如何执行此操作的技术详细信息,请参见此处:。如前所述,对将保留的其中一种产品执行此操作就足够了,但您可以对所有产品执行此操作以确保万无一失。如果产品已经卸载,则不会出现错误。对于目标版本,我可能想设置一个比该技术示例中显示的范围更小的范围。

ExePackage:应该可以按照您的建议使用 ExePackage 卸载 代替。我想它可以 运行 msiexec.exe 直接启动,或者启动 VBScript、Powershell 脚本甚至批处理文件或您自己的从 C++ 或 C# 编译的 EXE 文件(后者具有不幸的 运行 时间要求)。我从来没有尝试过这种方法。

请注意,您不会像使用 msiexec.exe /x UpgradeCode 那样通过升级代码进行卸载 - 至少我从来没有能够做到这一点(不是测试了一段时间)。相反,您需要通过 产品代码 ), OR you can use VBScript and MSI API automation to uninstall by using the Installer.RelatedProducts function and then kicking off uninstall that way as shown here: Powershell: Uninstall application by UpgradeCode)卸载。这类似于 Windows 安装程序处理升级 Table 时发生的情况。所有相关产品- 那些共享相同升级代码的 - 已被枚举,您可以在处理它们时进行处理。


部分链接:

  • Powershell: Uninstall application by UpgradeCode
  • Wix upgrade goes into maintenance mode and never does upgrade