如何仅在安装和修改时执行条件自定义操作?

时间:2018-09-17 14:54:39

标签: wix windows-installer custom-action

我有一个可以正常运行的安装程序。我只想在安装和修改中运行自定义操作。这是我的自定义操作:

<Custom Action="UpdateAPMDBAPasswordAndStoreInRegistry" After="InstallFinalize"><![CDATA[&BaseModel = 3 OR &FeaturePostMaster = 3]]></Custom>

修改安装程序时,上述自定义操作未运行。它仅在安装安装程序时运行。谷歌搜索后,我做到了,但它也不起作用:

<Custom Action="UpdateAPMDBAPasswordAndStoreInRegistry" After="InstallFinalize"><![CDATA[(&BaseModel = 3 OR &FeaturePostMaster = 3) AND (NOT Installed OR MaintenanceMode="Modify")]]></Custom>

它也仅在安装模式下运行。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

InstallFinalize :您写给 HKCU 还是 HKLM ?在托管环境中,在 InstallFinalize 之后排序的所有内容都不会在提升环境下运行,因此,如果您尝试写入 HKLM ,除非安装失败,否则在安装过程中将失败。更改您写入的密钥的ACL-或从已经提升的cmd.exe中启动MSI-不推荐,该软件包有缺陷)。

MaintenanceMode :该条件看起来像特定于Installshield:NOT Installed OR MaintenanceMode="Modify"。我认为Installshield本身会以专有方式设置 MaintenanceMode 属性。因此,它根本无法在WiX中使用。

测试条件 :条件可能难以测试,您需要在许多安装模式(install,{{1} },uninstallrepairmodifypatchmajor upgradeself-repair),以确保它们适合您的特定情况并按预期工作。人们对条件感到惊讶的典型场景是主要升级-卸载旧版本并安装新版本-根据我的经验,它往往会揭示条件方面的意外问题。通常是由于复杂的排序问题以及在升级过程中既运行旧安装程序的卸载序列又运行新安装程序的安装序列的事实。因此,条件错误的自定义操作可能会在主要升级过程中运行几次,并造成真正的混乱。

测试技巧 :要进行快速的重大升级,您需要更改产品代码并提高版本的前3位数字之一。并且您需要在其中具有MajorUpgrade元素。您可以通过将产品代码设置为etc...来设置产品代码以自动生成(我更喜欢手动更改)。编译MSI,在其后缀*,然后进行上述更新并编译"_Version1"。运行升级序列。您还应该通过更改源路径来指向版本2的更新文件,但是也可以不使用它来测试条件。

修改 :对于您的情况,Installshield个人收到一份备忘单,提示他们的"MSI Condition Cheat Sheet"有以下情况:

  • "_Version2"
  • 以上条件应使自定义操作只能在修改操作中运行。如果稍加更改,它仅适用于安装和修改:
  • Installed AND NOT REINSTALL AND NOT REMOVE~="ALL"

明天明天我将不得不对最后一种情况进行额外的检查,但我只是将其发布,以便您可以进行自我测试。我拿出了PATCH,但也许我应该重新添加它以涵盖主要的升级补丁。您会交付补丁吗?


用于轻量状态测试的快速样机

NOT Installed OR ((Installed AND NOT REINSTALL) AND NOT REMOVE~="ALL")

注意! 。请确保VBScript文件位于The VBScriptUTF8中。 Unicode不起作用。也许在记事本而不是Visual Studio中创建它。将VBScript文件创建为WiX文本文件,然后将其重命名为ANSI格式时,我遇到了问题。不要那样做。

*.vbs

MsgBox "I run, therefore I am conditioned and sequenced"

WiX Markup, Custom Action

<Binary Id='SayHelloMsgBox.vbs' SourceFile='SayHelloMsgBox.vbs' /> <CustomAction Id='SayHelloMsgBox.vbs' VBScriptCall='' BinaryKey='SayHelloMsgBox.vbs' Execute='immediate' Return='ignore' />

WiX Markup, Sequencing & Conditioning