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

时间:2018-02-17 10:20:50

标签: wix windows-installer wix3 major-upgrade

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

这就是我们现在所拥有的:

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

非常感谢提前!

1 个答案:

答案 0 :(得分:4)

  

重新启动管理器 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 的技术细节和建议 - 来自{{3领先部署工具的制造商:

     

将条件添加到ScheduleReboot

您需要按照此处描述的内容为ScheduleReboot条目插入条件: https://www.advancedinstaller.com/user-guide/qa-vista-restart-manager.html (链接的文章可能会显示一点条件太包容或不受限制了。)

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

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

  2. 许多安装模式 :如果没有正确的条件,ScheduleReboot将导致重启提示以多种安装模式显示:安装,卸载,升级,修理,自我修复,修补等......这是不可取的。

  3. 无提示,即时重启 :如果MSI以静默方式运行且未指定REBOOT = ReallySuppress,则ScheduleReboot操作将自动触发即时重启有问题的电脑 - 这可能是非常令人惊讶和非常不受欢迎的。

  4. 出于您的目的,您可以沿着这些方向使用条件:

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

    这完全取决于您是要在重大升级期间安排重新启动,还是仅在原始全新安装期间安排重启? 没有更多信息无法告诉您信息。像NOT Installed AND NOT REMOVE~="ALL"这样的普通条件似乎可以在主要升级期间安排重新启动,但不能用于不是由主要升级触发的手动卸载(我将在有机会时进行测试 - < strong> UPDATE :仅经过验证,基本测试。

    请注意,特殊WIX_UPGRADE_DETECTED属性是https://www.firegiant.com/wix/tutorial/events-and-actions/extra-actions/,只有在使用WiX的MajorUpgrade元素时才能设置。您还可以WiX-specific construct并避免使用MajorUpgrade元素&#34;便利功能&#34;这样可以用更少的选项更轻松地配置主要升级 - &#34; auto-magic&#34;。我没有验证WIX_UPGRADE_DETECTED是否仍然使用这个旧学校&#34;主要的升级配置。

    您还可以使用set up major upgrades the old fashioned way in WiX中的ActionProperty来检测主要升级是否即将发生&#34; (Upgrade table)。这应该适用于非WiX MSI设置 - 因此应该是WIX_UPGRADE_DETECTED的替代(我相信在FindRelatedProducts运行之后设置此属性)。

    WIX_UPGRADE_DETECTED vs UPGRADINGPRODUCTCODE

    在主要升级期间卸载的MSI程序包将设置特殊属性see this answer for a sample(在升级期间不会在安装的MSI中设置)。这是一个内置的MSI属性,而不是特定于WiX的构造。换句话说,在主要升级期间 - 卸载旧版本和安装新版本 - 卸载的MSI将设置属性UPGRADINGPRODUCTCODE,而安装的MSI将具有属性{{ 1}}设置(我将尽快验证)。在标准操作WIX_UPGRADE_DETECTED运行后,它还将从升级表集中设置ActionProperty。

    如果这听起来很复杂,那我恐怕就是这样。这是Windows Installer(UPGRADINGPRODUCTCODE)的一个关键问题 -  基本的关键操作 - 例如升级 - 有时非常复杂。可能存在违反despite the technology's major corporate benefits的行为。所有技术都有好有坏 - 显然。

    特别注意事项

    请注意,无论the principle of least astonishment是否被禁止,都可以启动重启(例如,如果有文件无法替换 - 或者更糟:自定义操作强制通过代码重启 - 这是总是错的,应该安排重启,而不是强制通过代码)。

    您可以使用ScheduleReboot action(您已经阅读过的内容)禁止重新启动系统的某些提示。 REBOOT property

    MSI条件

    MSI条件可能非常棘手。弄错了,你的行动在错误的安装模式下意外地运行 - 或者它根本不应该运行。这比你想象的更容易出错 - 即使有经验。证明就在这里的布丁,现实生活中的测试。以下是一些示例,复杂条件作为示例:More on System Reboots(以防万一有趣)。

    当您尝试使用复杂条件(或任何条件)时,您应该测试许多安装模式:FindRelatedProducts1. fresh install2. repair,{{1} },3. modify4. self-repair5. patching等等...还有一些奇怪的模式,例如以Wix Tools update uses old custom actionsRESUME property为主的恢复暂停安装与AFTERREBOOT property等有关的事情......应该记住的事情很少被测试。

    这是两个&#34;备忘单&#34;用于调理:

    我没有时间经历所有这些条件并对它们进行测试,但后一个表看起来很合理。但是:我相信有时可以在安装期间(以及更改期间)设置6. uninstall。处理所有可能的排列非常复杂,因为MSI的命令行界面和属性配置非常灵活。 7. major upgrade invoked uninstall也没有为作为主要升级的一部分安装的新MSI版本设置,但它将被设置为正在卸载的MSI版本 - 非常令人困惑。

    Installshield备忘单我从未主动使用或检查,但我发现他们对REMOVE的建议至少有趣 - 根据调用修复的方式,有不同的条目

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