我在测试代码时遇到了一个大问题。而这个问题是令人讨厌的消息... “超出最大递归深度”。看看它是如何工作的:批量限制 - 浏览菜单时的最大递归
@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 - >(第一时间) - > 1 - >(第二次) - > 1 - > a(第三次)等等等等等012-1 - > a(第八次) - > 1 - > a(ninith时间),此时,您将获得“Maximum递归深度超出“。消息。如果你只是不理会这个消息,你的代码的内部计算将开始表现奇怪,甚至很难它“显然”似乎已经产生良好的结果
事实上,顺序并不重要。如果在字母“a”和“b”或更多“a”之间保持不同于“b”,则会发生同样的情况:
1→b(第一次)→1→a第二次)→1→a(第三次)... 1→a(第八次)→1→b(第九次)。 “超出最大递归深度”。消息
此外,如果用户无情地键入选项1(总是仅保留在主菜单),错误消息在第12次尝试后弹出。
如何保持与上述相同的代码结构但避免此错误?我在这里简化了,但我正在谈论一批数百行代码和几个二级,三级,四级等子菜单。
谢谢
Maleck
我有很多setlocal打开但没有关闭。通过在代码的几个区域发出命令ENDLOCAL,问题几乎已经消失。 ENDLOCAL太多了吗?我不想错过任何像%cnt%这样的变量的结果。根据ENDLOCAL的去向,%cnt%不显示任何值。在数百行代码中,我应该在哪里放置ENDLOCAL以获得性能并且不会错过数据? – 2012-08-12 04:01:14