コードのテスト中に大きな問題に遭遇しました。そして、この問題は厄介なメッセージです... 「最大再帰深度を超えました」。それがどのように機能するか見てください:
@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回目) --> 1 --> a (2回目) --> 1 --> a (3回目) etc etc etc 1 --> a (8回目) --> 1 - -> a (9 回目) この時点で、「最大再帰深度を超えました」が表示されます。メッセージ。このメッセージを無視し続けると、コードの内部計算がおかしくなり始めます。「明らかに」良い結果が得られているように見えても、
実際、順序は関係ありません。次のように、文字 "a" と "b" の間、または "a" よりも "b" の間で変化し続けると、同じことが起こります。
1 --> b (1回目) --> 1 --> a (2回目) --> 1 --> a (3回目) … 1 --> a (8回目) --> 1 - →b(9回目)。再び「最大再帰深度を超えました」。メッセージ
さらに、ユーザーが執拗にオプション 1 を入力すると (常に MAIN MENU のみに留まる)、12 回目の試行後にエラー メッセージが表示されます。
上記と同じコード構造を維持しながら、このエラーを回避するにはどうすればよいですか? ここでは単純化していますが、数百行のコードのバッチと、いくつかの二次、三次、四次などのサブメニューについて話しているのです。
ありがとう、
マレック