在安装时重新启动,在卸载时不重新启动

JWo*_*y13 1 windows-installer wix wix3 major-upgrade

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

这是我们目前所拥有的:

<InstallExecuteSequence>
  <ScheduleReboot After="InstallFinalize"/>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)

提前谢谢了!

Ste*_*mul 5

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


向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>
Run Code Online (Sandbox Code Playgroud)

这完全取决于您是要在大型升级期间还是在原始的全新安装期间计划重新启动?没有更多的信息就无法告诉。像一般的NOT Installed AND NOT REMOVE~="ALL"情况会在大型升级期间安排重新启动,但不是由大型升级触发的手动卸载(如果有机会,我会进行测试-更新:已验证,基本测试)只要)。

请注意,特殊WIX_UPGRADE_DETECTED属性是特定WiX的构造,只有在使用WiX的MajorUpgrade元素时才可以设置。您还可以在WiX中以老式方式设置重大升级,并避免使用MajorUpgrade元素的“便利功能”,该元素允许使用较少的选项(“自动魔术”)更轻松地配置主要升级。我没有验证是否WIX_UPGRADE_DETECTED仍使用此“老式”主要升级配置进行设置。

您还可以使用ActionProperty升级表检测到一个重大的升级是“即将发生”(见这个答案的样本)。即使对于非WiX MSI设置,这也应该起作用-并应作为替代方法WIX_UPGRADE_DETECTED(我相信此属性是在FindRelatedProducts运行后设置的)。


WIX_UPGRADE_DETECTED与UPGRADINGPRODUCTCODE

在重大升级期间要卸载的MSI软件包将设置特殊属性UPGRADINGPRODUCTCODE(在升级期间要安装的MSI中不会设置)。这是内置的MSI属性,而不是WiX特定的构造。换句话说,在主要升级过程中(即卸载旧版本并安装新版本),正在卸载的MSI将具有该属性UPGRADINGPRODUCTCODE集,而正在安装的MSI将具有该属性WIX_UPGRADE_DETECTED集(我稍后会对此进行验证) )。FindRelatedProducts运行标准操作后,还将从“升级”表中设置ActionProperty 。

如果这听起来很复杂,那么恐怕就是如此。这是Windows Installer的关键问题(尽管该技术为公司带来了重大收益),但基本的关键操作(如升级)有时很难正确处理。可能违反了最小惊讶原则。所有技术都有好有坏-很明显。


特别注意事项

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

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


MSI条件

MSI条件很难正确解决。弄错了,您的操作在错误的安装模式下意外运行-或在应有的情况下根本没有运行。即使您有经验,也比您想的要容易出错。证明在这里是实际测试中的布丁。以下是一些复杂的示例示例:Wix Tools更新使用旧的自定义操作(以防万一)。

还有,你应该当您尝试使用复杂的条件(或与此有关的任何条件)测试许多安装模式: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之间运行操作。您不想在自我修复期间安排重新引导。