我们有一个安装程序,需要在安装时重新启动,但它也会在卸载时重新启动。有没有办法可以在卸载时阻止重启?
这就是我们现在所拥有的:
<InstallExecuteSequence>
<ScheduleReboot After="InstallFinalize"/>
</InstallExecuteSequence>
非常感谢提前!
答案 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
条目插入条件: https://www.advancedinstaller.com/user-guide/qa-vista-restart-manager.html (链接的文章可能会显示一点条件太包容或不受限制了。)
更新:有一些问题需要考虑:
不受欢迎的操作 :除非确实需要,否则不应使用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"
这样的普通条件似乎可以在主要升级期间安排重新启动,但不能用于不是由主要升级触发的手动卸载(我将在有机会时进行测试 - < 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运行之后设置此属性)。
在主要升级期间卸载的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条件可能非常棘手。弄错了,你的行动在错误的安装模式下意外地运行 - 或者它根本不应该运行。这比你想象的更容易出错 - 即使有经验。证明就在这里的布丁,现实生活中的测试。以下是一些示例,复杂条件作为示例:More on System Reboots(以防万一有趣)。
当您尝试使用复杂条件(或任何条件)时,您应该测试许多安装模式:FindRelatedProducts
,1. fresh install
,2. repair
,{{1} },3. modify
,4. self-repair
,5. patching
等等...还有一些奇怪的模式,例如以Wix Tools update uses old custom actions和RESUME property为主的恢复暂停安装与AFTERREBOOT property等有关的事情......应该记住的事情很少被测试。
这是两个&#34;备忘单&#34;用于调理:
我没有时间经历所有这些条件并对它们进行测试,但后一个表看起来很合理。但是:我相信有时可以在安装期间(以及更改期间)设置6. uninstall
。处理所有可能的排列非常复杂,因为MSI的命令行界面和属性配置非常灵活。 7. major upgrade invoked uninstall
也没有为作为主要升级的一部分安装的新MSI版本设置,但它将被设置为正在卸载的MSI版本 - 非常令人困惑。
Installshield备忘单我从未主动使用或检查,但我发现他们对REMOVE
的建议至少有趣 - 根据调用修复的方式,有不同的条目
请记住还要检查自我修复 - 只需删除主应用程序EXE并触发自我修复,然后调用应用程序的广告快捷方式(如果有的话)。我检查了多年,但自我修复只能在InstallInitialize和InstallFinalize之间运行。您不想在自我修复期间安排重新启动。