我在测试我的代码时遇到了一个大问题。这个问题是令人讨厌的消息...... “超出最大递归深度”。看看它是如何工作的:
@echo off
REM ---------- MAIN MENU ----------
:Main
echo 1.Supermarket
echo 2.Exit Batch
setlocal
for /f %%A in ('"prompt $H & echo on & for %%B in (1) do rem"') do set "BS=%%A"
set /p Menu=%BS% Type in your option {1,2} followed by ENTER:
if not '%Menu%'=='' set Menu=%Menu:~0,1%
if %Menu% EQU 1 ENDLOCAL & goto Super
if %Menu% EQU 2 goto EOF
REM ---------- SECONDARY MENU ----------
:Super
echo 1.Supermarket
echo a.Apple
echo b.Banana
setlocal
for /f %%A in ('"prompt $H & echo on & for %%B in (1) do rem"') do set "BS=%%A"
set /p Menu=%BS% Type in your option {1,a,b} followed by ENTER:
if not '%Menu%'=='' set Menu=%Menu:~0,1%
if %Menu% EQU 1 ENDLOCAL & goto Main
if %Menu% EQU a ENDLOCAL & goto App
if %Menu% EQU b ENDLOCAL & goto Ban
:App
setlocal enabledelayedexpansion
set /a cnt=0
for /f "tokens=* delims= " %%a in (*.apple) do (set /a cnt+=1)
if %cnt% EQU 0 (
echo There are %cnt% apples & pause>nul & ENDLOCAL & goto Main
) else (
echo There are %cnt% apples
[... do many things and after 200 lines]
echo The total number of apples was %cnt% & pause>nul & ENDLOCAL & goto Main
:Ban
echo This is Banana & pause>nul & goto Main
:EOF
让我们假设用户连续遵循这个序列:
1 --> a (第一次) --> 1 --> a (第二次) --> 1 --> a (第三次) etc etc 1 --> a (第八次) --> 1 - -> a(第九次),此时,您将获得“超出最大递归深度”。信息。如果您一直忽略此消息,则代码的内部计算将开始表现出奇怪的行为,甚至“显然”似乎已经产生了良好的结果
事实上,顺序无关紧要。如果您在字母“a”和“b”之间不断变化,或者“a”多于“b”,也会发生同样的事情:
1 --> b (第一次) --> 1 --> a (第二次) --> 1 --> a (第三次) ... 1 --> a (第八次) --> 1 - -> b(第九次)。再次“超出最大递归深度”。信息
此外,如果用户不断地输入选项 1(总是只停留在 MAIN MENU),则在第 12 次试用后会弹出错误消息。
如何保持与上面相同的代码结构但避免此错误?我在这里简化,但我说的是一批几百行代码和几个二级、三级、四级等子菜单。
谢谢,
马莱克