How to use if - else structure in a batch file?

前端 未结 8 702
南方客
南方客 2020-11-28 03:53

I have a question about if - else structure in a batch file. Each command runs individually, but I couldn\'t use \"if - else\" blocks safely so these parts of my programme d

相关标签:
8条回答
  • 2020-11-28 03:56

    I think in the question and in some of the answers there is a bit of confusion about the meaning of this pseudocode in DOS: IF A IF B X ELSE Y. It does not mean IF(A and B) THEN X ELSE Y, but in fact means IF A( IF B THEN X ELSE Y). If the test of A fails, then he whole of the inner if-else will be ignored.

    As one of the answers mentioned, in this case only one of the tests can succeed so the 'else' is not needed, but of course that only works in this example, it isn't a general solution for doing if-else.

    There are lots of ways around this. Here is a few ideas, all are quite ugly but hey, this is (or at least was) DOS!

    @echo off
    
    set one=1
    set two=2
    
    REM Example 1
    
    IF %one%_%two%==1_1 (
       echo Example 1 fails
    ) ELSE IF %one%_%two%==1_2 (
       echo Example 1 works correctly
    ) ELSE (
        echo Example 1 fails
    )
    
    REM Example 2
    
    set test1result=0
    set test2result=0
    
    if %one%==1 if %two%==1 set test1result=1
    if %one%==1 if %two%==2 set test2result=1
    
    IF %test1result%==1 (
       echo Example 2 fails
    ) ELSE IF %test2result%==1 (
       echo Example 2 works correctly
    ) ELSE (
        echo Example 2 fails
    )
    
    REM Example 3
    
    if %one%==1 if %two%==1 (
       echo Example 3 fails
       goto :endoftests
    )
    if %one%==1 if %two%==2 (
       echo Example 3 works correctly
       goto :endoftests
    )
    echo Example 3 fails
    )
    :endoftests
    
    0 讨论(0)
  • 2020-11-28 03:58

    I believe you can use something such as

    if ___ (
    
    do this
    
    ) else if ___ (
    
    do this
    
    )
    
    0 讨论(0)
  • 2020-11-28 04:02

    here is how I handled if else if situation

    if %env%==dev ( 
        echo "dev env selected selected"
    ) else (
        if %env%==prod (
            echo "prod env selected"
        )
    )
    

    Note it is not the same as if-elseif block as the other programming languages like C++ or Java but it will do what you need to do

    0 讨论(0)
  • 2020-11-28 04:06

    Your syntax is incorrect. You can't use ELSE IF. It appears that you don't really need it anyway. Simply use multiple IF statements:

    IF %F%==1 IF %C%==1 (
        ::copying the file c to d
        copy "%sourceFile%" "%destinationFile%"
        )
    
    IF %F%==1 IF %C%==0 (
        ::moving the file c to d
        move "%sourceFile%" "%destinationFile%"
        )
    
    IF %F%==0 IF %C%==1 (
        ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
        xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
        )
    
    IF %F%==0 IF %C%==0 (
        ::moving a directory
        xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
        rd /s /q "%sourceMoveDirectory%"
        )
    

    Great batch file reference: http://ss64.com/nt/if.html

    0 讨论(0)
  • 2020-11-28 04:10

    IF...ELSE IF constructs work very well in batch files, in particular when you use only one conditional expression on each IF line:

    IF %F%==1 (
        ::copying the file c to d
        copy "%sourceFile%1" "%destinationFile1%"
    ) ELSE IF %F%==0 (
        ::moving the file e to f
        move "%sourceFile2%" "%destinationFile2%" )
    

    In your example you use IF...AND...IF type construct, where 2 conditions must be met simultaneously. In this case you can still use IF...ELSE IF construct, but with extra parentheses to avoid uncertainty for the next ELSE condition:

    IF %F%==1 (IF %C%==1 (
        ::copying the file c to d
        copy "%sourceFile1%" "%destinationFile1%" )
    ) ELSE IF %F%==1 (IF %C%==0 (
        ::moving the file e to f
        move "%sourceFile2%" "%destinationFile2%"))
    

    The above construct is equivalent to:

    IF %F%==1 (
        IF %C%==1 (
        ::copying the file c to d
        copy "%sourceFile1%" "%destinationFile1%"
        ) ELSE IF %C%==0 (
        ::moving the file e to f
        move "%sourceFile2%" "%destinationFile2%"))
    

    Processing sequence of batch commands depends on CMD.exe parsing order. Just make sure your construct follows that logical order, and as a rule it will work. If your batch script is processed by Cmd.exe without errors, it means this is the correct (i.e. supported by your OS Cmd.exe version) construct, even if someone said otherwise.

    0 讨论(0)
  • 2020-11-28 04:11

    Here's my code Example for if..else..if
    which do the following

    Prompt user for Process Name

    If the process name is invalid
    Then it's write to user

    Error : The Processor above doesn't seem to be exist 
    

    if the process name is services
    Then it's write to user

    Error : You can't kill the Processor above 
    

    if the process name is valid and not services
    Then it's write to user

    the process has been killed via taskill

    so i called it Process killer.bat
    Here's my Code:

    @echo off
    
    :Start
    Rem preparing the batch  
    cls
    Title Processor Killer
    Color 0B
    Echo Type Processor name to kill It (Without ".exe")
    set /p ProcessorTokill=%=%  
    
    :tasklist
    tasklist|find /i "%ProcessorTokill%.exe">nul & if errorlevel 1 (
    REM check if the process name is invalid 
    Cls 
    Title %ProcessorTokill% Not Found
    Color 0A
    echo %ProcessorTokill%
    echo Error : The Processor above doesn't seem to be exist    
    
    ) else if %ProcessorTokill%==services (
    REM check if the process name is services and doesn't kill it
    Cls 
    Color 0c
    Title Permission denied 
    echo "%ProcessorTokill%.exe"
    echo Error : You can't kill the Processor above 
    
    ) else (
    REM if the process name is valid and not services
    Cls 
    Title %ProcessorTokill% Found
    Color 0e
    echo %ProcessorTokill% Found
    ping localhost -n 2 -w 1000>nul
    echo Killing %ProcessorTokill% ...
    taskkill /f /im %ProcessorTokill%.exe /t>nul
    echo %ProcessorTokill% Killed...
    )
    
    pause>nul
    
    
    
    REM If else if Template
    REM if thing1 (
    REM Command here 2 ! 
    REM ) else if thing2 (
    REM command here 2 !
    REM ) else (
    REM command here 3 !
    REM )
    
    0 讨论(0)
提交回复
热议问题