Пакет: Как правильно использовать CHOICE внутри функции CALL? - PullRequest
0 голосов
/ 21 октября 2019

У меня довольно запутанная проблема при использовании вложенных функций 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

1 Ответ

0 голосов
/ 22 октября 2019

Спасибо Стефану за правильный ответ в комментариях.

Решение состоит в том, чтобы использовать

set "errorlevel="

перед командой choice.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...