【发布时间】:2012-08-08 15:36:45
【问题描述】:
我在测试我的代码时遇到了一个大问题。而这个问题就是烦人的消息……“超出最大递归深度”。看看它是如何工作的:
@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 etc 1 --> a (第八次) --> 1 --> a (第九次),此时,您将收到 "Maximum recursion depth exceeded". 消息。如果您一直忽略此消息,您的代码的内部计算将开始表现出奇怪的行为,甚至“显然”似乎已经产生了良好的结果
其实顺序无关紧要。如果您在字母“a”和“b”之间不断变化,或者“a”多于“b”,也会发生同样的事情:
1 --> b (第一次) --> 1 --> a (第二次) --> 1 --> a (第三次) ... 1 --> a (第八次) --> 1 --> b (第九次)。再次出现“超出最大递归深度”。 消息
此外,如果用户不断地输入选项 1(总是停留在 MAIN MENU),则在第 12 次试用后会弹出错误消息。
如何保持与上面相同的代码结构但避免出现此错误?我在这里简化,但我说的是一批几百行代码和几个二级、三级、四级等子菜单。
谢谢,
马莱克
【问题讨论】:
-
我有很多 setlocal 打开但没有关闭。通过在代码的几个区域发出命令 ENDLOCAL,问题几乎消失了。 ENDLOCAL 是否太多?我不想错过任何变量(如 %cnt%)的结果。根据 ENDLOCAL 的位置,%cnt% 不显示任何值。在数百行代码中,究竟应该将 ENDLOCAL 放在哪里才能获得性能并且不会丢失数据?
标签: batch-processing batch-file