重大更新时的 InstallShield 自定义操作

Posted

技术标签:

【中文标题】重大更新时的 InstallShield 自定义操作【英文标题】:InstallShield custom action on major update 【发布时间】:2017-09-04 12:38:50 【问题描述】:

当我的 setup.exe 处于主要升级模式时,我正在使用 InstallShield 并尝试执行 shell 脚本(自定义操作)。 我有点确定安装程序确实在 MAJOR UPGRADE 模式下运行,因为它首先卸载已安装的版本,然后安装 setup.exe 版本。

但是,我在Behavior and Logic 下添加的操作没有发生... 我将Install UI Sequence 设置为<First Action>,将install UI Condition 设置为IS_MAJOR_UPGRADE,但什么都没有..

如果我希望在主要升级过程中和卸载开始时(安装更新版本之前)发生自定义操作(在哪个序列之后),我应该在序列中的哪个位置插入它?

有什么想法吗?我做错了什么?

【问题讨论】:

【参考方案1】:

当安装程序作为主要升级的一部分被卸载时,它会以静默模式运行。这意味着没有 GUI 和您拥有的操作 插入 InstallUISequence 序列将永远不会运行 - 在 技术术语整个 InstallUISequence 被跳过,只有 InstallExecuteSequence 运行。

我们需要知道您的行为在做什么才能提供正确的建议。是对系统进行更改,还是只是显示信息或请求用户输入?如果您的自定义操作对系统进行了更改,则应将其插入 InstallExecuteSequence 而根本不插入 InstallUISequence(不应从 UI 序列对系统进行更改)。在其他情况下,您应该将自定义操作插入到两个序列中 - 这完全取决于它在做什么。顺便说一句,您使用的是 Installshield Express 吗?

您的IS_MAJOR_UPGRADE 条件应该可以工作,但您也可以使用UPGRADINGPRODUCTCODE,这是Windows Installer 中的内置条件,我相信前者是InstallShield 自己的自定义条件。我更喜欢标准的 Windows Installer 属性。

但是,您应该知道条件UPGRADINGPRODUCTCODE 在安装设置中不正确,仅在卸载设置中。一世 相信 IS_MAJOR_UPGRADE 在安装设置中是有效的,但是 不在卸载设置中。两者都可以设置 - 我不是 当然。 See similar issue in the context of WiX.

有关自定义操作条件的便捷图表,请参阅 Flexera(InstallShield 的制造商)提供的 PDF:https://resources.flexera.com/web/pdf/archive/IS-CHS-Common-MSI-Conditions.pdf。我没有测试过这些条件,请彻底测试。

导致自定义操作在意外时间运行的错误条件非常常见。请仔细分析该操作何时应该实际运行。如果它应该在每次卸载时运行(无论是由重大升级启动的卸载还是手动卸载),更好的条件可能是:REMOVE~="ALL"(对所有卸载都有效)。就我个人而言,我喜欢将NOT PATCH 添加到我的所有条件中,以防止所有自定义操作在补丁模式下运行(我发现这很少需要)。试试上面的链接图表来帮助你决定你的条件。

【讨论】:

很高兴听到这个消息。请记住不要使用设置 GUI 中的即时模式自定义操作对系统进行更改 - 这些操作将在静默模式下全部跳过,并且在静默运行时您的安装将不完整。对于使用提升权限运行您的 MSI 安装的普通用户(立即模式操作的权限被拒绝),该设置也将失败。详情请阅读:section 10 in this answer (and also the linked answer from that section).

以上是关于重大更新时的 InstallShield 自定义操作的主要内容,如果未能解决你的问题,请参考以下文章

InstallShield 执行卸载自定义动作

卸载自定义操作 (InstallShield) 期间删除文件时出错

自定义操作中的第三方 exe - installshield

Installshield 2015 Premier Edition:条件自定义操作在次要升级安装结束时运行

InstallShield LE:自定义卸载

在 WordPress 中更新自定义 PageLine 的部分时的操作挂钩