подпрограмма пакетного файла

Я пытаюсь повторно использовать код пакетного файла для выполнения аналогичных задач на страницах меню.

Главное меню состоит из 10+ опций. Когда я захожу внутрь каждого пункта меню, мне нужно отобразить следующее в тексте

Press [C] to Continue or [X] to exit [C/X]: _

Я создавал метки в каждом меню и перенаправлял на код, который отвечает за запрос сообщения и выполнение необходимых действий.

Как я могу использовать этот следующий код в качестве подпрограммы, чтобы мне не приходилось переписывать код несколько раз. На данный момент я жестко кодирую его в каждом пункте меню. Было бы легко назвать это подпрограммой.

:MiniMenu1
SET INPUT1=
SET /P INPUT1=Press [Y] to Continue Installation or [N] to go back [Y/N]:
IF /I '%INPUT1%'=='y' GOTO Mini_cont1
IF /I '%INPUT1%'=='n' GOTO Mini_back1
ECHO ============INVALID INPUT============
ECHO Please select a number from the Menu Options
ECHO -------------------------------------
ECHO ======PRESS ANY KEY TO CONTINUE======

PAUSE > NUL
GOTO MiniMenu1

Где мой код для страниц пунктов главного меню

:Selection1
:: MAin menu item 1
   GOTO MiniMenu1
:Mini_cont1
:: xCopy update.zip C:\python27\ /y
@echo Update Completed.
 pause 
:Mini_back1
:: end
GOTO MENU

person rush dee    schedule 20.09.2014    source источник


Ответы (1)


Ах, мысли в правильном направлении. Отлично.

@echo off
setlocal
call :ask Question number one
if errorlevel 2 goto Q1X
call :ask Question number two
if errorlevel 2 goto Q2X
::get here for Q1Q2 responses both C
goto :eof

:ask
choice /c CX /N /M "%*"
goto :eof

Вот базовый шаблон. В командной строке введите choice /? для получения инструкций по параметрам.

Подсказка: set "choices=wqzk" тогда в подпрограмме choice /c %choices% /N /M "%*" можно будет изменить доступные варианты. /n предлагает доступные варианты, поэтому вам не нужно указывать это в тексте, просто сделайте это очевидным - например, Whatever, Quit, Zap, Kill должно быть очевидным для wqzk.

Возврат в %errorlevel% будет порядковым номером выбранного символа. W==>1, Q==>2..K==>4. В традиционной конструкции if errorlevel n сравнение истинно, если errorlevel равно n или больше n, поэтому было бы традиционно использовать

if errorlevel 4 goto QnA4
if errorlevel 3 goto QnA3
if errorlevel 2 goto QnA2
:: if it gets here, errorlevel is 1 hence choice was first character.

что короче "современного" пути

if %errorlevel%==1 goto QnA1
if %errorlevel%==2 goto QnA2
if %errorlevel%==3 goto QnA3
:: if it gets here, errorlevel is 4 or more hence choice was fourth or later character.

Примечание. %* означает all of the arguments passed to the subroutine, поэтому /m "%*" аккуратно показывает аргументы, переданные в качестве подсказки. В этом нет никакого вуду. Но будьте осторожны - только текст и несколько символов, если хотите. Символы со специальным значением cmd могут привести к неожиданным результатам


Переменные, созданные/измененные/удаленные после setlocal, будут удалены/восстановлены/возрождены при обнаружении соответствующего endlocal. Следовательно, setlocal часто используется в качестве первого «оператора действия» в пакете — среда восстанавливается до исходного состояния, когда пакет заканчивается.

Чтобы удалить переменные в пакете с помощью подпрограммы, вы можете использовать

call :zap we dont want these variables

:zap
if "%1" neq "" set "%1="&shift&goto zap
goto :eof

(для удаления переменных we dont want these и variables

or :zap version 2

:zap
for %%a in (%*) do set "%%a="
goto :eof

Чтобы удалить переменные, которые начинаются с одинакового шаблона символов, используйте

FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="

(который удалит все переменные, начинающиеся с $. $ не является святым - вы можете заменить xyz на $ здесь и, например, zap xyz123 xyz789 и xyzylofone)

Естественно, вы также можете комбинировать методы...

Но - не дорого задать новый вопрос на SO. Совсем не дорого. Дешево даже. Задавая новый вопрос, а не помечая дополнительные проблемы в существующей, упрощается поиск решения (например, кто-то, кто хочет знать, как удалять переменные, возможно, не ожидает найти его под вопросом, например, подпрограмма пакетного файла) , Это также предотвращает превращение вопроса в сагу.

person Magoo    schedule 20.09.2014
comment
Спасибо, это работает. Как я могу очистить переменные, определенные в setlocal, в случае, если они сохранены, когда я снова вызываю подпрограмму. - person rush dee; 20.09.2014