批处理:从输入读取的数字的加法和减法

时间:2013-07-09 06:45:34

标签: 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=%reason%-1
        ) else (
            set /a code=%reason%+1
        )
    echo %code%
    )
)

我在goto的循环中进行此操作。第一次迭代,按1.它表示回声已关闭。再次按1,正如预期的那样等于零。按2,它说一个。再次,它如预期那样说1。

我已经确认它始终如一地说明应该从最后一个循环中获取输入(或者如果它是第一个循环则没有任何内容)。每次按“q”退出即可。

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

我有另一个脚本具有相同的算术运算,并且工作正常。我看不出变量名称之外的那些行之间的差异(我之前将其设置回原因变量,但为了清晰起见改为代码)。

2 个答案:

答案 0 :(得分:2)

问题是由您使用%变量引起的。这些变量在解析时扩展,即当解释器读取指令时。条件读取为一条指令,因此在读取%code%时正在扩展if %reason% GEQ 1 (...)。此时,尚未在最内层条件中进行赋值,因此%code%仍为空(直到条件处理完毕之后)。这就是为什么你在第一次迭代后获得ECHO is off,并且每次都获得一个值(你实际上看到了那里的最后一次迭代的代码)。

启用延迟扩展并对条件内的!变量使用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!
  )
)

如果您不希望!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。省略冒号会给你一个“缺少标签”的错误。

答案 1 :(得分:0)

这对你有用吗?

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