在Windows批处理文件中,如何在时间超过某一天的特定小时后中断for循环?
在Windows批处理文件中,如何在时间超过某一天的特定小时后中断for循环?
背景
我在晚上(0:00之后)运行一个需要运行几个小时的批处理文件。为此,有一个简单的循环:
for /l %%t in (1, 1, %1) do ( REM 一些需要几分钟的命令 ) REM 还有一些需要几分钟的命令
问题
当我达到一天中的某个特定时间,比如早上6:05时,我想要中断循环并执行其他操作。
我找到的内容
很遗憾,我只找到了关于时间的这个问题:
如何在Windows命令行中获取当前日期/时间,并以适合在文件/文件夹名称中使用的格式呢?
但我不明白如何使用当前时间,将其与给定时间进行比较,并判断哪个更大。
至于中断循环,我不确定哪个是官方的方法,因为我找到了多个解决方案。也许"goto"是最好的方法,就像这里所示:
https://stackoverflow.com/a/60401897/878126
问题
在循环内部,我如何将当前时间与我选择的特定时间(这里是早上6:05)进行比较,并中断循环,继续执行其他命令?
如何在一天中的特定时间后中断for循环?
在Windows批处理文件中,有时候需要在特定时间后中断for循环。下面的代码展示了如何实现这一功能:
for /l %%t in (1, 1, %1) do (
REM some commands that take a few minutes
CALL :shouldistop
if defined breakloop echo Loop broken when T=%%t&goto nextstep
)
:nextstep
REM some more commands that take a few minutes
....
GOTO :eof
:shouldistop
:: 假设时间格式为h:mm:ss.cc(24小时制,小时不带前导零)
set "breakloop=%time::=%"
set /a breakloop=%breakloop:.=% / 10000
if %breakloop% gtr 605 goto :eof
set "breakloop="
goto :eof
这段代码假设时间格式为`23:12:06.26`,并将时间保存在名为`time`的魔术变量中。代码通过将时间字符串中的冒号移除,并将其转换为数字进行比较来判断是否要中断循环。
如果时间格式中包含秒数,可以将除数改为`/100`,并将比较值改为`60530`。
如果时间格式中包含前导零,可以在初始化`breakloop`变量时,在时间前面加上`1`,以确保计算以十进制而不是八进制进行。
如果不想使用子程序,可以使用下面的代码:
for /l %%t in (1, 1, %1) do (
REM some commands that take a few minutes
setlocal enabledelayedexpansion
set "now=!time!"
rem 判断小时是否小于10
if "!now:~1,1!==":" set "now=0!now!"
if "!now:~0,5!" gtr "06:05" endlocal& goto nextstep
endlocal
)
:nextstep
REM some more commands that take a few minutes
这段代码通过使用`!now:~0,8!`来进行比较,以便包含秒数。
需要注意的是,由于字符串比较需要考虑非数字字符,因此需要在小时小于10时添加前导零。字符串比较是按字符进行的,所以`11:20`小于`6:05`,因为`1`小于`6`。
这些代码中的子程序用于在for循环中提取当前时间,并避免在子程序中访问可能在括号块中改变的变量。
这些方法都是根据特定的时间格式进行的,如果时间格式不同,可能需要进行相应的修改。