NSIS ExecWait在通过chrome浏览器安装安装文件时不要等待

时间:2012-12-18 12:52:18

标签: installer installation install nsis

下载.exe安装文件(NSIS安装)并通过chrome打开它以执行它时,ExecWait不起作用。

我正在运行一个批处理文件,它会破坏安装中的浏览器进程, 因为我通过chrome(下载管理器)打开了exe文件,ExecWait认为执行已经结束,所以不要等待调用执行批处理文件的行之后的下一个ExecWait调用。它认为chrome是父进程,所以它退出了安装。

有没有办法让ExecWait知道虽然我杀了Chrome浏览器(或任何其他浏览器)进程继续安装?并且只等待我通过NSIS脚本执行的.exe文件?

P.S - 从浏览器(下载管理器)安装.exe文件时,它可以正常工作。

编辑(我已包含代码):

# define the name of the installer
outfile "setup.exe"
Name "Example"

installDir $LOCALAPPDATA\Test

# default section
section

setOutPath $INSTDIR
File install.exe
File test.exe

ExecWait $INSTDIR\install.exe
Delete $INSTDIR\install.exe
ExecWait $INSTDIR\test.exe
Delete $INSTDIR\test.exe

sectionEnd

和install.exe(它编译为.exe文件的.bat文件)内部的代码:

@echo off
taskkill /F /IM chrome.exe /T

如果您通过chrome下载setup.exe并从底栏(下载管理器)执行它,它将执行install.exe(关闭chrome.exe),但会跳过这一行:

Delete $INSTDIR\install.exe
ExecWait $INSTDIR\test.exe
Delete $INSTDIR\test.exe

3 个答案:

答案 0 :(得分:1)

ExecWait 始终等待它启动的子进程,但它不等待孙子进程。如果您需要这样做,可以尝试this macro

恕我直言杀死这样的浏览器并不酷(如果他们在标签中做了重要的事情怎么办?),你应该让用户关闭它。

答案 1 :(得分:0)

所以,如果我理解正确的话:

Chrome --> downloaded_setup.exe --> install.exe --> force kill chrome w/ child processes

所以回答你的问题:没有任何意义可以让Chrome开始设置阻止强制终止(它实际上是因为/T参数被杀死,因为{child}参数会杀死子进程的整个进程子树)。你正在削减你所站的分支:)

如果您确实需要杀死Chrome,我建议尝试从其自身生成downloaded_setup.exe的第二个副本,但与调用进程分离(请参阅CreateProcess flags)。

在设置的第二个实例中,您可以通过使用get process info macros测试其父级(父级pid的进程名称是否为chrome)来检查您是否是第二个进程。


编辑:我错误地解释了DETACHED_PROCESS的{​​{1}}标志的含义:它用于控制台程序,不让它们使用父级继承的控制台

实际上,要使进程与其父A分离,唯一的方法是启动进程B,它将启动进程C并退出进程B.然后进程C不再是A的后代,如果你杀了A,C将保持活力。

为了概念proff的乐趣,这里有一个NSIS脚本,如果由Chrome启动,它将重新生成。如果您在消息框显示时查看ProcessExplorer或ProcessHacker的进程,您将看到可见的设置不是chrome的子代...感谢Anders帮助我调试CreateProcess的调用:)

CreateProcess

答案 2 :(得分:0)

您是否尝试过直接致电taskkill?

Execwait '"$SYSDIR\taskkill.exe" /F /IM chrome.exe /T'