安装时重启,卸载时不要重启

Reboot on install, Don't reboot on uninstall

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

这是我们目前拥有的:

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

非常感谢!

Restart Manager: (middle page) is designed to help restart applications automatically during installation rather than requiring a reboot.

  • This feature should always be used to try to eliminate reboot requirements.
  • Only in very special circumstances should a reboot be really required.

Technical Crash Course: This is a technical tidbit and recommendation for implementing Restart Manager in your application - from Advanced Installer, makers of leading deployment tools:

UPDATE: (for some Restart Manager reality check - please read).


将条件添加到 ScheduleReboot

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


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

  1. 意外操作:除非确实有必要,否则永远不要使用 ScheduleReboot。例如,如果您尝试替换正在使用的文件,MSI 将在不调用 ScheduleReboot 的情况下进行处理。

  2. 多种安装模式:如果条件不合适,ScheduleReboot 将导致重启提示出现在许多安装模式:安装、卸载、升级、修复、self-repair、打补丁等...这是不可取的。

  3. 静默,即时重启:如果 MSI 运行 处于静默模式并且 REBOOT=未指定 ReallySuppress,ScheduleReboot 操作将自动触发相关计算机的即时重启 - 这可能非常令人惊讶且非常不受欢迎。


为了您的目的,您或许可以按照以下方式使用条件:

<InstallExecuteSequence>
    <ScheduleReboot After='InstallFinalize'>NOT Installed AND NOT WIX_UPGRADE_DETECTED</ScheduleReboot>
</InstallExecuteSequence>

这完全取决于您是要在主要升级期间安排重新启动,还是仅在原始的全新安装期间安排重新启动?没有更多信息就无法判断。更多 run-of-the-mill 条件,如 NOT Installed AND NOT REMOVE~="ALL" 似乎会在主要升级期间安排重新启动,但不是由主要升级触发的手动卸载(我会在有机会时进行测试 - 更新:已验证,仅进行基本测试)。

请注意,特殊的 WIX_UPGRADE_DETECTED 属性 是一个 WiX-specific construct that may only be set if you use WiX's MajorUpgrade element. You can also 并避免使用 MajorUpgrade 元素“便利功能”,它允许使用更少的选项更轻松地配置主要升级 - “auto-magic”。我没有验证 WIX_UPGRADE_DETECTED 是否仍然使用这个“老派”主要升级配置进行设置。

您也可以使用 Upgrade table to detect that a major upgrade is "about to happen" (see this answer for a sample 中的 ActionProperty。这甚至适用于 non-WiX MSI 设置 - 因此应该是 WIX_UPGRADE_DETECTED 的替代方案(我相信这个 属性 是在 FindRelatedProducts 具有 运行 之后设置的)。


WIX_UPGRADE_DETECTED 对比 UPGRADINGPRODUCTCODE

在主要升级期间卸载的 MSI 包将具有特殊的 属性 UPGRADINGPRODUCTCODE 设置(在升级期间安装的 MSI 中不会设置)。这是 built-in MSI 属性,而不是 WiX-specific 结构。换句话说,在主要升级期间 - 即卸载旧版本和安装新版本 - 正在卸载的 MSI 将设置 属性 UPGRADINGPRODUCTCODE,而正在安装的 MSI 将设置属性 WIX_UPGRADE_DETECTED 集(我将很快验证)。它还将在标准操作 FindRelatedProducts 具有 运行.

后设置来自升级 table 的 ActionProperty

如果这听起来很复杂,恐怕确实如此。这是 Windows 安装程序 (despite the technology's major corporate benefits) 的关键问题 - 基本的、关键的操作——比如升级——有时很难正确完成。 the principle of least astonishment可能会有些违规。显然,所有技术都有好有坏。


特殊注意事项

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

您可以使用 REBOOT property (something you will have read already). More on System Reboots.

来抑制某些重启系统的提示

MSI 条件

要获得正确的 MSI 条件可能非常棘手。在错误的安装模式下出错,您的操作 运行 出乎意料 - 或者它根本没有 运行 该应该的。这比您想象的更容易出错 - 即使有经验。证明在布丁这里,real-life 测试。这里有一些示例,复杂的条件作为示例:(以防万一它很有趣)。

当您尝试使用复杂条件(或与此相关的任何条件)时,您应该测试多种安装模式:1. fresh install2. repair3. modify4. self-repair5. patching6. uninstall7. major upgrade invoked uninstall 等...还有一些奇怪的模式,例如具有 RESUME property, and the AFTERREBOOT property relating to the ForceReboot action 等的恢复挂起安装...事情一应该记住很少测试。

这里有两个“cheat-sheets”用于调理:

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

Installshield 作弊 sheet 我从未积极使用或检查过,但我发现他们对 repair 的建议至少可以说很有趣 - 有不同的条目取决于调用修复的方式。

请记住 还要检查 self-repair - 只需删除主应用程序 EXE 并触发 self-repair 然后调用应用程序的广告快捷方式(如果有) .我检查已经有好几年了,但是 self-repair 可能只有 运行 InstallInitialize 和 InstallFinalize 之间的操作。您不想在 self-repair.

期间安排重启