捕获正在运行的进程关闭Windows终端

捕获正在运行的进程关闭Windows终端,windows,process,terminal,signals,command-prompt,Windows,Process,Terminal,Signals,Command Prompt,在命令提示窗口中,我有一个正在运行的进程。当进程仍在执行时,我单击命令提示符窗口角落中的(红色)“X”。命令提示窗口关闭,运行的进程终止 在Linux上,关闭正在运行的进程的父终端将发送该进程SIGHUP。如何在Windows上捕获此事件?无法直接从命令提示符执行此操作。当cmd.exe关闭并做出相应反应时,您需要一个辅助文件(vbs、powershell或自定义MyApp.exe)来捕获cmd.exe 例如,VBS WMI监视器 strComputer = "." Set objSWbemSe

在命令提示窗口中,我有一个正在运行的进程。当进程仍在执行时,我单击命令提示符窗口角落中的(红色)“X”。命令提示窗口关闭,运行的进程终止


在Linux上,关闭正在运行的进程的父终端将发送该进程
SIGHUP
。如何在Windows上捕获此事件?

无法直接从命令提示符执行此操作。当cmd.exe关闭并做出相应反应时,您需要一个辅助文件(vbs、powershell或自定义MyApp.exe)来捕获cmd.exe

例如,VBS WMI监视器

strComputer = "."
Set objSWbemServices = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!" & "\\" & strComputer & "\root\cimv2")
Set objEventSource = objSWbemServices.ExecNotificationQuery( "SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name = 'cmd.exe'")
Set objEventObject = objEventSource.NextEvent()
Wscript.Echo "CMD.exe closed"

通过您注册的回调函数提供相当于SIGHUP的函数。您的回调函数将在具有dwCtrlType=CTRL\U CLOSE\U事件的任意线程池线程上调用。你有5秒钟的时间清理,你不能取消关闭

示例代码可在

的“SIGHUP”。。。在Windows 8.1 pro+Node.js 0.10.24上测试,效果良好

process.on('SIGHUP', function(){
    //Your code goes here.
});

虽然我更喜欢一个激光聚焦的监视器来跟踪cmd.exe的精确PID,这样我们就不会在不同的cmd.exe实例上意外触发。但你还是明白了。而且,这并不能确定红色X或批次是否已完成,需要将其他逻辑添加到批处理脚本的末尾,以便在批处理结束之前取消WMI监视器,使其不会在正常完成时触发。从实际编程语言中,您可以使用控制台控制处理程序和控制台关闭事件陷阱。有关ConsoleCtrlHandler的更多详细信息,请参阅Hans post。