Windows 等待命令直到系统时间

Windows 等待命令直到系统时间

我最近编写了一个用于备份的批处理脚本。在脚本的中间某处,我必须等待一段时间才能恢复脚本的下一行。我已将脚本安排在下午 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,您就不会无限期地等待。

相关内容