【发布时间】:2019-01-03 12:56:38
【问题描述】:
当使用任务调度器时,如果你运行一个批处理程序,当结束脚本时,它只关闭批处理文件,而不是由批处理文件生成的程序。
有没有办法在收到终止命令时关闭该批处理会话打开的所有程序?
例如
echo started: %date% %time% >> log.txt
calc
timeout 5
echo ended: %date% %time%
taskkill /im win32calc.exe
当它试图强制关闭时,是否有批量运行 taskkill 命令的方法(或关闭所有衍生进程的另一种方法)。
在 python 中,这将通过try/finally 完成,如下所示:
try: ... finally: killtask('win32calc')
无论如何,finally 总是在哪里运行。
或with open 'calc.exe': # run some code
【问题讨论】:
-
试一试:
taskkill /im calc.exe我刚刚测试过,它工作正常... -
taskkill命令运行良好。我想要一种在有人关闭批处理文件时运行的方法(即通过按 x 按钮或结束任务)。例如,如果timeout达到 3 秒,我们关闭批处理文件,calc.exe 保持打开状态。如何关闭 calc 文件,因为批处理文件已关闭。 -
您的意思是,每当您关闭任何正在运行的 python 脚本的主机时,该 python 脚本以及从其中的任何命令打开/生成的所有内容也将被关闭?
-
get force closed是什么意思?有多种方法可以关闭流程。如果您的意思是通过TerminateProcess函数关闭,这显然是TASKKILL通过/f开关所做的,那么没有进程、python 或其他任何东西可以控制它并提前知道它正在终止以能够处理情况;如果您的意思是通过单击主机进程控制台窗口上的X按钮来关闭,那么您需要处理CTRL+CLOSE信号,而这根本无法使用批处理脚本。 -
可以使用
WMIC以一些肮脏的方式完成,主要思想是使用看门狗进程(类似于他的回答中显示的Aacini),必须提前知道主进程的 PID 以定期检查它是否已终止,然后尝试终止生成的子进程。主进程需要获取自己的 PID(请参阅getting-process-id-of-exe-running-in-bat-file)并告诉它看门狗以及它产生的每个进程的 PID,并将它们记录在文件中以供看门狗稍后使用以终止它们。
标签: batch-file