【问题标题】:Run CA after InstallFile and before CreateShortcuts在 InstallFile 之后和 CreateShortcuts 之前运行 CA
【发布时间】:2014-06-16 10:54:19
【问题描述】:

我有 InstallShield 2013 Basic MSI 项目 我想要一个在安装文件之后但在创建快捷方式之前运行的 CA,我该怎么做? 我尝试创建将在 InstallFile 之后运行的 CA,但是在运行设置时,我看到当它到达 InstallInitialize 时,它​​会跳过所有 CA,除了我添加的 CA 并运行它,然后返回 InstallInitialize 并运行它拥有的所有自定义操作跳过。

【问题讨论】:

  • CA 会做什么?可能有一个内置的 MSI 方法可以做到这一点,而且这总是更可靠。

标签: windows-installer installshield custom-action


【解决方案1】:

您在日志中看到的是 InstallExecuteSequence 中 Deferred Execution 操作的效果。 InstallExecuteInstallFinalize 之间的每个延迟操作都会在遇到时写入脚本。然后,作为InstallFinalize 的一部分,脚本中的所有操作都会执行。 (除非出现故障,在这种情况下会涉及回滚操作,并且会跳过剩余的延迟操作。)

大多数内置操作要么具有延迟组件,要么完全延迟。对机器的任何更改都应在延迟操作中完成。请注意,延迟操作具有limitations,尤其是关于它们可以读取哪些属性(通过 MsiGetProperty 或等效项)。

这让我们回到了您的自定义操作试图做什么的问题。根据您的要求,直接答案是您需要将其标记为延期。这样做可能需要您更改其实现。但更重要的是,您应该考虑是否有内置的 Windows Installer 方式来完成您想要完成的任务,或者您正在使用的工具(在本例中为 InstallShield)内置的方式。如果是这样,您应该更喜欢使用这些内置的替代方案而不是编写自己的替代方案,因为编写一个自定义操作非常容易,它不能处理它应该处理的所有场景。

【讨论】:

    【解决方案2】:

    Michael Urman 提供了一个很好的答案,但让我也尝试使用不同的词,因为这是一个难以理解的话题。几个角度可能不错。我们还需要一个关于您实际需要做什么的答案 - 通常内置的 MSI 功能比自定义操作更好。真的:-)。

    事实上的答案是,您需要在 CreateShortcuts 之前和 InstallFiles 之后安排一个 延迟模式自定义操作强>InstallExecuteSequence。在此位置,文件将在磁盘上可用,并且尚未创建快捷方式。但是,要清楚这一点,必须正确理解几件事。

    • InstallExecuteSequence 表中的操作针对每种安装类型(安装、卸载、修改、修补)迭代两次
    • 第一次运行是立即模式。仅当将其设置为即时模式时,才会检查并运行所有操作。立即模式操作应检查系统、收集信息、设置属性值并且不更改系统上的任何内容。它们以用户权限运行。所有其他操作都写入执行脚本,以延迟模式运行。
    • 第二次运行是延迟模式。现在执行第一次运行组装的更改脚本。不能读取任何表,只能以交互方式访问少数属性。需要的所有其他属性都必须写入执行脚本并在执行脚本中可用。这些操作可以使用 LocalSystem 运行,并且可以更改系统上的任何内容,或者根据需要使用用户权限运行。
    • 需要将属性写入延迟执行脚本并通过CustomActionData 属性概念 将它们读回,这使事情变得非常复杂。整个概念最好在 separate article on the topic 中描述。
    • 这是我在另一个网站上写的较早的答案:forum.installsite.net/17211
    • 也可以在这里阅读:https://docs.flexera.com/installshield25helplib/helplibrary/AccessingProps-DeferredCAs.htm?

    【讨论】:

    • 更多详细信息:当我运行卸载时,我想要 1. 删除快捷方式 2. 运行取消注册文件并创建快捷方式的 C# 工具 在 MSI 日志文件中,我看到它正在破坏 RemoveShortcuts CA,运行 C#工具,然后运行 ​​InstallExecute 删除工具创建的快捷方式。
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多