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