【问题标题】:Wix - how to run an exe after installfinalize upon uninstall?Wix - 如何在 installfinalize 卸载后运行 exe?
【发布时间】:2026-01-09 05:00:02
【问题描述】:

我正在使用 wix 安装程序来覆盖(阅读:修改现有注册表值)、添加新值等。卸载后我需要将它们恢复到原始状态(我修改的那些)。由于 Wix 不支持此功能,因此我必须使用自定义操作(如我所读),我想运行一个 exe,它将使用 reg import 运行一个 .reg 文件。根据这个站点:http://www.installsite.org/pages/en/isnews/200108/index.htm 我的自定义操作必须运行After="InstallFinalize",因为 wix 回滚会删除我的注册表导入(作为回滚的一部分)。 所以基本上它看起来像这样:安装程序修改 reg 值,卸载程序删除所有触及的注册表更改(回滚的一部分),我的 exe 将恢复它们。

所以我按照他的方法做了,以提升权限等方式启动我的 exe。 http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html

            <Component Id="registry" Guid="*">
              <File Id="regexe" Source="RegistryRollback.exe"/>
              <File Id="regfile" Source="Reg_rollback.reg" />
            </Component>

<Property Id="LaunchRegExe" Value="[#regexe]" />
<CustomAction Id="LaunchRegExe" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no"/>

<Custom Action='LaunchRegExe' After='InstallFinalize'>Installed AND NOT UPGRADINGPRODUCTCODE</Custom>

但我收到了Error 19 ICE77: LaunchRegExe is a in-script custom action. It must be sequenced in between the InstallInitialize action and the InstallFinalize action in the InstallExecuteSequence table C:\Merlin\Main\Demo\KioskDemoSetup\nw_setup\nw.wxs 250 1 nw_setup

感谢您的帮助!

【问题讨论】:

  • 这里看不到全貌...您在哪里修改注册表值?您在哪里担心回滚操作会还原您的更改?从我们在这里看到的情况来看,除了延迟操作必须InstallInitializeInstallFinalize 之间运行之外,您的操作只会在卸载时运行,当您取消它时,它的行为会有所不同。意味着您的 exe 将仅在卸载时运行,在延迟上下文中,在(卸载)安装完成之前的某个时间。

标签: wix wix-extension wix3.8


【解决方案1】:

根据此站点:http://www.installsite.org/pages/en/isnews/200108/index.htm 我的自定义操作必须运行 After="InstallFinalize" 因为 wix 回滚会删除我的注册表导入(作为回滚的一部分)。

您能否具体说明该网站上的哪个位置?我正在查看它,但找不到您的操作应使用 After="InstallFinalize" 运行的原因。

它确实提到的是,

延迟、回滚和提交自定义操作只能放在 InstallInitialize 和 InstallFinalize 之间

这是您错误的原因:您有一个延迟操作,但希望在 安装完成后运行它。

如果安装(或卸载)被中止,例如当用户取消时,将执行回滚脚本。我认为您可以简单地使用Before="InstallFinalize" 运行您的操作。

【讨论】:

  • 它在安装执行序列中。 “第二阶段是修改目标计算机的地方,即复制文件、写入注册表项等。”回滚的意思是回滚安装程序所做的所有更改,例如删除安装文件夹,回滚安装期间对注册表所做的更改(阅读:删除它们)。因此,根据该站点,我需要在之后运行 exe,因为如果没有,那么我的 exe 将恢复注册表,只会被 wix 删除。还是我在这里误解了什么?
  • 这些现有的注册表项是被覆盖还是由安装程序创建的?在第一种情况下,我不确定默认卸载是否会删除它们...不过,如果您想确保在注册表删除步骤之后执行脚本,我认为您可以使用After='RemoveRegistryValues'(但必须在 install finalize 之前,因为之后无法执行延迟操作)。不幸的是,我目前无法对其进行测试,但根据文档,它应该可以工作。