【问题标题】:close files opened by batch file on termination终止时关闭批处理文件打开的文件
【发布时间】: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


【解决方案1】:

我认为你想要的行为可以通过修改this answer来实现,即:

rem Start the process that will kill the calc.exe program after 5 seconds
start "WaitingToKill" cmd /C timeout /t 5 ^& taskkill /im calc.exe /f

rem Run the calc.exe program and wait for it to terminate
calc.exe

rem If calc.exe ends before 5 seconds, kill the killer process and terminate
taskkill /fi "WINDOWTITLE eq WaitingToKill" /f

【讨论】:

  • 这是一个很好的答案,但是我们的脚本/程序可能需要 10 分钟或 10 小时才能运行。当批处理文件终止时,我想重新运行该进程,它可能会挂起,因为该进程仍处于打开状态(然后我必须记住终止该进程。当其他人在团队不知道结束批处理任务并不会结束它产生的进程:p)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
相关资源
最近更新 更多