WiX 安装程序在卸载时删除文件,但在升级时不删除

Posted

技术标签:

【中文标题】WiX 安装程序在卸载时删除文件,但在升级时不删除【英文标题】:WiX installer remove files on uninstall but not on upgrade 【发布时间】:2011-03-18 06:55:00 【问题描述】:

我有一个使用 WiX 安装程序安装的程序。

程序本身会在 [CommonAppDataFolder]\[MyAppName]\ 目录中创建许多文件。这些文件都具有相同的扩展名(我们称之为 .dat)。

升级时,我想保留这些文件。 在卸载时,我想删除这些文件。

我目前正在删除这些文件:

<Directory Id='CommonAppDataFolder'>
  <Directory Id='MyCommonAppDataFolder' Name='MyAppName'>
    <Component Id='RemoveFilesComponent' Guid='71cb0cd8-8459-4a8f-89b7-f00977aa7b70'>
      <RemoveFile Id='RemoveFiles' Name='*.dat' On='uninstall'/>
    </Component>
  </Directory>
</Directory>

我有这个来促进升级:

<InstallExecuteSequence>
  <RemoveExistingProducts After='InstallInitialize'/>
</InstallExecuteSequence>

现在,当我卸载时,.dat 文件已正确删除。 但是,当我升级时,.dat 文件也会被删除。我猜是因为升级正在对以前的版本执行卸载。

我是否正确地解决了这个问题?如何在升级时保留文件,而在卸载时删除它们?

【问题讨论】:

你有没有找到解决这个问题的方法。 很久以前,但我不记得了。我想我最终只是在卸载后将文件留在了 CommonAppDataFolder 中。 感谢马特的回答。 【参考方案1】:

一种选择是切换到次要更新。这有很多限制,所以并不像听起来那么容易。

【讨论】:

您的答案可能是在 wix burn 之前或早期阶段,所以我想知道您是否会或现在可以以不同的方式回答这个问题。是创建带有 2 个 msi 包的 wix 引导程序的可能解决方案。他的 .dat 文件将在第二个 msi 包中,并且不会升级。 如果原始包裹的运输方式不同,可以做很多事情。我回答假设他需要处理运送的东西。 @RobMensching 是否有未发货包裹的答案? (目前正在开发中)这将非常有帮助。谢谢!【参考方案2】:

您是否尝试向 RemoveExistingProducts 添加条件?这就是我会做的。

<RemoveExistingProducts After='InstallInitialize'>(NOT UPGRADINGPRODUCTCODE) AND (Installed)</RemoveExistingProducts>

【讨论】:

这似乎是我想要的,但当然这意味着升级时不会删除以前的版本。例如,我最终在“添加或删除程序”控制面板中为我的应用程序输入了多个条目。有什么解决方法吗? 您可以尝试在 InstallFinalize 之后删除现有产品。这将删除任何更改的文件和注册表设置,但保留您没有更改的内容。 IT 还可能与您的 ProductID 或版本有关。操作系统可能认为它完全是一个不同的程序。 内部升级是否会进行卸载和重新安装?还是覆盖 dll/文件?

以上是关于WiX 安装程序在卸载时删除文件,但在升级时不删除的主要内容,如果未能解决你的问题,请参考以下文章

WIX 安装程序,在卸载时,从临时目录中删除文件

卸载 WiX 时删除文件

卸载升级时如何摆脱wix中未使用的dll

卸载时未删除Windows服务(WIX 3)

如何在卸载时立即生成WIX执行命令

Wix 自定义卸载操作 - 如何在 msi 删除文件之前运行