在InstallFile之后和CreateShortcuts之前运行CA

问题描述 投票:1回答:2

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

windows-installer installshield custom-action
2个回答
2
投票

您在日志中看到的是InstallExecuteSequence中Deferred Execution操作的效果。在遇到InstallExecuteInstallFinalize之间的每个延迟动作时,都会将其写入脚本。然后,作为InstallFinalize的一部分,执行脚本中的所有动作。 (除非发生故障,否则将涉及回滚操作,而其余的延迟操作将被跳过。)

[大多数内置动作要么具有延迟的组件,要么被完全延迟。对机器的任何更改均应推迟进行。请注意,延迟的动作具有limitations,特别是关于它们可以读取哪些属性(通过MsiGetProperty或同等属性)。

这使我们回到您的自定义操作正在尝试执行的问题。根据您的要求,直接的答案是您需要将其标记为延迟。这样做可能需要您更改其实现。但更重要的是,您应该考虑是否有内置的Windows Installer手段来完成您要完成的工作,或者内置于所使用工具的方式(在本例中为InstallShield)。如果是这样,您应该更喜欢使用这些内置替代方法而不是编写自己的方法,因为编写自定义操作很容易,因为它不能处理应有的所有情况。]

Michael Urman

提供了一个很好的答案,但让我也尝试用不同的词,因为这是一个很难理解的话题。几个角度可能很好。我们还需要回答您实际需要执行的操作-通常,内置的MSI功能比自定义操作要好。真的;-)。

事实回答是,您需要在InstallExecuteSequence中的CreateShortcuts

之前和InstallFiles之后安排的deferred模式自定义操作。在此位置,文件将在磁盘上可用,并且快捷方式尚未创建。但是,为了清楚起见,必须正确理解几件事。

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8xWDFNUC5wbmcifQ==” alt =“在此处输入图像描述”>“ >>

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

1
投票

Michael Urman

© www.soinside.com 2019 - 2024. All rights reserved.