在命令提示符中设置关闭程序的定时器

4
我希望创建一个bat文件来启动一个程序(实际上是另一个bat文件),并在一定时间后关闭该程序。
我的程序如下:
- 在 'Program_A.bat' 文件中:
@echo off
set /p sec="Enter the amount of sec you want to run : "

start Program_B.bat

timeout /t %sec%

tasakkill /F /IM cmd.exe

我发现当我设置很短的时间,例如10秒时,它可以正常工作。

但是当我设置3600秒或更长时间时,它无法正确终止Program_B.bat程序。

另外,如果我设置172800秒以便让程序运行48小时,它也不能正常工作。

请问如何解决这些问题?


它不能在172800秒内工作的原因是timeout命令有100000秒的限制。该命令本身不适用于该任务。您可以将其放入某种循环中,或尝试其他替代方法(此链接可能有所帮助,但并没有真正讨论每种方法的优缺点或限制)。 - J.Baoby
另外,我想让您知道,在批处理中杀死另一个进程并不容易。首先,你试图杀死的进程可能不是唯一一个名为cmd.exe的进程。如果真是这种情况,你需要另一种方法来找到正确的要杀死的进程。其次,根据Program_B.bat实际执行的操作,你可能需要使用taskkill命令/T选项来杀死子进程以及你想要杀死的进程(但首先确保你有正确的进程)。 - J.Baoby
还有,用于优雅终止(不使用/F)或强制终止(使用/F)的可执行文件名为taskkill,完整路径和文件名为%SystemRoot%\System32\taskkill.exe,而不是你在批处理文件中写的tasakkill - Mofi
2个回答

6

仅杀死cmd.exe可能会导致关闭整个Windows系统,您不希望这样做。
您可以为应用程序设置唯一标题,并通过该标题来关闭它。
此外,要解决超时100000秒限制的问题,只需在循环中等待一个小时即可:

start  "UniqueTitle" Program_B.bat
for /l %%a in (1,1,48) do timeout 3600 >nul
taskkill /fi "windowtitle eq UniqueTitle"

谢谢!你的代码完美运行!祝你有美好的一天! - Yong-Wook HA
控制台会将其初始客户端伪装成窗口的所有者(而不是conhost.exe),在这种情况下是cmd。因此,针对此cmd进程的taskkill通过向控制台窗口发送“WM_CLOSE”消息来工作,这将进而向附加到控制台的所有进程广播“CTRL_CLOSE_EVENT”。每个进程有5秒钟的时间以正常退出,然后被强制终止。程序可以注册一个控制例程来处理此事件(即返回“TRUE”)并启动优雅的关闭。cmd的“Handler”例程只是链接到调用“ExitProcess”的默认处理程序。 - Eryk Sun
如果初始控制台进程退出或被终止,控制台会将其列表中的下一个进程提升为所有者。附加到控制台的其他进程通常不拥有窗口。对于不拥有窗口的进程,taskkill需要使用/F选项强制终止它们。 - Eryk Sun
@Yong-WookHA - 如果这个解决方案有效,请将其选为答案。选择勾号。 - lit

0
运行一个名为bat_A的文件,该文件会运行你的程序_B,在超时99999秒后运行bat_B,然后等待72801秒再终止任务。或者在同一个bat_A中使用timeout /t 99999和下一行(命令)timeout /t 72801,如果这种方法可行的话。
谢谢

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