【问题标题】:How to execute another NSIS installer and wait for it to finish?如何执行另一个 NSIS 安装程序并等待它完成?
【发布时间】:2011-04-22 13:39:36
【问题描述】:

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

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

我已阅读:http://nsis.sourceforge.net/When_I_use_ExecWait,_it_doesn't_wait,但我找不到 NSIS 安装程序的任何开关。

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

【问题讨论】:

  • 试试 Inno 设置 - 我发现它更容易使用。
  • 感谢您的建议,但不幸的是,Inno Setup 的行为方式似乎相同。我正在使用它的 Exec 函数,它只等待第一个进程完成。我需要一种方法来等待所有进程 - InstallShield 安装程序有一个开关,但是 NSIS(“内部”安装程序是用 NSIS 创建的)呢?

标签: installation nsis


【解决方案1】:

首先,我从未见过 ExecWait 失败,但它只会等待子进程,而不是该子进程的子进程。所以链中的每个进程都需要等待它的子进程。如果“中间”进程坏了,试试http://nsis.sourceforge.net/ExecWait_and_waiting_for_child_processes_with_Job_Objects

对于 ExecWait,树看起来像:

  • NSIS1.exe:ExecWait NSIS2.exe
    • NSIS2.exe:ExecWait RealSetup.exe
      • RealSetup.exe:...

你的描述有点不清楚,你能确认我明白了吗?

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

【讨论】:

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

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

ExecWait "$TEMP\vcredist_x86.exe"

它只是跳过了——我怀疑是因为子进程的问题(也许?MS 安装程序是交互式的,会要求用户接受许可证)。我最后改用ExecShellWait

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

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

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 2016-09-09
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2020-05-27
    相关资源
    最近更新 更多