【问题标题】:How to execute an NSIS uninstaller from within an another NSIS installer and wait for it to finish?如何从另一个 NSIS 安装程序中执行 NSIS 卸载程序并等待它完成?
【发布时间】:2011-06-08 07:03:08
【问题描述】:

我有一个安装程序,一个已编译的 NSIS 脚本,它首先检查我的应用程序的另一个版本是否正在系统上运行。如果存在另一个实例,则它首先触发静默卸载,然后继续安装新实例。

我使用 ExecWait 在静默模式下触发卸载程序,但我的主安装程序进程没有等待并继续安装过程。

如何强制主安装程序先等待静默卸载完成?

【问题讨论】:

    标签: nsis


    【解决方案1】:

    有一个特殊的卸载程序parameter你需要使用(原因是通常卸载程序需要能够自行删除)

    ExecWait '"$INSTDIR\uninstaller.exe" /S _?=$INSTDIR'
    

    【讨论】:

    • +1:我认为,这并不能回答问题,无论如何都适用于小型应用程序。因此,解决方法 +1 :-)。实际上,ExecWait 仍然不会等待卸载程序结束,而是卸载程序现在在后台静默 (/S) 执行。如果卸载程序需要很长时间,它也会卸载当前安装的数据。因此,卸载程序和安装程序将并行工作。所以要注意!
    • @Valentin:是什么让您认为 ExecWait 不等待?它确实 WaitForSingleObject(hChildProcess,INFINITE);
    • +1 请参阅 here 了解如何在 .onInit 函数上实现此功能。
    • @ValentinHeinitz 这个问题最近真的袭击了我。搞了半天,一开始还以为是杀毒软件呢
    • 我已经对此进行了测试,在我的情况下,它不会等待 uinstaller,而是立即返回。
    【解决方案2】:

    这不仅仅是关于“ExecWait”。它也是关于“_?”,一个特殊的卸载程序指令。 实际上,在卸载过程中,uninstaller.exe 被复制到一个临时目录,然后从那里执行。

    从临时目录复制和调用新卸载程序的这一步骤可能很快,并且调用会立即返回,而无需实际等待卸载程序完成。

    通过使用“_?”指示您告诉 NSIS 从同一位置而不是从临时目录运行卸载程序。

    除了使用“_?”之外,还使用“ExecWait”您告诉 NSIS 等待“卸载程序”过程完成然后返回。这样您就可以实现所需的目标。

    请参阅http://nsis.sourceforge.net/Docs/Chapter3.html#3.2.2 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2014-08-27
      • 1970-01-01
      • 2012-01-26
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2016-06-30
      相关资源
      最近更新 更多