删除软件包中的MSI软件包,但不包括源代码

时间:2018-08-16 08:51:38

标签: wix windows-installer burn

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

我尝试过:

  1. 从链中完全删除PackageGroup-这将使产品滞后。
  2. 添加MsiPackage并将installlevel设置为0-这将需要非常大的有效负载,因为要删除的msi很大。

我还尝试使用产品搜索来找到状态

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

但是尝试将其连接到ExePackage以运行msiexec / x UpgradeCode,但我认为这是错误的卸载方式。

如果此更新的Burn Installer中存在升级代码X,对我来说清除它的最佳方法是什么?

谢谢

1 个答案:

答案 0 :(得分:2)

  

注意:我不知道可以与 util:ProductSearch 一起使用的任何自动魔术构造来卸载现有的MSI   安装。

升级表 :我假设四种不同的产品具有“每个系列” 不同的升级代码?如果是这样(如果您是肯定的,则不再需要再次安装),那么我想您可以指定应通过主要升级为将继续提供的一个或多个软件包卸载它。 注意:即使所有设置共享相同的升级代码,也可能会进行卸载,但这需要更多的照顾和测试。

此解决方案涉及将要删除的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 自动化,通过 {{1 }} 功能,然后开始卸载,如下所示:Powershell: Uninstall application by UpgradeCode。这类似于Windows Installer处理升级表时发生的情况。枚举了所有相关产品(共享相同升级代码的产品),您可以按需进行处理。


某些链接