2011-04-14 62 views
8

我们为我们的应用程序创建了WIX安装程序。我们面临的问题是: 我们已经定义了两种不同的自定义操作(比如ActionForInstall和ActionForUninstall),我们希望在以下情况下执行: ActionForInstall:应该在安装,产品升级,维护模式(用于修复和修改)时运行 ActionForUninstall :只能运行卸载。基于模式执行自定义操作 - WIX

但我们无法设置适当的条件。您可以参考代码:

<Custom Action=ActionForInstall After='InstallFinalize' > 
    (NOT Installed) OR (Installed AND ((MaintenanceMode = "Modify") OR (MaintenanceMode = "Repair")) AND (NOT (MaintenanceMode = "Remove"))) OR ((UPGRADINGPRODUCTCODE) AND NOT(REMOVE ~= "ALL")) 
</Custom> 
<Custom Action=ActionForUninstall Before='InstallFinalize'> 
    Installed AND NOT UPGRADINGPRODUCTCODE 
</Custom> 

请让我们知道我们做错了什么。上面的代码甚至调用InstallFinalize进行卸载。

+1

有用速查表:http://www.flexerasoftware.com/webdocuments/PDF/IS-CHS-Common-MSI-Conditions.pdf。我喜欢通过将NOT PATCH添加到现有条件列表以及禁用UPGRADINGPRODUCTCODE来禁用它们以进行主要升级,从而禁用MSI修补程序运行的自定义操作。 – 2014-05-28 00:37:01

回答

10

您可以尝试以下条件:

ActionForInstall:使用产品级特性,如不安装

REMOVE <> "ALL" 

ActionForUninstall

REMOVE = "ALL" 
+0

根据自定义操作的安排位置以及如何执行卸载,REMOVE =“ALL”条件可能会失败。例如,当执行/ x卸载时,REMOVE属性将立即设置。但是,在执行维护操作并选择卸载时,REMOVE属性在成本核算之后才会设置。只是要注意的事情。我仍然认为,根据组件状态创建条件会更好。 – 2011-04-14 11:24:03

+0

@christopher你有......但是我们时间紧,我们没有任何wix专家..你在说什么可能需要更多的努力来理解和实施..所以我们使用@Cosmin给出的解决方案 – vrajs5 2011-04-15 04:49:44

+0

查看我的评论添加到上述关于主要升级和补丁安装的问题中。这些安装类型使用与主要安装,维护和卸载相同的安装顺序。将自定义操作设置为在这些安装类型期间不运行通常是有益的。 – 2014-05-28 00:42:47

5

一般条件和REMOVE = “ALL” 唐”达到您的预期。一般来说,最好使用组件动作状态,例如

$组件名= 3 < - 组件被安装在本地

$组件名= 2 < - 组件以前安装,目前正在移除

这通常会涵盖您的所有安装,卸载,维护,修复,升级方案。

您可以使用“&”操作符为功能做类似的事情,但通常使用组件“$”更好,因为组件是物理的,并且可以关联到一个或多个只有逻辑的功能。

如果您真的想将它提升到下一个级别,您的自定义操作可以(应该)使用外键连接到Component表进行数据驱动。在这种情况下,您的自定义操作总是触发,然后查询表并评估组件操作状态以决定需要安排哪些操作。

Conditional Statement Syntax (Windows)