在Windows批处理文件中,如何在时间超过某一天的特定小时后中断for循环?

7 浏览
0 Comments

在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)进行比较,并中断循环,继续执行其他命令?

0
0 Comments

如何在一天中的特定时间后中断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循环中提取当前时间,并避免在子程序中访问可能在括号块中改变的变量。

这些方法都是根据特定的时间格式进行的,如果时间格式不同,可能需要进行相应的修改。

0