下载.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
答案 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'