Windows installer Inno设置中的msi返回代码

Windows installer Inno设置中的msi返回代码,windows-installer,inno-setup,Windows Installer,Inno Setup,我想在静默模式下调用多个.msi文件,如果出现任何失败,则停止整个安装 是否可以从[run]部分获取正在调用的msiexec.exe的返回代码 目前,我只能在windows事件查看器中看到错误消息。目前无法检查[运行]项是否成功执行。该代码只记录进程退出代码,并继续执行下一个条目(可以在Inno安装程序源文件Main.pas中进行检查,函数为ProcessRunEntry(),从当前版本5.2.3的第3404行开始) 如果需要确保msiexec的多次执行都成功,则需要编写一个中间层代码。这可以简

我想在静默模式下调用多个.msi文件,如果出现任何失败,则停止整个安装

是否可以从[run]部分获取正在调用的msiexec.exe的返回代码


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

目前无法检查[运行]项是否成功执行。该代码只记录进程退出代码,并继续执行下一个条目(可以在Inno安装程序源文件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]条目仅在其可选检查参数返回true时执行。因此,根据您的需要,您可以一个接一个地启动所有静默安装,并在最后一个静默安装完成后执行脚本函数以检查所有依赖项是否已成功安装;或者,您可以为每个依赖项安装编写一个检查函数,然后返回false,从而在第一次安装失败后跳过所有其他安装

但是请注意,所有[Run]项都是在文件复制、注册表写入等步骤完成后执行的,因此您基本上已经完成了安装。如果您希望仅在正确安装了所有依赖项的情况下才真正执行所有安装步骤,那么您必须在安装过程的早期执行,此时安装仍然可以取消

编辑:检查以下问题,其中提供了一些信息,并链接了一个关于使用Exec()函数安装依赖项的示例脚本。因此,如果您不使用[Run]条目,则很有可能实现您想要的功能。

您可以使用类似的问题在[Run]部分中安全地运行命令,并发出正确的通知并在出现错误时回滚

上面的链接提供了完整的解决方案,但想法如下:

1) 使用InnoSetup的BeforeInstall参数将错误消息写入临时文件{tmp}\install.error

2) 使用Windows命令shell“cmd.exe/s/c”运行所需的程序。还可以使用带“&&”的条件执行“del”命令。所以,如果命令成功,错误消息文件将被删除(退出代码0)。请注意“cmd.exe/s/c”中的特殊报价处理

3) 使用InnoSetup的AfterInstall参数检查是否存在错误消息文件{tmp}\install.error,并在适当的通知或确认(以及可选的日志文件显示)下中止安装,并使用Exec(ExpandConstant({uninstallexe}')、执行回滚


4) 还有一些额外的步骤需要完成,比如覆盖InnoSetup的ShouldSkipPage(PageID:Integer)函数以隐藏最终页面等。

谢谢mghie,我想这就是我想要的。“运行”部分中是否有可取消的挂钩?抱歉,我已编辑了我的答案以包含更多信息-似乎您无法使用[run]条目真正执行您想要的操作。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能会无效。谢谢您的提示。我在这里介绍了常见的想法。