InstallFinalize:你写信给 HKCU 还是 HKLM?在 InstallFinalize 之后排序的任何内容都不会在托管环境中运行提升,因此如果您尝试写入 HKLM(除非您将 ACL 更改为您写入的密钥 - 或者您从已经提升的 cmd.exe 中关闭 MSI - 不推荐,该软件包有缺陷)。
MaintenanceMode:这种情况看起来像是特定于 Installshield:NOT Installed OR MaintenanceMode="Modify"。我认为 Installshield 本身以专有方式设置了 MaintenanceMode 属性。因此,它在 WiX 中根本不可用。
测试条件:条件可能很难测试,您需要在许多安装模式下进行实际测试(install、uninstall、@987654335 @、modify、patch、major upgrade、self-repair、etc...) 以确保它们适合您的特定情况并按预期工作。人们对调节感到惊讶的典型场景是重大升级 - 卸载旧版本并安装新版本 - 根据我的经验,它往往会揭示意外的条件问题。通常是由于复杂的顺序问题以及在这样的升级过程中,旧安装程序的卸载顺序和新安装程序的安装顺序都会运行。因此,错误条件下的自定义操作可能会在主要升级过程中运行多次并导致真正的混乱。请阅读此答案以获取更多信息:Run Wix Custom action only during uninstall and not during Major upgrade 和 this short version。
测试提示:要实现快速的主要升级,您需要更改产品代码并提高版本的前 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 文件位于 UTF8 或 ANSI 中。 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>
写入日志:您可以按照本文所述从 VBScript 写入 MSI 日志:MSI Tip: Writing to the Log File from a Custom Action。
更新:您可以删除一个单独的 VBScript 文件,用于条件调试using this approach。