IF SET 意外错误批处理文件

问题描述 投票:0回答:2

我的批处理文件有问题!

我想得到这样的回声:

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

非常感谢您的帮助!

variables batch-file if-statement cmd set
2个回答
2
投票

正如马克正确指出的那样,你的问题是这个命令:

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 
)

这两个步骤应该可以解决您的问题。

编辑:您的代码中存在一些逻辑问题:

  • 在一个方向上加一,在另一个方向上减二(根据你的例子应该是一)
  • 您检查“4”是否为超限。您应该检查“5”,因为 4 就可以(根据您的示例):如果是 5,请将其设置为 1
  • 您检查“1”是否为欠载。您应该检查“0”。如果是 0,则设置为 4

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
var
is known numeric=17,
if %var% gtr 9
would be true because
17
is greater than
9
, but
如果“%var%”gtr“9”
would be FALSE because
1
is LESS than
9`

最后,语法注释 - 如果您使用代码块(即带括号的[系列]语句),则

  1. IF
    真条件目标
  2. 的左括号之前必须有一个分隔符
  3. 左括号必须与
    if
  4. 在同一行物理线上
  5. 使用“else”子句时,“true”块的结束括号、分隔符和
    else
    关键字必须位于同一物理行
  6. 使用“else”块时,
    else
    关键字、分隔符和“else”块的左括号必须位于同一物理行上

if condition (
 something
) else (
 someotherthing
)
© www.soinside.com 2019 - 2024. All rights reserved.