Batch file 如何修复此批处理时间脚本?

Batch file 如何修复此批处理时间脚本?,batch-file,windows-10,Batch File,Windows 10,我正在开发一个小的批处理程序,我在编写时间脚本方面遇到了问题,我的意思是允许人们在特定的时间内进入程序。 特定的时间是在中午12点开门,晚上11点关门。 这是我目前的脚本: @echo off set current_time=%time:~0,5% rem This piece of code below is to make it start if %current_time% == "12:00" goto :START rem this piece

我正在开发一个小的批处理程序,我在编写时间脚本方面遇到了问题,我的意思是允许人们在特定的时间内进入程序。 特定的时间是在中午12点开门,晚上11点关门。 这是我目前的脚本:

    @echo off
    set current_time=%time:~0,5%
    rem This piece of code below is to make it start
    if %current_time% == "12:00" goto :START
    rem this piece of code below is to make it stop
    if %current_time% == "23:00" goto :STOP
    rem and if you know batch you'll get these two
    if %current_time% lss "12:00" if %current_time% gtr "23:00" goto :STOP
    if %current_time% gtr "12:00" if %current_time% lss "23:00" goto :START
    :START

    echo The program has successfully ran.
    echo Press anything to exit now.
    pause >nul
    exit
    :STOP
    echo Sorry, but this program is closed. Come back at 12:00 P.M.
    pause >nul
    exit
当我尝试代码时,它完全忽略了时间配置,直接进入启动过程。有人知道怎么解决这个问题吗? 另外,请注意:我使用的是Windows 10

if %current_time% lss "12:00" if %current_time% gtr "23:00" goto :STOP
当前时间可以是例如
12:57
12:57
“12:57”
是完全不同的字符串。无论在何处将变量与引用值进行比较,都需要引用该变量

if "%current_time%" lss "12:00" if "%current_time%" gtr "23:00" goto :STOP

但是虽然这将更正比较,但此代码执行“and”函数,因此您询问的是“time 23:00”,这永远不会是真的。您的下一条语句可能会变为true,但由于此语句永远不会变为true,batch将直接跳到下一条语句。它忽略标签-它们只是位置标记。

正如我提到的,您可以使用超时来延迟,但也有
-一键输入,以错误级别响应 这允许您在延迟时中止

正如aacini在他的评论中阐述的那样,变量只存储字符串 设置/A,如果可能,尝试转换为整数

有一件事要永远记住,数字的前导是零 被视为八进制编码(0x为十六进制)。当 处理日期/时间部分月日小时分秒

下面是堆叠if-else构造的示例

@echo off
:loop

Set Now=%time:~0,2%%time:~3,2%
If "%Now:~0,1%" equ "0"  Set Now=%Now:~1%"
cls&Echo %Time:~0,8%  Now=%Now%

if %Now% geq 1200 (
    if %Now% leq 2300 (
        goto :START
    ) Else (
        goto :Stop
    )
) Else (
    Goto :Stop
)
Rem Could never reach here

:START
echo The program has successfully ran.
echo Press anything to exit now.
pause >nul
exit

:STOP
echo Sorry, but this program is closed. Come back at 12:00 P.M.
echo To abort, hit A
Choice /T 2 /C AN /M "Abort [A/N] " /D N >NUL
If %ErrorLevel% == 1 exit /B
Goto :loop

欢迎作为新用户使用SO。我不知道你到底希望你的代码做什么。在我看来,一切都很正常。Batch只知道2种变量类型字符串和有符号32位整数。引号和冒号强制进行字符串比较。如果您想让批处理在某个点暂停并进行另一次比较,那么您必须进行循环并轻松地利用资源来延迟。请参阅
帮助
帮助超时
另一个提示,如果仅当两个条件都满足时才为真,则行goto:stop永远不能为真,因为数字不能小于1200和gtr 2300。取另一个if和append and else子句。但是,由于在这两种情况下都使用exit离开批处理,因此循环和延迟对您的逻辑没有意义。@LotPings:这个短语:“批处理只知道两种变量类型:字符串和带符号的32位整数”并不完全准确。批处理环境变量只能包含字符串。某些命令,如
set/A
和其他命令,在对字符串进行操作之前将其转换为32位整数,并在将其存储到变量之前将数值结果转换回字符串…@LotPings我尝试了不堆叠它,但仍然不起作用。当前时间实际上说明了正确的时间。如果我尝试在echo中使用它,它会以小时:分钟的格式告诉我确切的时间。还有,我有个问题,你在说什么代码?是但是还是什么?如果您写了“12:00回来”,但您测试了gtr 1200,但这并不更大,因此geq=大于或等于是正确的比较运算符,请参阅
帮助。