Wix 安装程序有选择地卸载以前的版本

Posted

技术标签:

【中文标题】Wix 安装程序有选择地卸载以前的版本【英文标题】:Wix installer selectively uninstall previous versions 【发布时间】:2016-05-21 17:38:29 【问题描述】:

我有一个 wix 安装程序,用于安装不同版本的软件。允许并行安装相同的软件(不同版本)。 wix 产品代码为“*”,因此始终是重大升级。

现在,我需要有选择地卸载以前版本的软件。为此,我在 UpgradeVersion 标签中定义了版本范围?

<Upgrade Id="ID">
  <UpgradeVersion  Minimum="0.0.0.0" Maximum="0.5.0.0" IncludeMinimum="yes" IncludeMaximum="no" Property="FORCEREMOVEOLDVERSION" />
  <UpgradeVersion  Minimum="0.6.0.0" Maximum="0.7.0.0" IncludeMinimum="yes" IncludeMaximum="yes" Property="SELECTIVELY_UNINSTALL" />
  <UpgradeVersion  Minimum="0.8.0.0" Maximum="1.5" IncludeMinimum="yes" IncludeMaximum="yes" Property="OLDERVERSIONDETECTED" />
</Upgrade>

这非常有效。但是,当我必须有选择地卸载 0.6 - 0.7 范围时,我如何有一个单独的操作来执行此操作,因为只有一个 RemoveExistingProducts 标记。

<InstallExecuteSequence>
    <RemoveExistingProducts Overridable="no"  Before="InstallInitialize" /> 
</InstallExecuteSequence>

您能否建议一种可行的方法来检查“SELECTIVELY_UNINSTALL”标志并删除此范围(0.6-0.7),同时自动删除其他以前的版本?

谢谢。

【问题讨论】:

我认为问题在于那些已安装的产品都具有相同的升级代码,并且我相信 Windows Installer 会选择其中一个已安装的产品来卸载,而不是全部卸载。如果产品并行安装并且需要选择性升级,那么它们都需要不同的升级代码。然后,您可以在任何升级安装中使用升级元素来决定要替换哪些旧产品。 【参考方案1】:

我从来没有借此机会亲自验证这一点,但应该有一种非常简单的方法来处理这个问题。要理解它,首先你必须了解FindRelatedProducts 和RemoveExistingProducts 做了什么。键在 FindRelatedProducts 的第二句,RemoveExistingProducts 的第一句:

当 FindRelatedProducts 检测到升级信息和已安装产品之间的对应关系时,它会将产品代码附加到 UpgradeTable 的 ActionProperty 列中指定的属性中。

RemoveExistingProducts 操作遍历升级表的 ActionProperty 列中列出的产品代码,并通过调用并发安装按顺序删除产品。

鉴于您希望始终删除在FORCEREMOVEOLDVERSIONOLDERVERSIONDETECTED 中找到并存储的任何先前版本,但有条件地删除在SELECTIVELY_UNINSTALL 中找到并存储的任何版本,您所要做的就是有条件地清除属性@987654326 @。在更复杂的场景中,您甚至可以解析存储在 ActionProperty 引用的属性中的产品代码列表,并仅删除其中的一些。

请注意,这不允许您通过将产品代码添加到操作属性来解决ALLUSERS 必须匹配的要求。

【讨论】:

以上是关于Wix 安装程序有选择地卸载以前的版本的主要内容,如果未能解决你的问题,请参考以下文章

Wix“高级”安装不会卸载以前的版本

如何实现 WiX 安装程序升级?

WIX:安装应用程序的多个实例并升级应用程序(如果安装在以前安装的位置)

无需卸载的 Wix 安装程序升级

恢复到以前版本的 wix 安装程序

回滚到以前版本的 WiX 捆绑安装程序