Корпус коммутатора для пакетного файла - PullRequest
0 голосов
/ 18 декабря 2018

В настоящее время я читаю «Батчография: искусство программирования пакетных файлов» Элиаса Бачалани, и я использую один из сценариев, который демонстрирует использование коммутатора и как этого добиться, поскольку он не встроен.

Во всяком случае, один из сценариев, которые он использует / создал, я не могу понять всю жизнь, как он получает ответы, когда вы вводите 3 или 4.

Сценарий ниже и называется switch-case.bat если вы извлекаете его с веб-сайта GitHub .

Может кто-нибудь объяснить, как для switch-case-fallthrough, когда вы используете 3 или 4, ответит "fallthrough"«хотя на самом деле на этикетке не написано дело?

Спасибо, помощь в объяснении очень важна.


@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

1 Ответ

0 голосов
/ 18 декабря 2018

goto ищет метку от текущей позиции вниз.Если он не находит метку, он продолжает поиск в верхней части скрипта.

Таким образом, в разделе switch-case-fallthrough, 3 находит метку :switch-case-N-3 в разделе Switch/case выше и продолжает там.(Вы можете доказать, изменив echo Three в строке 57 на echo Three [here I am])

Точно так же, как в разделе switch-case-fallthrough 4 достигает строки 86 выше.

...