2013-08-24 13 views
23

単一の式の値に応じて、Windowsバッチファイルで実行を分岐する簡単な方法があるのだろうかと思います。 C、C++、C#、Java、Javascript、PHP、その他の実際のプログラミング言語のswitch/caseブロックに似たもの。switch文がWindowsバッチファイルで同等である

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... 
) 

だから、ダム:

私の唯一の回避策は、プレーン同じ式が繰り返し異なる値に対する平等のためにチェックされている場合/ elseブロックです。より良い解決策はありますか?

+2

もう一つの方法(私はGotoを示唆していますが...)....あなたは ':ID1'':ID2'などのラベルを作成し、' Goto ID%ID% 'を関連するものにジャンプする必要があります。しかし、あなたがすでにやっていることはそれほど恐ろしいことではありませんか?私は、表現全体がそれぞれのケース/スイッチラインにある他の言語があると確信しています。 –

+0

多くの言語で 'switch'ステートメントがあります(これはCとC++では当てはまります)。if-else-ifチェーンの繰り返し比較を避けるため、この構造は速度最適化の目的で使用されます。高価になる可能性があります。通常、この場合、 'switch'を使用すると**大きな**可読性の向上はありません。なぜなら、連鎖比較はそれほど醜いものではないからです(あなたは単に定数と比較します)。私はあなたの質問が好奇心によって促され、バッチファイルのスピードを最適化したいとは思わないことを願っています! :-) ;-) –

+0

@LorenzoDonati「IF」/「ELSE」のコンストラクタ(可読性を出したのは誰ですか?)の可読性について私は不平を言っていません。私はちょうど同じコードを複数回書くのはスマートでエラーが起こりにくいとは思わない。そして、いいえ、心配しないでください...スピードも問題ではありません:-)バッチスクリプトをコーディングしながら、私はこの種の問題に何度も遭遇しています。 –

答えて

49

この質問にまだ遭遇している人は、AjV Jsyが提案したように、case式の値を含むラベル名を使用してしまいました。とにかく、GOTOの代わりにCALLを使用して、正しいケースブロックにジャンプし、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 
+2

創造的だがかなり厄介なコード –

10

これは読むのが簡単です。それがあなたがする必要があるものに合わない場合は、それをよりよく記述してください。

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... 
+1

ありがとう!可読性は常に良いですが、比較式(ここでは 'IF"%ID% "== ...")を繰り返さないようにすることが可能かどうか疑問です。 –

+1

計算を使用できますが、正確なタスクに依存します。バッチファイルは、ほとんどの場合、タスクの正確な要件に基づいて構築されているため、変更を加えずにバッチファイルをほとんどすべての状況で使用できます。 – foxidrive

2

今日はバッチファイルでswitch/caseを検索してこれを見つけました。私はこのソリューションを使用し、goto exitでそれを拡張しました。

選択肢が発見された場合、デフォルトの状態(エコーライン)と余分な if年代にもたらし
IF "%1"=="red" echo "one selected" & goto exit 
IF "%1"=="two" echo "two selected" & goto exit 
... 

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

:exit 

1

このように試してください。

  1. のような操作のリストを実行する。
  2. 条件文を確認してください。
  3. 3つ以上の引数を指定して関数を呼び出す。
  4. 短いコマンドのためのコンパクトなフォーム(なし 'エコー')

@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

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

^即時ラインエンドでなければなりませんした後、何のスペース

0

私は他のすべてのオプションを推測しませんより秘密になるだろう。読みやすく、非不可解なコードが好きな人のために:

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... 
) 

それは逸話のようだ:

マジシャン:魔法が経過行い、帽子の下に卵を入れて...帽子を削除します。 ..同じ卵を得るが、側面図に...

IFELSE解決策はそれほど悪くありません。 Pythonのものとほぼ同じです。ifelifelseより秘密の「卵」はhereで見つけることができます。

2

それは少し遅くなるかもしれませんが、これはそれん:

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

setlocal EnableDelayedExpansion 
!%switch%! 
endlocal 

%スイッチ%がラインの前に置き換えられます実行。深刻な欠点は:

  • あなたはそれが最終的にいくつかのケースで役に立つことかもしれません

DelayedExpansionを必要と

  • ケース変数をオーバーライドします。

  • 関連する問題