自定义操作仅在安装时执行,但不在更新时执行,不在卸载时执行

时间:2014-09-05 06:39:53

标签: wix windows-installer wix3.8

我正在使用Wix 3.8。

首先,我创建一个安装程序(.msi),在安装过程中执行自定义操作(出于测试目的,它只显示一条消息):

产品元素:

<Product Id="PUT-GUID-HERE" Name="MyProduct" 
         Version="1.0.1.100" Manufacturer="Foobar Company"
         UpgradeCode="PUT-GUID-HERE">

自定义操作

<CustomAction Id="Message1" Script="vbscript">
<![CDATA[
MsgBox("First Install?")
]]>
</CustomAction>

<InstallExecuteSequence>
<Custom Action="Message1" 
        Before="InstallInitialize">NOT Installed AND NOT REMOVE</Custom>

现在当我执行我的.msi文件时,消息将显示在我的安装上:

message box

接下来,我修改产品代码并增加版本号以构建更新:

产品元素:

<Product Id="PUT-GUID-HERE" 
         Name="MyProduct" Version="1.0.2.100" 
         Manufacturer="Foobar Company" 
         UpgradeCode="PUT-GUID-HERE">

关于我期望的条件NOT Installed AND NOT REMOVE,当我执行更新时,消息框不会出现。但确实如此:

message box

仅在安装时执行但不在更新时执行的自定义操作的正确条件是什么?

2 个答案:

答案 0 :(得分:1)

最后,它满足以下条件:

NOT (WIX_UPGRADE_DETECTED OR UPGRADINGPRODUCTCODE) AND NOT (REMOVE="ALL")

使用此条件,我的操作仅在安装时作出反应,但不在更新时作出反应,而不是在卸载时作出反应。

重要提示:安装程序和更新的.msi必须包含该条件。

答案 1 :(得分:1)

小心自定义操作的条件,它们很难做到正确。这是一个 MSI Conditions Cheat Sheet 来帮助您。我没有测试过这些条件 - 测试是唯一的保证。这是another sheet with more advanced info(推荐)。

这是一篇有趣的帖子:How to add a WiX custom action that happens only on uninstall (via MSI)?

您建议的条件看起来不错,但请查看表格。此外 - 补丁还具有特定于补丁的属性,如PATCH和MSIPATCHREMOVE。在自定义操作上使用这些条件,以使它们在修补程序期间运行或不运行,具体取决于所需的操作。如果您打算使用补丁程序,我应该在您修改补丁期间将自定义操作设置为

我为你删除了硬编码的guid。小心张贴guids - 只需简单的复制并粘贴你的独特guid就不再那么独特了。所有硬编码指南都可能导致真正的问题。