我想以静默方式调用多个.msi文件,如果有任何失败,则暂停整个安装.
是否可以从[run]部分调用msiexec.exe的返回码?
目前我只能在Windows事件查看器中看到错误消息.
目前无法检查[Run]条目的成功执行.代码只记录进程退出代码并继续下一个条目(可以在Inno Setup源文件Main.pas中检查,函数是ProcessRunEntry(),从当前版本5.2.3中的第3404行开始).
如果您需要确保msiexec的多次执行都成功,则需要编写中间层代码.这可以像在[Run]条目中执行的小存根一样简单,并使用正确的参数启动msiexec.exe,等待进程完成,然后将返回代码写入文件.
检查此类安装步骤是否成功的另一种方法是使用AfterInstall参数为每个[Run]条目添加自定义过程调用.在这样的功能中,您可以检查是否已成功安装OCX控件:
[Run] Filename: "{tmp}\MyInstallation1.exe"; Parameters: "/foo"; AfterInstall: AfterMyInstallation1 [Code] var MyInstallation1Success: boolean; procedure AfterMyInstallation1; var V: Variant; begin try V := CreateOleObject('MyInstallation.InstalledOcxControl.1'); MyInstallation1Success := True; except MyInstallation1Success := False; end; end;
或者依赖项的目录和注册表项是否全部存在.
每个[Run]条目仅在其可选的Check参数返回true时执行.因此,根据您的需要,您可以一个接一个地启动所有静默安装,并在最后一个完成后执行脚本函数以检查是否已成功安装所有依赖项; 或者您可以为每个依赖项安装编写一个检查函数,然后返回false,从而在第一个失败之后跳过所有其他安装.
但请注意,在完成文件复制,注册表写入等步骤后,所有[运行]条目都会执行,因此您基本上已经完成了安装.如果您只想在所有依赖项都已正确安装的情况下真正执行所有安装步骤,那么在安装仍然可以取消的过程中,您必须在此过程中提前执行此操作.
编辑:查看问题"如何在执行长Exec时使Inno Setup看起来不冻结?" 给出了一些信息,并且示例脚本链接到使用Exec()函数来安装依赖项.因此,如果您不使用[Run]条目,则很有可能实现您想要的效果.