我的批处理文件有问题!
我想得到这样的回声:
1 2 3 4 1 2 3 4
或者:4 3 2 1 4 3 2 1
因此,当我按 d 到达 4 时,下一次按应该将变量切换为 1
当我按 a 到达 1 时,下一次按应该将变量切换到 4
我最后没有得到回声,但我得到语法错误。请检查错误!
这是示例代码:
@echo off
Setlocal EnableDelayedExpansion
set direction =1
:top
choice /c ad /n /m Move:
if errorlevel 1 (
set /a "direction -=1")
if errorlevel 2 (
set /a "direction +=2")
if %direction% == "4"(
set direction=1)
if %direction% == "1"(
set direction=4 )
echo !direction!
goto top
非常感谢您的帮助!
正如马克正确指出的那样,你的问题是这个命令:
set direction =1
它将名为“direction”的变量设置为 1(注意空格!)
所以有以下声明:
if %direction% == "1"
(正确)扩展为:
if == "1"
(因为
%direction%
不存在;你的变量是 %direction %
)
您可以(并且应该)通过将两边都放入括号中来避免语法错误:
if "%direction%" == "1"
这将扩展到
if "" == "1"
不是你想要的,但语法现在没问题了。 要正确设置变量,请使用不带空格的
set
命令:
set direction=1
甚至更好(在这种情况下不需要,但有时它有很大帮助):
set "direction=1"
这消除了尾随空格的可能性 (
1
)
这两个步骤应该可以解决您的问题。
编辑:您的代码中存在一些逻辑问题:
@ECHO OFF
Setlocal EnableDelayedExpansion
set /a direction=1
:top
choice /c ad /n /m Move:
if errorlevel 1 set /a direction -=1
if errorlevel 2 set /a direction +=2
if %direction%==4 set /a direction=1
if "%direction%"=="1" set /a direction=4
echo !direction!
goto top
GOTO :EOF
这里有一些部分更正的代码,可以帮助您找到正确的方向。
第一个问题,如前所述,字符串赋值的 EITHER 一侧的空格按字面意思包含在内,因此 Space 将包含在变量名称中。语法
set "var=value"
用于确保行上的尾随空格 NOT 包含在分配的值中 OR 分配了定义的空格数量,因此 set "var=value "
将在值末尾包含 3 个空格(您的编辑器可以尝试删除它们 - 这是保险)
set /a
语法用于数字赋值,仅对数值感兴趣,因此它不关心赋值中包含的空格。然而,批处理始终适用于字符串,set /a
设施只是方便;存储的值是一个字符串。
下一个问题是
if errorlevel n
- 当errorlevel
等于n
或大于n
时为真。因此,当输入 errorlevel
且 d
为 2 时,两个 if errorlevel
语句都将为 true。这可能不是你想要的。
通常,您可以通过按反向值顺序解释并在剩余的
GOTO
上进行 if errorlevel
来处理此问题。
变量
%errorlevel%
自动设置为包含当前 errorlevel
。
IF %ERRORLEVEL%==2 ...
可以解决你的问题。
接下来是STRING和NUMERIC比较之间的区别。
set /a var=17
会将 var
设置为值 17
。 17
和“17”are entirely different strings, so if
varis known numeric=17,
if %var% gtr 9would be true because
17is greater than
9, but
如果“%var%”gtr“9”would be FALSE because
1is LESS than
9`
最后,语法注释 - 如果您使用代码块(即带括号的[系列]语句),则
IF
真条件目标if
else
关键字必须位于同一物理行else
关键字、分隔符和“else”块的左括号必须位于同一物理行上即
if condition (
something
) else (
someotherthing
)