我们有一个安装程序,它需要在安装时重新启动,但它也在卸载时重新启动。卸载时有没有办法防止重新启动?
这就是我们目前所拥有的:
<InstallExecuteSequence>
<ScheduleReboot After="InstallFinalize"/>
</InstallExecuteSequence>
提前谢谢了!
我们有一个安装程序,它需要在安装时重新启动,但它也在卸载时重新启动。卸载时有没有办法防止重新启动?
这就是我们目前所拥有的:
<InstallExecuteSequence>
<ScheduleReboot After="InstallFinalize"/>
</InstallExecuteSequence>
提前谢谢了!
重新启动管理器:。
The Restart Manager Feature of Windows (Installer)
(middle page) is designed to help restart applications automatically during installation rather than requiring a reboot
- 此功能应始终用于尝试消除重新启动要求。
- 只有在非常特殊的情况下才真正需要重新启动。
技术速成课程:这是在您的应用程序中实施的技术花絮和建议
Restart Manager
- 来自领先部署工具的制造商Advanced Installer:
更新: MSI 专家 Phil Wilson 谈重启管理器(对于一些重启管理器现实检查 - 请阅读)。
您需要按照ScheduleReboot
此处描述的内容为您的条目插入一个条件:https ://www.firegiant.com/wix/tutorial/events-and-actions/extra-actions/ (链接的文章可能会显示一个条件这有点过于包容或不受限制)。
更新:有一些问题需要考虑:
不希望的操作:除非确实有必要,否则不应使用 ScheduleReboot。例如,如果您尝试替换正在使用的文件,MSI 将在不调用 ScheduleReboot 的情况下处理该问题。
多种安装模式:在没有合适的条件下,ScheduleReboot 会导致在多种安装模式下出现重启提示:安装、卸载、升级、修复、自修复、打补丁等……这是不可取的。
静默、即时重启:如果 MSI 在静默模式下运行并且未指定 REBOOT=ReallySuppress,则 ScheduleReboot 操作将自动触发相关计算机的即时重启 - 这可能非常令人惊讶且非常不受欢迎。
出于您的目的,您也许可以使用以下条件:
<InstallExecuteSequence>
<ScheduleReboot After='InstallFinalize'>NOT Installed AND NOT WIX_UPGRADE_DETECTED</ScheduleReboot>
</InstallExecuteSequence>
这完全取决于您是要在重大升级期间安排重新启动,还是仅在原始的全新安装期间安排重新启动?没有更多信息就无法判断。更常见的情况,例如NOT Installed AND NOT REMOVE~="ALL"
在重大升级期间安排重新启动,但不适用于不是由重大升级触发的手动卸载(我将在有机会时进行测试 -更新:已验证,基本测试只要)。
请注意,特殊WIX_UPGRADE_DETECTED
属性是特定于 WiX 的构造,只有在使用 WiX 的 MajorUpgrade 元素时才能设置。您还可以在 WiX 中以老式方式设置重大升级,并避免 MajorUpgrade 元素“便利功能”,该元素允许使用更少的选项更轻松地配置重大升级 - “自动魔术”。我没有验证是否WIX_UPGRADE_DETECTED
仍然使用这种“老派”主要升级配置进行设置。
您还可以使用ActionProperty
Upgrade表中的 检测重大升级“即将发生”(请参阅此答案以获取示例)。即使对于非 WiX MSI 设置,这也应该可以工作 - 因此应该可以替代WIX_UPGRADE_DETECTED
(我相信这个属性是在 FindRelatedProducts 运行之后设置的)。
在主要升级期间卸载的 MSI 软件包将设置特殊属性UPGRADINGPRODUCTCODE(不会在升级期间安装的 MSI 中设置)。这是一个内置的 MSI 属性,而不是特定于 WiX 的构造。换句话说,在重大升级期间 - 卸载旧版本并安装新版本 - 正在卸载的 MSI 将UPGRADINGPRODUCTCODE
设置属性,而正在安装的 MSI 将设置属性WIX_UPGRADE_DETECTED
(我将很快验证这一点)。在标准操作运行后,它还将具有来自升级表集的 ActionProperty FindRelatedProducts
。
如果这听起来很复杂,那么恐怕就是这样。这是 Windows Installer 的一个关键问题(尽管该技术具有重大的企业利益) - 基本的关键操作 - 例如升级 - 有时很难正确处理。可能存在一些违反最小惊讶原则的情况。所有技术都有好有坏——显然。
请注意,无论ScheduleReboot 操作是否被抑制,都可能会启动重新启动(例如,如果存在无法替换的文件 - 或更糟糕的是:自定义操作通过代码强制重新启动 - 这总是错误的,应该重新启动不是通过代码强制安排的)。
您可以通过使用REBOOT 属性(您已经阅读过的内容)来禁止某些重启系统的提示。更多关于系统重启。
MSI 条件可能非常棘手。弄错了,您的操作会在错误的安装模式下意外运行 - 或者它在应该运行的时候根本没有运行。这比你想象的更容易出错——即使有经验。证据就在这里,现实生活中的测试。以下是一些复杂条件示例:Wix 工具更新使用旧的自定义操作(以防万一)。
当您尝试使用复杂条件(或任何与此相关的条件)时,您应该测试许多安装模式:1. fresh install
、2. repair
、3. modify
、4. self-repair
、5. patching
、6. uninstall
、7. major upgrade invoked uninstall
等...还有一些奇怪的模式,例如以RESUME为特色的恢复暂停安装属性,以及与ForceReboot 操作相关的AFTERREBOOT 属性等......应该记住很少测试的事情。
这里有两个用于调节的“备忘单”:
我没有时间检查所有这些条件并对其进行测试,但后一张表从表面上看是合理的。但是:我相信REMOVE
有时可以在安装期间(和更改期间)进行设置。由于 MSI 的命令行界面和属性配置非常灵活,因此处理所有可能性排列非常复杂。Installed
也没有为作为主要升级的一部分安装的新 MSI 版本设置,但将为正在卸载的 MSI 版本设置 - 非常混乱。
我从未积极使用或检查过Installshield 备忘单repair
,但我发现他们的建议至少可以说很有趣 - 根据调用修复的方式,有不同的条目。
请记住还要检查自我修复- 只需删除主应用程序 EXE 并通过调用应用程序的广告快捷方式(如果有)来触发自我修复。我检查已经有好几年了,但自我修复可能只在 InstallInitialize 和 InstallFinalize 之间运行操作。您不想在自我修复期间安排重新启动。