Installation WIX自定义操作-在不同时间运行以进行安装、升级和卸载

Installation WIX自定义操作-在不同时间运行以进行安装、升级和卸载,installation,wix,custom-action,Installation,Wix,Custom Action,我有一个自定义操作,在卸载过程中删除各种目录。我想在安装顺序中的不同点调用此操作,具体取决于正在执行的操作: 在安装过程中,不要运行自定义操作 在升级过程中,在移除现有产品后运行自定义操作 卸载期间,请在移除文件夹后运行自定义操作 我可能可以让每一个单独工作,但我如何让他们一起工作,我想如何。我尝试了类似的方法(一些代码取自): 已找到但未安装NewerProduct 升级产品代码 (不升级ProductCode)和(REMOVE=“ALL”) 但是当我进行构建时,会得到一个重复的符号错

我有一个自定义操作,在卸载过程中删除各种目录。我想在安装顺序中的不同点调用此操作,具体取决于正在执行的操作:

  • 在安装过程中,不要运行自定义操作
  • 在升级过程中,在移除现有产品后运行自定义操作
  • 卸载期间,请在移除文件夹后运行自定义操作
我可能可以让每一个单独工作,但我如何让他们一起工作,我想如何。我尝试了类似的方法(一些代码取自):


已找到但未安装NewerProduct
升级产品代码
(不升级ProductCode)和(REMOVE=“ALL”)

但是当我进行构建时,会得到一个重复的符号错误。任何帮助都将不胜感激

自定义操作只能在一个序列中执行一次。不过,我有一些更大的顾虑:你在做什么类型的升级?主要升级会卸载以前的产品,因此您的CA可能会以您描述的方式运行两次


我会在这里轻手轻脚的。您是否可以使用WiX RemoveFolder元素(MSI RemoveFile表)。这将更容易和可靠地实现。如果您必须使用自定义操作,我将使用组件操作状态来确定它应该何时运行,而不是像上面所示的更通用的属性。

您还可以使用RemoveFiles来清除目录中的无关文件

这是我正在进行的一次重大升级,但卸载不会删除添加到文件夹中的文件,因此卸载后通常会留下一些东西。与我使用的属性相比,使用组件动作状态会给我带来什么好处?干杯,马特。看看元素。您可以指定目录Id和文件规范,这将教会MSI为您执行额外的清理。这样你就不必处理所有这些有风险的自定义操作。只有当文件夹为空时,它才起作用吗?最后,我使用了一个自定义操作,但希望下次完全在安装程序中执行。您有1个文件夹或文件夹树要删除吗?正确,它只删除空的(排除树),但如果你说。并且没有子文件夹(或者如果您知道子文件夹的名称并说。对于它们),那么您应该可以。我有一个应用程序写入文件的子文件夹树,因此在卸载时我不知道文件夹中放置了哪些新文件。
<InstallExecuteSequence>

  <Custom Action="PreventDowngrading" After="FindRelatedProducts">
    NEWERPRODUCTFOUND AND NOT Installed
  </Custom>

  <LaunchConditions After="AppSearch" />
  <RemoveExistingProducts Before="InstallInitialize" />

  <!-- NEW _> Clean old files AFTER uninstall during an upgrade -->
  <Custom Action="CleanUp"  After="RemoveExistingProducts" >
    UPGRADINGPRODUCTCODE
  </Custom>

  <!-- NEW _> Clean old files LAST during an uninstall -->
  <Custom Action="CleanUp"  After="RemoveFolders" >
    (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
  </Custom>

</InstallExecuteSequence>