В настоящее время я читаю «Батхография: искусство программирования пакетных файлов» Элиаса Бачаалани и использую один из сценариев, демонстрирующих использование переключателя и способы его достижения, поскольку он не встроен.
Во всяком случае, один из сценариев, которые он использует / создал, я не могу понять, как он получает ответы, когда вы вводите 3 или 4.
Сценарий находится ниже и называется переключатель-case.bat, если вы извлекаете его из Сайт GitHub.
Может ли кто-нибудь объяснить, как для switch-case-fallthrough, когда вы используете 3 или 4, ответы «проваливаются», даже если на этикетке действительно не написано case?
Спасибо, очень благодарны за помощь в объяснении этого.
@echo off
setlocal
set /P N=Enter number:
call :nested-if
echo.
call :switch-case
echo.
call :switch-case-combined
echo.
call :switch-case-fallthrough
goto :eof
:nested-if
echo Nested IFs...
if %N%==1 (
echo One
) ELSE (
if %N%==2 (
echo Two
) ELSE (
if %N%==3 (
echo Three
) ELSE (
echo Something else
)
)
)
echo After IFs
goto :eof
:switch-case
echo Switch/case
:: Call and mask out invalid call targets
call :switch-case-N-%N% 2>nul || (
:: Default case
echo Something else
)
goto :switch-case-end
:switch-case-N-1
echo One
goto :eof
:switch-case-N-2
echo Two
goto :eof
:switch-case-N-3
echo Three
goto :eof
:switch-case-end
echo After Switch/case
goto :eof
:switch-case-combined
echo Switch/case combined
:: Call and mask out invalid call targets
call :switch-case-N-%N% 2>nul || (
:: Default case
echo Something else
)
goto :switch-case-end
:switch-case-N-1
:switch-case-N-2
echo One or two
goto :eof
:switch-case-N-3
:switch-case-N-4
echo Three or Four
goto :eof
:switch-case-end
echo After Switch/case combined
goto :eof
:switch-case-fallthrough
echo Switch/case fallthrough
:: Call and mask out invalid call targets
call :switch-case-N-%N% 2>nul || (
:: Default case
echo Something else
)
goto :switch-case-end
:switch-case-N-1
echo One
:: Fallsthrough
:switch-case-N-2
echo Two
goto :eof
goto :eof
:switch-case-end
echo After Switch/case fallthrough
goto :eof
goto
ищет метку с текущей позиции вниз. Если ярлык не найден, поиск продолжается с начала скрипта.
Итак, в разделе switch-case-fallthrough
3
находит метку :switch-case-N-3
в разделе Switch/case
выше и продолжает там. (это можно проверить, заменив echo Three
в строке 57 на echo Three [here I am]
)
Таким же образом в секции switch-case-dropthrough 4
достигает строки 86 выше.
:label
или:: label-like comment
внутри командного блока, заключенного в круглые скобки()