Wix:有条件的延期自定义操作

时间:2010-11-30 18:39:21

标签: wix windows-installer custom-action

我们有一个自定义操作,我们只想在主要升级时运行。麻烦的是,CA被推迟,因为它需要访问系统文件(它从INI文件中删除旧版本的程序)。由于CA是延迟的,因此它只能访问CustomActionData属性。

所以我的第一次尝试是在UPGRADINGPRODUCTCODE为真时设置CustomActionData,然后调整实际在CustomActionData上进行升级的CA.失败了 - 我没有设置CustomActionData,我认为因为它只在自定义操作中可见,并且不能用作自定义操作的条件。

以下是我定义的CA:

  <CustomAction Id="MyCA.SetProperty" Return="check" Property="MyCA"
    Value="[UPGRADINGPRODUCTCODE]" />

  <CustomAction
      Id="MyCA"
      BinaryKey="MyIniProcessingProgram"
      ExeCommand="MyArgs"
      Execute="deferred"
      Impersonate="no"
  Return="ignore"/>

这是我的InstallExecuteSequence:

<RemoveExistingProducts After="InstallValidate" />
<Custom Action="MyCA.SetProperty" Before="InstallFinalize"/>
<Custom Action="MyCA" After="MyCA.SetProperty">
    CustomActionData
</Custom>

我也尝试过:

  • 使MyCA.SetProperty以UPGRADINGPRODUCTCODE为条件,然后在它之后安排MyCA - 不起作用,因为即使MyCA.SetProperty没有运行,“After”动作也可以。

最好是我们可以避免JavaScript / VBScript操作,或者在INI更新程序本身中检查CustomActionData的值;我的想法是让CA 本身有条件,所以除非条件(主要升级)为真,否则我们不会启动它。

2 个答案:

答案 0 :(得分:1)

为什么不使用此自定义操作:

<CustomAction
      Id="MyCA"
      BinaryKey="MyIniProcessingProgram"
      ExeCommand="MyArgs"
      Execute="deferred"
      Impersonate="no"
Return="ignore"/>

使用此InstallExecuteSequence?

<Custom Action="MyCA" After="InstallValidate">
      UPGRADINGPRODUCTCODE
</Custom>

请注意,UPGRADINGPRODUCTCODE在正在升级的软件包中设置,因此仅在旧版本的卸载过程中可用。

如果要检测新版本中的升级,可以使用“升级”表中的“ActionProperty”列: http://msdn.microsoft.com/en-us/library/aa372379(VS.85).aspx

基本上,您需要为较旧版本和较新版本定义升级规则: http://wix.sourceforge.net/manual-wix2/wix_xsd_upgradeversion.htm

这样您就可以通过自定义属性检测旧版本。然后,可以使用此属性来调整自定义操作。

答案 1 :(得分:0)

用于执行任何操作(包括延迟)的条件是直接序列的条件。这意味着您可以直接使用UPGRADINGPRODUCTCODE作为条件的一部分,即使是您的延期操作。

当安装程序在即时阶段达到此序列时,它将评估条件,并在条件为真时安排延迟执行。然后,当它运行延迟序列时,它将只运行在即时阶段安排的所有操作。