2009-02-24 55 views
8

我想以静默模式调用多个.msi文件,并在任何失败时暂停整个安装。创新安装中的msi返回码

是否有可能从[run]部分调用msiexec.exe的返回码?

目前我只能在Windows事件查看器中看到错误消息。

回答

5

目前没有办法检查成功执行[运行]条目。代码只记录过程退出代码并继续下一个条目(可在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()函数安装的依赖。所以,如果你不使用[运行]条目,那么有一个很好的机会实现你想要的。

+0

感谢mghie,我认为这是我正在寻找。在运行部分有没有可用的取消钩子? – 2009-02-24 19:05:50

+0

对不起,我编辑了我的答案以包含更多信息 - 看起来您无法使用[Run]条目真正做到您想要的内容。 – mghie 2009-02-25 09:16:00

1

对于类似的问题,您可以使用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做一些额外的步骤:整数)函数隐藏最后一页,等