FOR /L %%i IN (1,1,100) DO (
choice
echo %ErrorLevel%
)
无论您选择何种选择, %ErrorLevel%
始终为0
。
答案 0 :(得分:6)
您正在以错误的方式检查错误级别。
括号对中的变量和命令就像这样......
(
command1
command2
command3
)
...就像他们在一行上一样运行,就像这个command1 & command2 & command3
。
在命令行中尝试此操作。
choice & echo %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%
==================================== 以下问题的解决方案
或者,Microsoft已经创建了一种方法来访问括号对内部变量的当前值,他们称之为“延迟扩展”,因为代码行被解释了两次。
要激活此模式,请使用带有setlocal
开关的enableDelayedExpansion
命令,并使用!来访问变量!像这样的人物。仅供参考endlocal
关闭效果。
@echo off
setlocal enableDelayedExpansion
for /L %%i in (1,1,100) do (
choice /m "Question #%%i"
echo !ErrorLevel!
)
endlocal
正如您所看到的,我的第一个示例更容易编码,但我的第二个示例更易于阅读。无论您使用哪种方法,都取决于您的需求和可重用性。
setlocal
命令还可以创建在endlocal
命令之后死亡的临时变量。这意味着您不需要在批处理文件结束时删除它们,并将执行期间更改的任何变量恢复为原始值。这很好,因为您不必担心“踩踏”任何预先存在的变量。