这并不是那么简单的。您需要在脚本中进行大量计算,以覆盖所有完整分钟、完整小时甚至新的一天的情况。我可以想到两种不同的方法。两种方法都基于两个批处理文件:
1. 通过taskkill
终止
starter.bat
:
@echo off
if "%1"=="" (
set duration=5
) else (
set duration=%1
)
start "myscript" script.bat
ping 127.0.0.1 -n %duration% -w 1000 > nul
echo %duration% seconds are over. Terminating!
taskkill /FI "WINDOWTITLE eq myscript*"
pause
script.bat
:
@echo off
:STARTLOOP
echo doing work
ping 127.0.0.1 -n 2 -w 1000 > nul
goto STARTLOOP
对于这个解决方案来说,在
start "myscript" script.bat
这一行中给执行脚本的窗口赋予一个唯一的名称非常重要。在本例中,名称是
myscript
。
taskkill /FI "WINDOWTITLE eq myscript*"
使用
myscript
来识别要终止的进程。
然而,这可能有些危险。无论是否完成迭代,您的脚本都将在
x秒后被杀死。因此,例如写访问将是一个不好的想法。
2. 通过标志文件结束任务
starter.bat
:
@echo off
if "%1"=="" (
set duration=5
) else (
set duration=%1
)
if exist terminationflag.tmp del terminationflag.tmp
start script.bat
ping 127.0.0.1 -n %duration% -w 1000 > nul
echo %duration% seconds are over. Setting termination flag!
type NUL>terminationflag.tmp
script.bat
:
@echo off
:STARTLOOP
echo doing work
ping 127.0.0.1 -n 2 -w 1000 > nul
if not exist terminationflag.tmp goto STARTLOOP
del terminationflag.tmp
echo terminated!
在这里,重要的是确保您的脚本被允许在当前位置创建/删除文件。这种解决方案更安全。启动脚本将等待给定的时间,然后创建标志文件。每个完整迭代后,您的脚本都会检查标志是否存在。如果不存在,它将继续运行 - 如果存在,则删除标志文件并安全终止。
在两种解决方案中,都使用
ping
作为超时函数。如果您使用Windows 2000或更高版本,则还可以使用
timeout/t<TimeoutInSeconds>
。但是,
timeout
并不总是有效。它会在某些计划任务、构建服务器和许多其他情况下失败。最好还是坚持使用
ping
。