重大更新时的 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) 期间删除文件时出错
自定义操作中的第三方 exe - installshield