批处理 - 如果变量值是一个数字

时间:2017-02-20 10:00:15

标签: batch-file variables if-statement

如何检测值附近的数字?我有以下代码,但我想缩短它。

  
SET /A "AI_1=%AI%-2"
SET /A "AI_2=%AI%-1"

SET /A "AI_1h=%AI%+1"
SET /A "AI_2h=%AI%+2"

IF %Speed% EQU %AI_2% GOTO :ACCELERATE
IF %Speed% EQU %AI_1% GOTO :ACCELERATE

IF %Speed% EQU %AI% GOTO :ACCELERATE

IF %Speed% EQU %AI_1H% GOTO :ACCELERATE
IF %Speed% EQU %AI_2H% GOTO :ACCELERATE

4 个答案:

答案 0 :(得分:3)

也许有点神秘,但这缩短了代码

2>nul set /a "1/((speed-ai-1)*(speed-ai)*(speed-ai+1))" || goto :ACCELERATE

它只是试图计算一个分裂。如果speed值在[AI-1 .. AI+1]范围内,则除数中至少有一个元素为0,因此乘法将为0,并且除法将失败, 除以零错误。条件运算符||(如果前一个命令失败,则运行下一个命令)将处理这种情况。

如果speedai的值很高(批处理算术只处理整数有符号的32位值),那么操作应分成三个不同的分区以避免乘法中的溢出

2>nul set /a "1/(speed-ai-1), 1/(speed-ai), 1/(speed-ai+1)" || goto :ACCELERATE

答案 1 :(得分:1)

EQU : Equal
NEQ : Not equal
LSS : Less than <
LEQ : Less than or Equal <=
GTR : Greater than >
GEQ : Greater than or equal >=

如果您的数字接近当前数字,我会将LEQ和GEQ结合起来推迟。

来源:https://ss64.com/nt/if.html

答案 2 :(得分:1)

这个for循环遍历AI-3AI+3,并对它们之间的每个整数进行if比较。

SET /A "AI_3Lower=%AI%-3"
SET /A "AI_3Higher=%AI%+3"

for /l %%G in (%AI_3Lower,1,%AI_3Higher) do (
    if %Speed% EQU %%G goto :accelerate
)

答案 3 :(得分:1)

使用您已经解雇的想法:

Set/A "Upper=AI+2,Lower=AI-2"
If %Speed% GEq %Lower% If %Speed% LEq %Upper% GoTo ACCELERATE