2013-08-24 9 views
23

में समतुल्य स्विच स्टेटमेंट मुझे आश्चर्य है कि एक एकल अभिव्यक्ति के मूल्य के आधार पर विंडोज बैच फ़ाइल में शाखा निष्पादन का एक आसान तरीका है या नहीं। सी, सी ++, सी #, जावा, जावास्क्रिप्ट, PHP और अन्य वास्तविक प्रोग्रामिंग भाषाओं में स्विच/केस ब्लॉक के समान कुछ।विंडोज बैच फ़ाइल

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

तो गूंगा:

मेरी केवल वैकल्पिक हल एक सादे अगर/बाकी ब्लॉक जहां एक ही अभिव्यक्ति बार-बार विभिन्न मूल्यों के खिलाफ समानता के लिए चेक किया गया है है। कोई बेहतर समाधान?

+2

एक और तरीका (हालांकि मैं गोटो का सुझाव देने के लिए चिल्ला रहा हूं!) .... आप लेबल 'आईडीआई'': आईडी 2' आदि बना सकते हैं, और एक 'गोटो आईडी% आईडी%' को प्रासंगिक पर कूदना चाहिए। लेकिन जिस तरह से आप पहले से ही कर रहे हैं वह इतना भयानक नहीं है, है ना? मुझे यकीन है कि ऐसी अन्य भाषाएं हैं जहां संपूर्ण अभिव्यक्ति प्रत्येक मामले/स्विच लाइन पर है। –

+0

ध्यान रखें कि कई भाषाओं में 'स्विच' कथन है (यह कम से कम सी और सी ++ के लिए सच है) कि निर्माण गति-अनुकूलन उद्देश्यों के लिए उपयोग किया जाता है, क्योंकि यह if-else-if श्रृंखला की बार-बार तुलना से बचाता है, जो महंगा हो सकता है। आम तौर पर इस मामले में 'स्विच' का उपयोग करने में कोई ** बड़ी ** पठनीयता लाभ नहीं होती है, क्योंकि जंजीर तुलना उस बदसूरत नहीं होती है (आप केवल स्थिर के खिलाफ तुलना करते हैं)। मुझे आशा है कि आपका प्रश्न जिज्ञासा से प्रेरित होगा और आप वास्तव में बैच फ़ाइल को गति-अनुकूलित नहीं करना चाहते हैं! :-) ;-) –

+0

@LorenzoDonati मैं 'IF' /' ELSE' निर्माण (जो पठनीयता के साथ आया था) की पठनीयता के बारे में शिकायत नहीं कर रहा हूं? मुझे लगता है कि यह समान कोड लिखने के लिए स्मार्ट और त्रुटि-प्रवण नहीं है। और नहीं, चिंता न करें ... गति भी चिंता का विषय नहीं है :-) मैं सिर्फ उत्सुक हूं क्योंकि बैच स्क्रिप्ट कोडिंग करते समय मैंने कई बार इस तरह की समस्याओं में भाग लिया है। –

उत्तर

49

किसी भी व्यक्ति के लिए अभी भी इस सवाल पर हमला करने के लिए, मैं लेबल नामों का उपयोग करके समाप्त हुआ, जिसमें एजेवी जेसी द्वारा सुझाए गए केस एक्सप्रेशन के लिए मूल्य शामिल हैं। वैसे भी, मैं सही स्थिति ब्लॉक और GOTO :EOF पर कूदने के लिए GOTO के बजाय CALL का उपयोग करता हूं। निम्नलिखित नमूना कोड विचार को चित्रित करने वाली एक पूर्ण बैच स्क्रिप्ट है।

@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 "%1"=="red" echo "one selected" & goto exit 
IF "%1"=="two" echo "two selected" & goto exit 
... 

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

:exit 

कौन सा डिफ़ॉल्ट स्थिति (गूंज लाइन) में लाता है और बिना किसी अतिरिक्त if की जब चुनाव पाया जाता है।

1

इस तरह से प्रयास करें।

  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

कम आदेश के लिए कॉम्पैक्ट फार्म (कोई 'गूंज'):

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 समाधान है कि बुरा नहीं है। यह लगभग उतना ही अच्छा है जितना पाइथन ifelifelse। अधिक क्रिप्टिक 'अंडे' here पाया जा सकता है।

2

यह थोड़ी देर हो चुकी हो सकता है, लेकिन यह यह करता है:

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

setlocal EnableDelayedExpansion 
!%switch%! 
endlocal 

% स्विच% लाइन से पहले बदल दिया जाता है निष्पादन। गंभीर कमियां:

  • आप मामले चर
  • यह DelayedExpansion

की जरूरत है अंत में कुछ मामलों में उपयोगी हो सकता है ओवरराइड।

संबंधित मुद्दे