基于模式 - WIX执行自定义操作

vra*_*js5 8 windows-installer custom-action wix

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

但我们无法设定适当的条件.你可以参考代码:

<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>
Run Code Online (Sandbox Code Playgroud)

请告诉我们我们做错了什么.上面的代码即使是卸载也调用InstallFinalize.

Cos*_*rvu 10

您可以尝试以下条件:

ActionForInstall:

REMOVE <> "ALL"
Run Code Online (Sandbox Code Playgroud)

ActionForUninstall

REMOVE = "ALL"
Run Code Online (Sandbox Code Playgroud)


Chr*_*ter 5

通常使用产品级属性(如未安装和REMOVE ="ALL")的条件不符合您的预期.通常最好使用组件动作状态,例如

$ COMPONENTNAME = 3 < - 在本地安装的组件

$ COMPONENTNAME = 2 < - 组件之前已安装,现在正在删除

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

您可以使用"&"运算符对功能执行类似的操作,但通常使用组件"$"更好,因为组件是物理的,并且可以与一个或多个仅符合逻辑的功能相关联.

如果你真的想把它提升到一个新的水平,那么你的自定义动作可以(应该)使用外键连接到Component表来进行数据驱动.在这种情况下,您的自定义操作始终触发,然后查询表并评估组件操作状态以确定需要调度哪些操作.

条件语句语法(Windows)