Installation 如何执行另一个NSIS安装程序并等待它完成?

Installation 如何执行另一个NSIS安装程序并等待它完成?,installation,nsis,Installation,Nsis,我正在用NSIS编写一个安装程序,它是用NSIS创建的另一个安装程序的包装内部安装程序不是我的。它是用BioWare安装程序1.03(NSIS 2.34)创建的。它可能是坏了,但我不能修改它!我的安装程序只是修改一些注册表值(否则“内部”安装程序不会运行),然后执行安装程序,然后覆盖一些文件,然后恢复以前的注册表值 我的问题是:我不知道如何真正等待“内部”安装程序完成!这是因为安装程序首先解压缩它的内容并创建一个新的过程,这就是真正的安装程序。第一个过程(解包)完成后,代码立即执行。等待在这里是

我正在用NSIS编写一个安装程序,它是用NSIS创建的另一个安装程序的包装内部安装程序不是我的。它是用BioWare安装程序1.03(NSIS 2.34)创建的。它可能是坏了,但我不能修改它!我的安装程序只是修改一些注册表值(否则“内部”安装程序不会运行),然后执行安装程序,然后覆盖一些文件,然后恢复以前的注册表值

我的问题是:我不知道如何真正等待“内部”安装程序完成!这是因为安装程序首先解压缩它的内容并创建一个新的过程,这就是真正的安装程序。第一个过程(解包)完成后,代码立即执行。等待在这里是至关重要的,因为我需要覆盖一些文件

我已经阅读了以下内容:,但我找不到NSIS安装程序的任何开关


我尝试过ExecWait和nsExec::Exec,但它们都不等待真正的安装程序,只等待第一个进程完成。

首先,我从未见过ExecWait失败,但它只等待子进程,而不是该子进程的子进程。因此,链中的每个进程都需要等待其子进程。如果“中间”过程中断,请尝试

对于ExecWait,该树将如下所示:

  • NSIS1.exe:ExecWait NSIS2.exe
    • NSIS2.exe:ExecWait RealSetup.exe
      • RealSetup.exe:
你的描述有点不清楚,你能证实我知道大概的意思吗


如果您找不到NSIS的开关,则表示您没有:)

找到此问题,因为我遇到了类似的问题。在我的NSIS安装程序中,我正在下载一个Microsoft Visual Studio
exe
文件,并尝试先安装它(以获取一些依赖项
dll
文件)。然而,这从未奏效:

ExecWait "$TEMP\vcredist_x86.exe"
它只是跳过了——我怀疑是因为子进程的问题(可能?MS安装程序是交互式的,会要求用户接受许可证)。我改为使用
ExecShellWait

ExecWaitShell "open" "$TEMP\vcredist_x86.exe"

然后,我的安装程序将正确地等待第三方安装程序完成,然后再继续。

尝试Inno安装程序-我发现它更易于使用。感谢您的建议,但不幸的是,Inno安装程序的行为似乎与此相同。我正在使用它的Exec函数,它只等待第一个进程完成。我需要一种方法来等待所有的进程-InstallShield安装程序对此有一个开关,但是NSIS(内部安装程序是用NSIS创建的)呢?是的,这就是想法。我需要在安装程序(NSIS1.exe)中运行的是另一个使用NSIS(NSIS2.exe)创建的安装程序。问题是NSIS2.exe从解压其内容开始,然后运行RealSetup.exe。大多数典型方法(如ExecWait)在NSIS2.exe完成解包后立即返回代码执行,而不是等待RealSetup.exe完成。我做了RTFM:)与您链接的页面完全相同,但据我所知,只有三个开关,没有一个使安装程序等待它的子进程(如/SMS开关DoesforInstallShield)。我刚刚尝试了您的解决方案与作业对象。不幸的是,启动NSIS2.exe后,代码执行完全冻结。从技术上讲,它会等待它的完成,但即使在那之后,它也不会继续我的NSIS1.exe:)代码远非人类可读的,因此调试它将是一项非常困难的任务。到目前为止,我找到的最佳解决方案是在ExecWait之后显示MessageBox,要求用户确保NSIS2.exe(和RealSetup.exe)已完成。这成功地停止了NSIS1.exe,但它仍然不是一个很好的解决方案。我仍然不理解这个问题,除非RealSetup.exe生成子进程或其他东西。NSIS1和2使用ExecWait对我来说效果很好:如果我不够具体,那我就糟了,对不起!我一定忘了提到第二个安装程序不是我的。总体情况是:几天前,BioWare为他们的一款游戏发布了一个DLC(质量效应2)。它在某些国家/地区不可用,这些国家/地区以前有数据链路连接器。但是,如果您在注册表中更改一件事(语言ID),并在安装后重命名几个文件,它就可以正常工作。对于典型的用户来说,这通常太多了,所以他甚至都懒得去买数据链路连接器。我想创建一个包装来完成这一切,并帮助安装数据链路连接器。正如我所看到的,数据链路连接器安装程序使用:“BioWare安装程序1.03(NSIS 2.34)”。但我不能修改它或查看源代码。可能会有一些错误,比如第一个解包进程没有等待它的子进程——但我无法控制这一点!我相信,如果它是在InstallShield中完成的,那么我可以通过一个特定的开关来改变这种行为。我不知道在这种情况下这个问题是否有可能解决:/不过,谢谢你的时间!:)