3
FOR /L %%i IN (1,1,100) DO (
    choice
    echo %ErrorLevel%
    )

%ErrorLevel%永远0不管你输入什么选择。

4

1 回答 1

7

您以错误的方式检查错误级别。

像这样的括号对内的变量和命令......

(
  command1
  command2
  command3
)

...就像他们在一条线上运行一样,就像这样command1 & command2 & command3

在命令行试试这个。

choice & echo %errorlevel%

如果你多次执行上面的命令,你会看到之前的errorlevel 被回显,而不是当前的

或者在命令行上试试这个:

set x=yes
( echo %x%
  set x=no
  echo %x%
)

您的输出将是:

yes
yes

就像你进入了echo %x% & set x=no& echo %x%

我喜欢将其视为系统没有时间更新变量。(尽管更准确的说法是变量仅在整行执行后才更新。)对于所有变量都是如此,而不仅仅是错误级别。

要使for循环中的变量正常工作,您需要call像这样在批处理文件(或外部批处理文件)中添加一个内部标签。

@echo off
  FOR /L %%i IN (1,1,100) DO call :dostuff %%i
goto :eof

:dostuff
  choice /m "Question #%1"
  echo %ErrorLevel%

=====================================解决下面的问题

或者,微软创建了一种访问括号对内变量当前值的方法,他们称之为“延迟扩展”,因为代码行被解释了两次。

要激活此模式,您可以使用setlocal带有开关的命令enableDelayedExpansion,并使用 ! 访问变量。像这样的性格。仅供参考endlocal关闭效果。

@echo off
setlocal enableDelayedExpansion
for /L %%i in (1,1,100) do (
  choice /m "Question #%%i"
  echo !ErrorLevel!
)
endlocal

如您所见,我的第一个示例更易于编码,但我的第二个示例更易于阅读。无论您使用哪种方法,都将取决于您的需求和可重用性。

setlocal命令还具有创建在命令后死亡的临时变量endlocal的效果。这意味着您无需在批处理文件结束时删除它们,并将您在执行期间更改的任何变量恢复为其原始值。这很好,因为您不必担心“踩到”任何预先存在的变量。

于 2012-08-29T17:43:19.257 回答