批处理文件中如何结束一个Windows 16位进程

3
我有这样一种情况,一个安装有Windows XP的旧电脑作为系统的服务器,可以在出现问题时向我发送警报。但是,我们使用的服务器程序非常容易出错,并且在某些时候可能会突然停止关注警报。这些警报就会堆积起来,在程序最终重新启动时一次性全部发送。这使得这些警报变得毫无用处,因为在重新启动程序时,您已经知道系统出了什么问题。
我的解决方案是,Windows任务计划程序每晚都可以使用简单的批处理文件杀死并重新启动程序。但我似乎找不到一种方法来杀死进程,因为该程序的进程作为Windows进程csrss.exe的子进程运行。
如果我打开任务管理器,我可以看到该进程并将其终止,但命令tasklist只显示父进程csrss.exe,我需要PID才能使用taskkill结束它。是的,tasklist确实有额外的参数/t可以同时结束子进程,但我需要一种仅结束子进程而保留对于Windows似乎至关重要的csrss.exe运行的方法。
因此,我的问题是:有没有人知道如何仅通过批处理文件结束子进程?
当然,这可以通过编写特定的程序来完成,然后让批处理文件使用该程序,但我希望有一个快速解决方案。
到目前为止,我已经:
TASKLIST /FI "IMAGENAME eq program.exe" 2>NUL | FIND /I /N "program.exe">NUL
IF NOT %ERRORLEVEL%==0 GOTO :restart
TASKKILL /FI "IMAGENAME eq program.exe" /F /T

:restart
START /D "C:\path\" program.exe

编辑:

我刚刚意识到进程的映像名称在任务管理器中不是因为它是另一个进程的子进程而缩进,而是因为它是一个16位进程(多么直观)。所以,它是一个16位进程,现在的问题是如何找到PID并结束一个16位进程。正如我之前提到的,Tasklist没有显示它,pslist也没有。


你需要回答的问题是“为什么任务列表不显示该进程?”它是16位进程吗?你尝试过使用pslist而不是tasklist吗? - Harry Johnston
是的,它是一个16位进程 - 这就是为什么任务列表没有显示任何内容的原因吗?有没有办法也显示16位进程?我尝试安装pstools和pslist,但它也无法找到该进程。 - Muuse
1
我不知道是否有预先制作的东西,但是这些应该是管理在NT系列Windows版本下运行的16位任务的相关API。 - Matteo Italia
谢谢,Matteo。我觉得问题已经通过强制终止一个名为ntvdm.exe的进程解决了。但是如果还有问题,我会尝试其他方法。 - Muuse
1个回答

1

我认为我成功解决了我的问题,并在这里留下这个答案,供那些可能遇到类似问题的人参考。

我尝试杀掉进程ntvdm.exe,因为它被tasklisttaskkill所“检测”到,而且谷歌搜索显示它是Windows的虚拟机,可以让16位程序在32位系统上运行。我首先尝试不强制关闭它,但那只会杀掉ntvdm.exe,而不是16位的进程本身。然而强制关闭它似乎没问题,但我不建议在多个关键的16位进程同时运行的地方使用这种解决方案(显而易见的原因)。

我最终使用的命令是:

TASKKILL /FI "IMAGENAME eq ntvdm.exe" /F /T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接