【问题标题】:IF SET unexpectend error Batch fileIF SET 意外错误批处理文件
【发布时间】:2014-01-10 23:38:13
【问题描述】:

我的批处理文件有问题!

我想得到类似的回声:

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

非常感谢您的帮助!

【问题讨论】:

  • 那么...有什么问题?
  • 我认为导致您出现问题的原因包括:您的比较不正确,即即使 direction 的值为 4,4 也不等于 "4"。我还会质疑您设置变量的间距。
  • 我查了一下,问题还是一样的。
  • 有什么问题?!!
  • 它说命令语法错误

标签: variables batch-file if-statement cmd set


【解决方案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" 用于确保行上的尾随空格包含在分配的值中定义的已分配空格数,因此set "var=value " 将包括值末尾的 3 个空格(您的编辑可能会尝试删除它们 - 这是保险)

set /a 语法用于 NUMERIC 赋值,只对数值感兴趣,因此它不关心赋值中包含的空格。但是 - 批处理总是在字符串上工作,set /a 工具只是为了方便;存储的值是一个字符串。

下一个问题是if errorlevel n - 当errorlevel 等于n 或大于 n 时为真。因此,当 errorlevel 为 2 时,d 的输入你的两个 if errorlevel 语句都将为真。这可能不是你想要的。

通常,您可以通过以反向值顺序和 GOTO 解释剩余的 if errorlevels 来处理此问题。

变量%errorlevel% 自动设置为包含当前errorlevel

IF %ERRORLEVEL%==2 ...

可能会解决您的问题。

接下来是 STRING 和 NUMERIC 比较之间的区别。 set /a var=17 会将var 设置为17 的值。 17 和 "17"are entirely different strings, so ifvaris known numeric=17,if %var% gtr 9would be true because17is greater than9, butif "%var%" gtr "9"would be FALSE because1is LESS than9`

最后是语法说明 - 如果您使用代码块(即带括号的 [series of] 语句),那么

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

if condition (
 something
) else (
 someotherthing
)

【讨论】:

    【解决方案2】:

    正如 Marc 所说,你的问题是这个命令:

    set direction =1
    

    它将名为“direction”的变量设置为 1(注意空格!)

    所以下面的语句:

    if %direction% == "1"
    

    (正确)扩展为:

       if  == "1"
    

    (因为%direction%不存在;你的变量是%direction %) 您可以(并且应该)通过将双方都放在括号中来避免语法错误: 如果 "%direction%" == "1" 这将扩展为

    if "" == "1"
    

    不是,你想要什么,但现在语法没问题。 要正确设置变量,请使用不带空格的set命令:

    设置方向=1

    甚至更好(在这种情况下不需要,但有时会很有帮助):

    设置“方向=1”

    这消除了尾随空格的可能性 (1)

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

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

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

    【讨论】:

    • 哦,我忘了:加一和减一的时候,加的数字没有区别。我的意思是:1 --> 按d --> 1。所以我加了两个。
    • @recon if /?: if errorlevel 1 检查错误级别是否为 1 或更高。由于 2 确实 is 高于 1,如果 errorlevel 为 2,则两个 IF 都是正确的。可以肯定的是,请改用 if %errorlevel%==1。这不进行数字比较,而是进行字符串比较。
    • 谢谢斯蒂芬,你是这里的一个正常人:)谢谢
    • 嗯,我正在努力 ;-) 但说真的:如果你需要帮助,你会得到帮助。如果您需要更多帮助,您将获得更多帮助。如果您要求代码,您将一无所获。这就是这个网站的运作方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2019-01-03
    相关资源
    最近更新 更多