Эквивалент оператора Switch в командном файле Windows

здесь также выглядит хорошим кандидатом на этот вопрос

Выполнение события click на отключенном элементе? Javascript jQuery

jQuery('input#submit').click(function(e) {
    if ( something ) {        
        return false;
    } 
});

29
задан Peter Mortensen 5 November 2018 в 21:07
поделиться

9 ответов

Я закончил тем, что использовал имена меток, содержащие значения для выражений падежа, как это было предложено AjV Jsy. В любом случае, я использую CALL вместо GOTO, чтобы перейти к правильному блоку регистра, и GOTO :EOF, чтобы вернуться назад. Следующий пример кода представляет собой полный пакетный скрипт, иллюстрирующий эту идею.

@ECHO OFF

SET /P COLOR="Choose a background color (type red, blue or black): "

2>NUL CALL :CASE_%COLOR% # jump to :CASE_red, :CASE_blue, etc.
IF ERRORLEVEL 1 CALL :DEFAULT_CASE # If label doesn't exist

ECHO Done.
EXIT /B

:CASE_red
  COLOR CF
  GOTO END_CASE
:CASE_blue
  COLOR 9F
  GOTO END_CASE
:CASE_black
  COLOR 0F
  GOTO END_CASE
:DEFAULT_CASE
  ECHO Unknown color "%COLOR%"
  GOTO END_CASE
:END_CASE
  VER > NUL # reset ERRORLEVEL
  GOTO :EOF # return from CALL
58
ответ дан Peter Mortensen 5 November 2018 в 21:07
поделиться

Это проще читать:

IF "%ID%"=="0" REM do something
IF "%ID%"=="1" REM do something else
IF "%ID%"=="2" REM do another thing
IF %ID% GTR 2  REM default case...
14
ответ дан Peter Mortensen 5 November 2018 в 21:07
поделиться

Сегодня я искал switch / case в пакетных файлах и наткнулся на это. Я использовал это решение и расширил его с помощью goto exit.

IF "%1"=="red" echo "one selected" & goto exit
IF "%1"=="two" echo "two selected" & goto exit
...

echo "Options: [one | two | ...]

:exit 

Что приводит к состоянию по умолчанию (эхо-линия), и никаких дополнительных if, когда выбор найден.

2
ответ дан x6iae 5 November 2018 в 21:07
поделиться

Компактная форма для коротких команд (без 'echo'):

IF "%ID%"=="0" ( ... & ... & ... ) ELSE ^
IF "%ID%"=="1" ( ... ) ELSE ^
IF "%ID%"=="2" ( ... ) ELSE ^
REM default case...

После ^ должен быть немедленный конец строки без пробелов.

6
ответ дан Peter Mortensen 5 November 2018 в 21:07
поделиться

Я думаю, все остальные варианты были бы более загадочными. Для тех, кто любит читаемый и нешифрованный код:

IF        "%ID%"=="0" (
    REM do something

) ELSE IF "%ID%"=="1" (
    REM do something else

) ELSE IF "%ID%"=="2" (
    REM do another thing

) ELSE (
    REM default case...
)

Это похоже на анекдот:

Волшебник: Положи яйцо под шляпу, сделай магические пассы ... Снимите шляпу и ... получите то же яйцо, но на виде сбоку ...

Решение IF ELSE не так уж и плохо. Это почти так же хорошо, как Python if elif else. Более загадочные «яйца» можно найти здесь . .

2
ответ дан Peter Zagubisalo 5 November 2018 в 21:07
поделиться

Это может быть немного поздно, но это делает это:

set "case1=operation1"
set "case2=operation2"
set "case3=operation3"

setlocal EnableDelayedExpansion
!%switch%!
endlocal

% switch% заменяется перед выполнением строки. Серьезные недостатки:

  • Вы переопределяете переменные регистра
  • Это требует DelayedExpansion

Может в конечном итоге быть полезным в некоторых случаях.

2
ответ дан GrubHD 5 November 2018 в 21:07
поделиться

Попробуйте этим способом. Для выполнения некоторого списка операций, таких как

  1. Переключатель используется.
  2. Проверка условных высказываний.
  3. Вызов функции с более чем двумя аргументами.
<ч>
 @echo off
 :Start2 
    cls
    goto Start
    :Start
    echo --------------------------------------
    echo     Welcome to the Shortcut tool     
    echo --------------------------------------            
    echo Choose from the list given below:
    echo [1] 2017
    echo [2] 2018
    echo [3] Task

    set /a one=1
    set /a two=2
    set /a three=3
    set /a four=4
    set input=
    set /p input= Enter your choice:
    if %input% equ %one% goto Z if NOT goto Start2
    if %input% equ %two% goto X if NOT goto Start2
    if %input% equ %three% goto C if NOT goto Start2
    if %input% geq %four% goto N

    :Z
    cls
    echo You have selected year : 2017
    set year=2017
    echo %year%
    call:branches year

    pause
    exit

    :X
    cls
    echo You have selected year : 2018
    set year=2018
    echo %year%
    call:branches year
    pause
    exit

    :C  
    cls
    echo You have selected Task
    call:Task
    pause
    exit

    :N
    cls
    echo Invalid Selection! Try again
    pause
    goto :start2




    :branches
    cls
    echo Choose from the list of Branches given below:
    echo [1] January
    echo [2] Feburary
    echo [3] March
    SETLOCAL
    set /a "Number1=%~1"
    set input=
    set /p input= Enter your choice:
    set /a b=0
    set /a bd=3
    set /a bdd=4
    if %input% equ %b% goto N
    if %input% leq %bd% call:Z1 Number1,input if NOT goto Start2
    if %input% geq %bdd% goto N



    :Z1
    cls
    SETLOCAL
    set /a "Number1=%~1"
    echo year = %Number1%
    set /a "Number2=%~2"
    echo branch = %Number2%
    call:operation Number1,Number2
    pause
    GOTO :EOF


    :operation
    cls
    echo Choose from the list of Operation given below:
    echo [1] UB
    echo [3] B
    echo [4] C
    echo [5] l
    echo [6] R
    echo [7] JT
    echo [8] CT
    echo [9] JT
    SETLOCAL
    set /a "year=%~1"
    echo Your have selected year = %year%
    set /a "month=%~2"
    echo You have selected Branch = %month%
    set operation=
    set /p operation= Enter your choice:
    set /a b=0
    set /a bd=9
    set /a bdd=10
    if %input% equ %b% goto N
    if %operation% leq %bd% goto :switch-case-N-%operation% if NOT goto Start2
    if %input% geq %bdd% goto N




    :switch-case-N-1
    echo Januray
    echo %year%,%month%,%operation%
    goto :switch-case-end

    :switch-case-N-2
    echo Feburary
    echo %year%,%month%,%operation%
    goto :switch-case-end

    :switch-case-N-3
    echo march
    echo %year%,%month%,%operation%
    goto :switch-case-end

    :switch-case-end
       echo Task Completed
       pause
       exit
       goto :start2






    :Task
    cls
    echo Choose from the list of Operation given below:
    echo [1] UB
    echo [3] B
    echo [4] C
    echo [5] l
    echo [6] R
    echo [7] JT
    echo [8] CT
    echo [9] JT
    SETLOCAL
    set operation=
    set /p operation= Enter your choice:
    set /a b=0
    set /a bd=9
    set /a bdd=10
    if %input% equ %b% goto N
    if %operation% leq %bd% goto :switch-case-N-%operation% if NOT goto Start2
    if %input% geq %bdd% goto N




    :switch-case-N-1
    echo Januray
    echo %operation%
    goto :switch-case-end

    :switch-case-N-2
    echo Feburary
    echo %year%,%month%,%operation%
    goto :switch-case-end

    :switch-case-N-3
    echo march
    echo %year%,%month%,%operation%
    goto :switch-case-end

    :switch-case-end
       echo Task Completed
       pause
       exit
       goto :start2
1
ответ дан Stephen Rauch 5 November 2018 в 21:07
поделиться

Если if не работает, вы используете:

:switch case %n%=1 
statements;
goto :switch case end
etc..

http://lallouslab.net/2016/12/21/batchography-switch-case/

1
ответ дан Stephen Rauch 5 November 2018 в 21:07
поделиться

Hariprasad didupe предложил решение, предоставленное Batchography, но это могло быть улучшено немного. В отличие от этого, с другими случаями, входящими в случай по умолчанию, установит ERRORLEVEL на 1 и, если это не будет желаемо, необходимо вручную установить ERRORLEVEL на 0:

goto :switch-case-N-%N% 2>nul || (
    rem Default case
    rem Manually set ERRORLEVEL to 0 
    type nul>nul
    echo Something else
)
...

удобочитаемость могла быть улучшена за цену call наверху:

call:Switch Switch-Label %N% || (
:Switch-Label-1
    echo One
    goto:EOF     
:Switch-Label-2
    echo Two
    goto:EOF
:Switch-Label-3
    echo Three
    goto:EOF
:Switch-Label-
    echo Default case
)

:Switch
goto:%1-%2 2>nul || (
    type nul>nul
    goto:%1-
)
exit /b

Немного вещей отметить:

  1. , Как указано прежде, это имеет call наверху;
  2. случай По умолчанию требуется. Если никакое действие не необходимо помещенное rem внутренняя часть для предотвращения ошибки круглой скобки;
  3. Все случаи кроме по умолчанию выполняются в подконтексте. Если Вы хотите выйти из родительского контекста (обычно сценарий), можно использовать это ;
  4. случай По умолчанию выполняется в родительском контексте, таким образом, он не может быть объединен с другими случаями (поскольку достижение goto:EOF выйдет из родительского контекста). Это могло обойтись путем замены goto:%1- в подпрограмме с call:%1- за цену дополнительных call наверху;
  5. Подпрограмма берет префикс маркировки (без дефиса) и контрольная переменная. Без маркировки переключатель префикса будет искать маркировки с :- префикс (которые допустимы), и не передача контрольной переменной приведет к случаю по умолчанию.
0
ответ дан 27 November 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: