здесь также выглядит хорошим кандидатом на этот вопрос
Выполнение события click на отключенном элементе? Javascript jQuery
jQuery('input#submit').click(function(e) {
if ( something ) {
return false;
}
});
Я закончил тем, что использовал имена меток, содержащие значения для выражений падежа, как это было предложено 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
Это проще читать:
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...
Сегодня я искал 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
, когда выбор найден.
Компактная форма для коротких команд (без 'echo'):
IF "%ID%"=="0" ( ... & ... & ... ) ELSE ^
IF "%ID%"=="1" ( ... ) ELSE ^
IF "%ID%"=="2" ( ... ) ELSE ^
REM default case...
После ^
должен быть немедленный конец строки без пробелов.
Я думаю, все остальные варианты были бы более загадочными. Для тех, кто любит читаемый и нешифрованный код:
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
. Более загадочные «яйца» можно найти здесь . .
Это может быть немного поздно, но это делает это:
set "case1=operation1"
set "case2=operation2"
set "case3=operation3"
setlocal EnableDelayedExpansion
!%switch%!
endlocal
% switch% заменяется перед выполнением строки. Серьезные недостатки:
Может в конечном итоге быть полезным в некоторых случаях.
Попробуйте этим способом. Для выполнения некоторого списка операций, таких как
@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
Если if
не работает, вы используете:
:switch case %n%=1
statements;
goto :switch case end
etc..
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
Немного вещей отметить:
call
наверху; rem
внутренняя часть для предотвращения ошибки круглой скобки; goto:EOF
выйдет из родительского контекста). Это могло обойтись путем замены goto:%1-
в подпрограмме с call:%1-
за цену дополнительных call
наверху; :-
префикс (которые допустимы), и не передача контрольной переменной приведет к случаю по умолчанию.