首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Inno设置中的msi返回代码

问Inno设置中的msi返回代码
EN

Stack Overflow用户
提问于 2009-02-24 16:29:43
回答 2查看 4.9K关注 0票数 8

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-02-24 17:03:06

目前没有办法检查运行条目的成功执行。代码只是记录进程退出代码并继续下一个条目(可以在Inno设置源文件Main.pas中检查它,该函数是ProcessRunEntry(),从当前版本5.2.3中的第3404行开始)。

如果您需要确保msiexec的多次执行都是成功的,则需要编写一个中间层。这可以像在Run条目中执行一个小存根一样简单,它使用正确的参数启动msiexec.exe,等待进程完成,然后将返回代码写入文件。

检查此类安装步骤是否成功的另一种方法是使用AfterInstall参数为每个运行条目添加一个自定义过程调用。例如,在这样的函数中,您可以检查OCX控件是否已成功安装:

代码语言:javascript
复制
[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;

或者依赖项的目录和注册表项是否都在那里。

只有当其可选的Check参数返回true时,才会执行每个运行条目。因此,根据您的需要,您可以一个接一个地启动所有静默安装,并在最后一个静默安装完成后执行脚本函数来检查所有依赖项是否已成功安装;或者您可以为每个依赖项安装编写一个检查函数,然后该函数将返回false,从而在第一个失败的安装之后跳过所有其他安装。

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

Exec编辑:查看问题"How do you make Inno Setup not look frozen while performing a long Exec?",其中提供了一些信息,并提供了有关使用()函数安装依赖项的示例脚本链接。因此,如果您不使用运行条目,则有很好的机会实现您想要的。

票数 5
EN

Stack Overflow用户

发布于 2014-06-20 16:42:17

你可以使用my answer来回答类似的问题,在运行部分安全地运行命令,并在错误时进行适当的通知和回滚。

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

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

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: Integer)函数来隐藏最终页面等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/582452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档