在批处理文件中使用嵌套 CALL 函数和 CHOICE 命令时,我遇到一个相当令人困惑的问题。
用伪代码总结:
1.) 使用 CHOICE 命令,当选择正确的选项时,该命令将使用 CALL :function1
2.) :function1 使用 CALL :setVar_n
3.) :setVar_n 设置变量列表,并以 EXIT /B 结束返回到 :function1
4.) :function1 有一个 CHOICE 命令(Y/N),其中 Y 会继续执行操作然后以 EXIT /B 结束,N 立即以 EXIT /B 结束
问题:
无论输入如何,:function1 中的 CHOICE 命令始终计算为 N(第二个选项)。
我不明白为什么使用 %ERRORLEVEL% 失败,而 IF ERRORLEVEL 工作正常。我也不确定为什么使用 CALL 会导致 %ERRORLEVEL% 首先停止工作。
我试图避免重写每个选择命令(必须至少有 50 个,有些有 25 个以上选项)。
当使用 %ERRORLEVEL% 写入时,它会失败:
::Return from setVar_n here
CHOICE /C YN /M "Continue? Y/N >"
IF %ERRORLEVEL%==2 (EXIT /B)
::function1 continues here
如果我使用 IF ERRORLEVEL:
::Return from setVar_n here
CHOICE /C YN /M "Continue? Y/N >"
IF ERRORLEVEL 2 (EXIT /B)
::function1 continues here
工作正常。问题是,即使在 :function1 结束之后,CHOICE 问题仍然存在。它会影响整个文件中的所有 CHOICE 命令,因此根本无法使用 %ERRORLEVEL%。
有人能解释一下这个问题吗?
这是用于测试的完整文件代码,这可能更有意义:
@ECHO OFF
:start
choice /c ABC
if %errorlevel%==1 (goto start)
if %errorlevel%==2 (call :function1)
if %errorlevel%==3 (goto start)
echo Function 1 completed
pause
choice /c ABC
if %errorlevel%==1 (echo 1)
if %errorlevel%==2 (echo 2)
if %errorlevel%==3 (echo 3)
pause
exit
:setVar
set /a var1=2
set /a var2=3
exit /b
:function1
echo In Function 1
call :setVar
choice /c YN /m "Continue (Y) or Finish (N)"
if %errorlevel%==2 (exit /b)
echo Still inside function 1
exit /b
感谢 Stephan 在评论中提供正确答案。
解决方案是使用:
set errorlevel=
在
choice
命令之前。