我在測試代碼時遇到了一個大問題。而這個問題是令人討厭的消息... 「超出最大遞歸深度」。看看它是如何工作的:批量限制 - 瀏覽菜單時的最大遞歸
@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