WiX:CustomAction基于另一个CustomAction

时间:2017-08-28 11:59:00

标签: wix windows-installer wix3.5 wix3 wix3.6

我是WiX的新手,所以我可能会非常直截了当地提出一些问题,但我无法通过Google搜索来获取更多帮助。

我想执行2个customActions,比如ca1和ca2,其中ca2的执行取决于ca1的结果,如下所示:

if ( ca1 == SUCCESS )
{
  Perform ca2
}

所以ca2只应该在我的ca1返回成功时执行(不会失败)。

在WiX中最简单的方法是什么?

4 个答案:

答案 0 :(得分:5)

您所描述的是默认值。如果自定义操作失败,则安装将中止,之后只能执行回滚操作。因此,为了使您的问题有意义,首先您必须忽略或以其他方式屏蔽您的第一个自定义操作的失败。

其次,一个动作知道另一个动作的返回结果的唯一方法是它是否通过调用MsiDoAction(或其某个包装器)来调用它。这样做会模糊自定义操作之间的界限,因此我假设这不是您所描述的情景。

第三种也是最后一种方式:找到一个外部沟通渠道。对于立即行动,我建议ca1在成功时设置属性(调用MsiSetProperty或像DTF的会话[ property ]这样的包装器),并且ca2读取(MsiGetProperty / MsiEvaluateCondition)或直接针对该财产的价值。对于延迟操作,属性不会传播,因此您必须识别其他一些通道。 (也许提前选择路径的临时文件会起作用。)

但Windows Installer的整个场景有点不寻常;我建议避免它。也许合并您的操作,以便在冒泡回到序列之前“内部”处理任何故障情形。或者,您的行动细节可能会导致更具体的建议。

答案 1 :(得分:2)

您绝不能使用立即模式自定义操作对系统进行更改。当具有提升权限的受限用户执行设置时,它们永远不会正常运行(即时模式操作永远不会提升,它们总是冒充用户,因此您尝试更改的任何内容都将触发访问被拒绝)。此外,它们可能无法在静默执行模式下运行,具体取决于您的排序(例如,如果您尝试从设置GUI调用它们)。

另一个" 外部沟通渠道" Michael Urman谈到的自定义操作之间可能是HKLM中的一个注册表项,您可以编写然后回读。

然而,真正的解决方案是尝试使用WiX的内置防火墙功能。它由知识渊博的MSI专家可靠地编写,并支持正确的回滚。它将远远超过任何人可以自己推出的东西: http://wixtoolset.org/documentation/manual/v3/xsd/firewall/firewallexception.html

答案 2 :(得分:1)

来自WiX文档here

    <InstallExecuteSequence>
         <Custom Action='FooAction1' After='InstallFiles'/>
         <Custom Action='FooAction2' After='FooAction1' Condition='FOOACTION1SUCCESS'/>
    </InstallExecuteSequence>

让您在FooAction1中的代码设置属性MsiSetProperty(&#39; FOOACTION1SUCCESS&#39;,&#39; 1&#39;) 现在FooAction2将仅在设置FOOACTION1SUCCESS属性时运行。但真的迈克尔·乌尔曼的回答是正确的。您应该在一个自定义操作中处理异常。

答案 3 :(得分:0)

让第一个自定义操作设置属性。如果该属性存在或设置为期望值,则仅运行第二个自定义操作。