我遇到的问题是,无论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语句先到但我不知道它为什么会执行。提前感谢任何试图帮助我的人,非常感谢。
答案 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
的价值的逻辑。