我想以静默模式调用多个.msi文件,并在任何失败时暂停整个安装。创新安装中的msi返回码
是否有可能从[run]部分调用msiexec.exe的返回码?
目前我只能在Windows事件查看器中看到错误消息。
我想以静默模式调用多个.msi文件,并在任何失败时暂停整个安装。创新安装中的msi返回码
是否有可能从[run]部分调用msiexec.exe的返回码?
目前我只能在Windows事件查看器中看到错误消息。
目前没有办法检查成功执行[运行]条目。代码只记录过程退出代码并继续下一个条目(可在Inno Setup源文件Main.pas中检查,功能是ProcessRunEntry(),从当前版本5.2的行3404开始。 3)。
如果您需要确保多次执行msiexec都成功,您将需要编写一个中间层。这可以像在[Run]条目中执行的小存根一样简单,并使用正确的参数启动msiexec.exe,等待进程完成,然后将返回代码写入文件。
的另一种方法来检查这样的安装步骤的成功将通过使用AfterInstall参数添加自定义过程调用用于每个[运行]条目。在这样的功能例如,您可以检查是否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;
还是目录和注册表项的依赖都在那里。
每个[运行]条目时,其可选检查参数不返回true时,才会执行。因此,根据您的需要,您可以逐个启动所有静默安装,并在完成最后一个脚本函数后检查是否已成功安装所有依赖项;或者您可以为每个依赖项安装编写一个检查函数,然后返回false,从而在第一个失败的安装之后跳过所有其他安装。
但请注意,所有[运行]条目在文件复制,注册表写入等步骤完成后执行,因此您基本上已完成安装。如果只有在正确安装所有依赖关系时才想真正执行所有安装步骤,那么在安装过程中仍可取消安装时,必须在此过程中执行此操作。
编辑:检查出的问题"How do you make Inno Setup not look frozen while performing a long Exec?"其中的一些信息,并给出一个示例脚本链接到有关使用执行exec()函数安装的依赖。所以,如果你不使用[运行]条目,那么有一个很好的机会实现你想要的。
对于类似的问题,您可以使用my answer在[Run]部分中安全地运行命令,并发出正确的通知并回滚出错。上述
的链接提供了完整的解决方案,但思路是如下因素:
1)写错误消息到临时文件{TMP} \安装。错误使用InnoSetup的BeforeInstall参数。
2)使用Windows命令shell“cmd.exe/s/c”运行所需的程序。还可以使用“del”命令的条件执行,并使用“& &” - http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true。因此,如果命令成功(退出代码0),错误消息文件将被删除。请注意“cmd.exe/s/c”中的特殊引号处理。
3)使用InnoSetup的AfterInstall参数检查是否存在错误消息文件{tmp} \ install.error,并通过适当的通知或确认(以及可选的日志文件呈现)中止安装并使用Exec执行回滚(ExpandConstant('{uninstallexe }“),...
4)有像应该重写InnoSetup的ShouldSkipPage(PAGEID做一些额外的步骤:整数)函数隐藏最后一页,等
感谢mghie,我认为这是我正在寻找。在运行部分有没有可用的取消钩子? – 2009-02-24 19:05:50
对不起,我编辑了我的答案以包含更多信息 - 看起来您无法使用[Run]条目真正做到您想要的内容。 – mghie 2009-02-25 09:16:00