1

我们有一个安装程序,它需要在安装时重新启动,但它也在卸载时重新启动。卸载时有没有办法防止重新启动?

这就是我们目前所拥有的:

<InstallExecuteSequence>
  <ScheduleReboot After="InstallFinalize"/>
</InstallExecuteSequence>

提前谢谢了!

4

1 回答 1

7

重新启动管理器:。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 添加条件

您需要按照ScheduleReboot此处描述的内容为您的条目插入一个条件:https ://www.firegiant.com/wix/tutorial/events-and-actions/extra-actions/ (链接的文章可能会显示一个条件这有点过于包容或不受限制)。


更新:有一些问题需要考虑:

  1. 不希望的操作:除非确实有必要,否则不应使用 ScheduleReboot。例如,如果您尝试替换正在使用的文件,MSI 将在不调用 ScheduleReboot 的情况下处理该问题。

  2. 多种安装模式:在没有合适的条件下,ScheduleReboot 会导致在多种安装模式下出现重启提示:安装、卸载、升级、修复、自修复、打补丁等……这是不可取的。

  3. 静默、即时重启:如果 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仍然使用这种“老派”主要升级配置进行设置。

您还可以使用ActionPropertyUpgrade中的 检测重大升级“即将发生”(请参阅​​此答案以获取示例)。即使对于非 WiX MSI 设置,这也应该可以工作 - 因此应该可以替代WIX_UPGRADE_DETECTED(我相信这个属性是在 FindRelatedProducts 运行之后设置的)。


WIX_UPGRADE_DETECTED 与 UPGRADINGPRODUCTCODE

在主要升级期间卸载的 MSI 软件包将设置特殊属性UPGRADINGPRODUCTCODE(不会在升级期间安装的 MSI 中设置)。这是一个内置的 MSI 属性,而不是特定于 WiX 的构造。换句话说,在重大升级期间 - 卸载旧版本并安装新版本 - 正在卸载的 MSI 将UPGRADINGPRODUCTCODE设置属性,而正在安装的 MSI 将设置属性WIX_UPGRADE_DETECTED(我将很快验证这一点)。在标准操作运行后,它还将具有来自升级表集的 ActionProperty FindRelatedProducts

如果这听起来很复杂,那么恐怕就是这样。这是 Windows Installer 的一个关键问题(尽管该技术具有重大的企业利益) - 基本的关键操作 - 例如升级 - 有时很难正确处理。可能存在一些违反最小惊讶原则的情况。所有技术都有好有坏——显然。


特别注意事项

请注意,无论ScheduleReboot 操作是否被抑制,都可能会启动重新启动(例如,如果存在无法替换的文件 - 或更糟糕的是:自定义操作通过代码强制重新启动 - 这总是错误的,应该重新启动不是通过代码强制安排的)。

您可以通过使用REBOOT 属性(您已经阅读过的内容)来禁止某些重启系统的提示。更多关于系统重启


微星条件

MSI 条件可能非常棘手。弄错了,您的操作会在错误的安装模式下意外运行 - 或者它在应该运行的时候根本没有运行。这比你想象的更容易出错——即使有经验。证据就在这里,现实生活中的测试。以下是一些复杂条件示例:Wix 工具更新使用旧的自定义操作(以防万一)。

当您尝试使用复杂条件(或任何与此相关的条件)时,您应该测试许多安装模式:1. fresh install2. repair3. modify4. self-repair5. patching6. uninstall7. major upgrade invoked uninstall等...还有一些奇怪的模式,例如以RESUME为特色的恢复暂停安装属性,以及与ForceReboot 操作相关的AFTERREBOOT 属性等......应该记住很少测试的事情。

这里有两个用于调节的“备忘单”:

我没有时间检查所有这些条件并对其进行测试,但后一张表从表面上看是合理的。但是:我相信REMOVE有时可以在安装期间(和更改期间)进行设置。由于 MSI 的命令行界面和属性配置非常灵活,因此处理所有可能性排列非常复杂。Installed也没有为作为主要升级的一部分安装的新 MSI 版本设置,但将为正在卸载的 MSI 版本设置 - 非常混乱。

我从未积极使用或检查过Installshield 备忘单repair,但我发现他们的建议至少可以说很有趣 - 根据调用修复的方式,有不同的条目。

请记住还要检查自我修复- 只需删除主应用程序 EXE 并通过调用应用程序的广告快捷方式(如果有)来触发自我修复。我检查已经有好几年了,但自我修复可能只在 InstallInitialize 和 InstallFinalize 之间运行操作。您不想在自我修复期间安排重新启动。

于 2018-02-17T15:02:29.060 回答