Ах, мысли в правильном направлении. Отлично.
@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