我有InstallShield 2013 Basic MSI项目 我希望有一个CA将在安装文件后运行但在创建快捷方式之前,我该怎么做? 我尝试创建将在InstallFile之后运行的CA,但在运行安装程序时,我看到当它到达InstallInitialize时,它会跳过所有CA除了我添加的那个并运行它之后再返回InstallInitialize并运行所有自定义操作跳过。
答案 0 :(得分:2)
您在日志中看到的是Deferred Execution操作在InstallExecuteSequence中的影响。 InstallExecute
和InstallFinalize
之间的每个延迟操作都会在遇到时写入脚本。然后,作为InstallFinalize
的一部分,执行脚本中的所有操作。 (除非有失败,否则会涉及回滚操作,并跳过剩余的延迟操作。)
大多数内置操作都有延迟组件,或者完全延迟。对机器的任何更改都应在延迟操作中完成。请注意,延迟操作具有limitations,特别是它们可以读取的属性(通过MsiGetProperty或等效物)。
这让我们回到了您的自定义操作尝试执行的操作的问题。根据您的要求,直接答案是您需要将其标记为延期。这样做可能需要您更改其实现。但更重要的是,您应该考虑是否有内置的Windows Installer方法来完成您想要完成的任务,或者内置于您正在使用的工具(在本例中为InstallShield)的方法。如果是这样,你应该更喜欢使用这些内置替代品而不是编写自己的替代品,因为编写一个不能处理它应该处理的每个场景的自定义操作非常容易。
答案 1 :(得分:1)
Michael Urman 提供了一个很好的答案,但让我尝试不同的词,因为这是一个难以理解的话题。一些角度可能是好的。我们还需要回答您实际需要做什么 - 通常内置的MSI功能优于自定义操作。真的; - )。
事实上,答案是您需要 CreateShortcuts 之前安排的延迟模式自定义操作,以及 InstallFiles 之后<强> InstallExecuteSequence 即可。在此位置,文件将在磁盘上可用,并且尚未创建快捷方式。但是,为了清楚起见,必须正确理解几件事情。