我最近编写了一个用于备份的批处理脚本。在脚本的中间某处,我必须等待一段时间才能恢复脚本的下一行。我已将脚本安排在下午 4:00,在等待命令之后,下一行应该在下午 5:30 准时开始。我考虑使用SLEEP
命令,但不确定在等待命令之前使用的命令是否会在某个时间结束(由于文件大小不一致),但它们肯定会在 5:00 或 5:10 之前完成,接下来它应该执行等待某个系统时钟的等待命令。我正在检查是否有任何命令等待或休眠,直到指定的时间达到系统时间,然后恢复。有人遇到过这种情况吗?如何解决?
答案1
这可能不是最好的方法,但是可以这样做:
:loop
if %TIME% LSS 17:30:00.00 goto loop
echo Continuing at %TIME%
答案2
您使用了两个标签,WinXP 和 Server-2008-R2,所以我不确定您在哪个环境中运行。
这两种环境都有一个命令schtasks
,允许从命令行设置计划任务,但此工具的功能因平台而异。它将允许您设置一次性任务,该任务将调用脚本的其余部分。它必须位于单独的文件中,但它将在下午 5:30 执行一次。
XP 语法:http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/schtasks.mspx
Server-2008 语法:http://technet.microsoft.com/en-us/library/cc725744%28WS.10%29.aspx#BKMK_once
答案3
接受的答案是一个很有帮助的开始,但也存在一些问题:
%TIME%
前面有一个空格而不是前导零10:00
(例如9:30
)。这将导致比较结果为if 9:30 LSS 10:00
假, 因为9
>1
。
简单的解决方法因为这是用来用%TIME: =0%
零替换空格。没有任何延迟,循环可能会消耗大量 CPU。因此我们可以使用
timeout
在检查之间睡一会儿。
wait-until.cmd
这是一个可以修复该问题的批处理文件。
@echo off
:loop
%SYSTEMROOT%\System32\timeout.exe 1 > nul
IF %TIME: =0% LSS %1 GOTO loop
您可以用例如来调用它wait-until 09:30
。
因为它使用字符串比较,所以你可以省略0
时间中的尾随值。例如,09:30:00.00
可以简化为09:30
(甚至09:3
)。
答案4
如果您想要一个可以在任何时间运行的脚本(而不仅仅是在您指定的时间内运行) - 例如,应该每天在设定的时间运行的脚本 - 您可以采用@mwfearnley 改进的答案(应该是被接受的答案)并按如下方式修改它:
@echo off
:loop
timeout /t 1 > nul
set hhmm=%TIME:~0,5%
if %hhmm: =0% neq %1 goto loop
timeout /t 60
exit
另存为wait-until.cmd
并运行如下:
wait-until 09:59
这将退出指定时间后一分钟。这是因为我们正在使用neq
运算符,并且必须等待一分钟才能再次产生 true。exit
这样,如果您使用 运行它start /w
,您就不会无限期地等待。