У меня довольно запутанная проблема при использовании вложенных функций CALL и команд CHOICE внутри командного файла.
Для суммирования в псевдокоде:
1.) Используйте команду CHOICE, которая использует CALL: function1, когда выбрана правильная опция
2.): Функция1 использует CALL: setVar_n
3.): setVar_n устанавливает список переменных и заканчивается EXIT / B, чтобы вернуться к: function1
4.): функция1 имеет команду CHOICE (Y / N)где Y продолжит выполнять операции, затем завершится EXIT / B, а N немедленно завершится EXIT / B
Проблема:
Команда CHOICE в: function1 всегда оценивается как N (второй вариант) независимо от ввода.
Я не понимаю, почему использование% ERRORLEVEL% не удается, в то время как IF ERRORLEVEL работает нормально. Я также не уверен, почему использование CALL приводит к тому, что% ERRORLEVEL% перестает работать в первую очередь.
Я стараюсь не переписывать каждую команду выбора (должно быть не менее 50, некоторые с 25+ опциями).
При записи с использованием% ERRORLEVEL% происходит сбой:
::Return from setVar_n here
CHOICE /C YN /M "Continue? Y/N >"
IF %ERRORLEVEL%==2 (EXIT /B)
::function1 continues here
Если я использую IF ERRORLEVEL:
::Return from setVar_n here
CHOICE /C YN /M "Continue? Y/N >"
IF ERRORLEVEL 2 (EXIT /B)
::function1 continues here
Это работает правильно. Проблема в том, что проблема CHOICE сохраняется даже после: function1 заканчивается. Он влияет на все команды CHOICE во всем файле, поэтому% ERRORLEVEL% не может быть использован вообще.
Может кто-нибудь пролить свет на эту проблему?
Вот полный код файла для тестирования,что может иметь больше смысла:
@ECHO OFF
:start
choice /c ABC
if %errorlevel%==1 (goto start)
if %errorlevel%==2 (call :function1)
if %errorlevel%==3 (goto start)
echo Function 1 completed
pause
choice /c ABC
if %errorlevel%==1 (echo 1)
if %errorlevel%==2 (echo 2)
if %errorlevel%==3 (echo 3)
pause
exit
:setVar
set /a var1=2
set /a var2=3
exit /b
:function1
echo In Function 1
call :setVar
choice /c YN /m "Continue (Y) or Finish (N)"
if %errorlevel%==2 (exit /b)
echo Still inside function 1
exit /b