0

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

这是我脚本的业务部分:

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。它说 echo is off。再次按 1,它等于 0,正如预期的那样。按2,它说一个。2 再次,它说 1,正如预期的那样。

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

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

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

4

2 回答 2

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. 省略冒号会给你一个“缺少标签”的错误。

于 2013-07-09T08:12:57.977 回答
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
于 2013-07-09T09:11:30.243 回答