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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何仅在安装和修改时执行条件自定义操作?相关的知识,希望对你有一定的参考价值。

我有一个工作正常的安装程序。我想仅在安装和修改时运行自定义操作。这是我的自定义操作:

<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>

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

答案

InstallFinalize:你写信给HKCUHKLM?在InstallFinalize之后排序的任何内容都不会在托管环境中运行升级,因此如果您尝试写入HKLM,则会在安装期间失败(除非您更改了您写入的密钥的ACL - 或者您从cmd.exe中删除了MSI已升高 - 不推荐,包装有缺陷)。

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

测试条件:条件可能难以测试,您需要在许多安装模式(installuninstallrepairmodifypatchmajor upgradeself-repairetc...)进行实际测试,以确保它们适合您的特定情况并且可以工作预期。人们对条件反应感到惊讶的一个典型情况是重大升级 - 卸载旧版本和安装新版本 - 它往往会在我的经验中显示出意外的条件问题。通常由于复杂的排序问题以及在此类升级过程中旧设置的卸载顺序和新设置的安装顺序都会运行。因此,在主要升级过程中,错误的条件自定义操作可能会运行多次并导致真正的混乱。

测试提示:要实现快速主要升级,您需要更改产品代码并提升版本的前3位数之一。你需要在那里有MajorUpgrade元素。您可以将产品代码设置为自动生成,方法是将其设置为*(我更喜欢手动更改)。编译一个MSI,用"_Version1"后缀,然后执行提到的更新并编译"_Version2"。运行升级顺序。您还应该通过更改源路径指向版本2的更新文件,但是您可以在没有它的情况下滚动以测试条件。

修改:对于你的情况,有一个来自Installshield家伙的备忘单建议他们的"MSI Condition Cheat Sheet"中的以下情况:

  • Installed AND NOT REINSTALL AND NOT REMOVE~="ALL"
  • 上述条件应该使自定义操作仅在修改操作中运行。如果你稍微更改它应该只适用于安装和修改:
  • NOT Installed OR ((Installed AND NOT REINSTALL) AND NOT REMOVE~="ALL")

我明天必须对最后一个条件进行额外的检查,但我发布这个以便你自己进行测试。我拿出PATCH,但也许我应该把它添加回来覆盖主要的升级补丁。你会提供补丁吗?


轻量级条件测试的快速样机:

The VBScript

注意!确保VBScript文件位于UTF8ANSI中。 Unicode不起作用。也许在记事本而不是Visual Studio中创建它。我在将VBScript文件创建为WiX文本文件时遇到了问题,然后将其重命名为*.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

<InstallExecuteSequence>
   <Custom Action='SayHelloMsgBox.vbs' After='InstallInitialize'>NOT Installed OR ((Installed AND NOT REINSTALL) AND NOT REMOVE~="ALL")</Custom>
</InstallExecuteSequence>

以上是关于如何仅在安装和修改时执行条件自定义操作?的主要内容,如果未能解决你的问题,请参考以下文章

Wix:修补时运行条件自定义操作(非完整安装)

如何在片段着色器中进行自定义模板测试

片段的条件自定义 OnBackPress

条件片段和导航重用

VSCode 如何操作用户自定义代码片段(快捷键)

InstallShield 执行卸载自定义动作