Batch If语句未正确执行

时间:2015-10-12 03:04:48

标签: batch-file if-statement

我遇到的问题是,无论if语句是否为真,它似乎都不一致地执行。下面是一个示例代码,用于向您展示我的问题所在,如果有人希望看到我的实际代码更长,但我可以根据请求添加它。

示例代码:

@echo off
SetLocal EnableDelayedExpansion

set dlspeed=0
set csczer=3

echo %dlspeed% %csczer%

:loop
if "%csczer%" geq "15" (
    TIMEOUT 1
    echo *BOOP*
    TIMEOUT 2
    echo shutdown -h
) 
if "%dlspeed%" lss "1" (
    TIMEOUT 1
    set /a csczer+=1
    goto loop

)

if "%dlspeed%" geq "1" (
    TIMEOUT 1
    set /a csczer=0
    goto loop
) 

@EndLocal

以下是命令提示符中输出的前几行:

0 3

Waiting for 0 seconds, press a key to continue ...
*BOOP*

Waiting for 0 seconds, press a key to continue ...
shutdown -h

Waiting for 0 seconds, press a key to continue ...

Waiting for 0 seconds, press a key to continue ...
*BOOP*

我不明白为什么它会立即转到要求csczer大于或等于15的if语句,当它明显等于3.我认为它涉及if语句先到但我不知道它为什么会执行。提前感谢任何试图帮助我的人,非常感谢。

1 个答案:

答案 0 :(得分:0)

您需要从比较表达式中删除周围的双引号:

if %csczer% geq 15 

这样就可以进行真正的数值比较(只要你提供数值) 对于引号,它是字符串比较,比较字符代码,因此3被认为大于15,因为3的字符代码大于{{1}的代码}}

注意:
在执行数值比较时,请避免使用表达式的前导零,因为它们被解释为八进制数字而不是十进制数字,这可能会导致意外结果。

以下是优化代码:

1

除了删除不必要的引号外,我还删除了@echo off set dlspeed=0 set csczer=3 echo %dlspeed% %csczer% :loop if %csczer% geq 15 ( TIMEOUT 1 echo *BOOP* TIMEOUT 2 echo shutdown -h ) if %dlspeed% lss 1 ( TIMEOUT 1 set /a csczer+=1 goto loop ) else ( TIMEOUT 1 set /a csczer=0 goto loop ) / setlocal,因为此代码段不需要延迟扩展。
另外,我改进了检查endlocal的价值的逻辑。