Math 批处理:对从输入读取的数字进行加减运算

Math 批处理:对从输入读取的数字进行加减运算,math,batch-file,addition,subtraction,Math,Batch File,Addition,Subtraction,我有一个脚本文件,它接受一个介于1和5之间的数字,然后必须将该输入映射到另一个数字,以提供给程序。非常简单:如果它小于或等于2,减去1。高一点,加一个 以下是我剧本中的商业部分: set /p reason=Reason code: if %reason%==q ( goto eof ) if %reason% GEQ 1 ( if %reason% LEQ 5 ( if %reason% LEQ 2 ( set /a code=%rea

我有一个脚本文件,它接受一个介于1和5之间的数字,然后必须将该输入映射到另一个数字,以提供给程序。非常简单:如果它小于或等于2,减去1。高一点,加一个

以下是我剧本中的商业部分:

set /p reason=Reason code:

if %reason%==q (
    goto eof
)
if %reason% GEQ 1 (
    if %reason% LEQ 5 (
        if %reason% LEQ 2 (
            set /a code=%reason%-1
        ) else (
            set /a code=%reason%+1
        )
    echo %code%
    )
)
我和后藤有一个循环。第一次迭代,按1。上面说echo关闭了。再次按1,它等于零,如预期的那样。按2,显示1。2同样,它说1,正如预期的那样

我已经确认,它一贯地说它应该从最后一个循环中获取输入(如果是第一个循环,则什么也没有)。每次按“q”退出都有效

在正确的地方回响,我确认它符合条件。这也是一个很好的理由。读取数字似乎没有问题,因为所有条件都按预期工作(因此,如果我按5,然后按6,它会阻止6,而不是认为我给了它5)


我有另一个脚本使用相同的算术运算,效果很好。除了变量的名称之外,我看不到这些行之间有任何区别(我之前将其设置回原因变量,但为了清楚起见更改为代码)。

该问题是由您使用
%
变量引起的。这些变量在解析时展开,即当解释器读取指令时。条件语句作为一条指令读取,因此在读取%reason%GEQ 1(…)时,将展开
%code%
。此时,最内层条件中的赋值尚未完成,因此
%code%
仍然为空(直到条件处理完毕)。这就是为什么在第一次迭代后,
ECHO处于关闭状态,之后每次都有一个值(实际上,您看到的是上一次迭代的代码)

启用延迟扩展并使用
code
变量的code>变量语法:

setlocal EnableDelayedExpansion

set /p "reason=Reason code: "

if "%reason%"=="q" goto :eof

if %reason% GEQ 1 (
  if %reason% LEQ 5 (
    if %reason% LEQ 2 (
      set /a "code=%reason%-1"
    ) else (
      set /a "code=%reason%+1"
    )
    echo !code!
  )
)
如果你不想要
!密码要大于5,您需要修正逻辑,例如:

if %reason% GEQ 1 (
  if %reason% LEQ 5 (
    if %reason% LEQ 2 (
      set /a "code=%reason%-1"
    ) else if %reason% EQU 5 (
      set "code=%reason%"
    ) else (
      set /a "code=%reason%+1"
    )
    echo !code!
  )
)

另外,您需要
goto:eof
,而不是
goto-eof
。省略冒号将导致“缺少标签”错误。

这对您有用吗

set /p reason=Reason code:

if "%reason%"=="q" goto :eof

if %reason% LEQ 2 set /a reason-=1
if %reason% GTR 2 set /a reason+=1

你确定你发布了完全相同的代码吗?您确定“echo is OFF”失败的测试用例是在尝试“1”时发生的吗?