Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

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 doesn't work. How can I do make these parts run? Thank you.

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
ELSE IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
ELSE 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
ELSE IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
                Hi, Welcome to Stack Overflow! In order to create a code block you can highlight the relevant text and click the {} button; it helps to make posts more readable and avoids some problems with the mark-up. In answer to your question, it does now! When writing a question there's a preview below so you can see how it will look once posted.
– Ben
                Jun 18, 2012 at 11:24
                if anyone want to put multiple commands in one if can also see this post: stackoverflow.com/questions/13692916/…
– yu yang Jian
                Apr 28, 2021 at 12:29

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

Please correct me if I'm wrong, but I don't think you can use && in multiple if conditions, see my alternative syntax? – Bali C Jun 18, 2012 at 11:40 if my if conditions are like this: "IF %F%==0" run safely but when I added && it doesn't run. How can I use two conditions in an if? – eponymous Jun 18, 2012 at 13:00 @aprogrammer, Look at my example. If you have multiple conditions, use IF condition1 IF condition 2 – James Hill Jun 18, 2012 at 13:21 I had tried your answer but I couldn't had run it but I tried again and modified to my code ant it run. Last situation of some part of my code is like this: IF %F%==1 IF %C%==1 ( ::copying the file c to d copy "%sourceFile%" "%destinationFile%" ) ELSE( IF %F%==1 IF %C%==0 ( ::moving the file c to d move "%sourceFile%" "%destinationFile%" ) ) ELSE( 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 ) ) – eponymous Jun 18, 2012 at 13:57 What do you mean you can't you use ELSE IF? It works fine under Win7. See example: paste2.org/G8tMae92 – bryc Apr 30, 2016 at 19:55

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

AFAIK you can't do an if else in batch like you can in other languages, it has to be nested if's.

Using nested if's your batch would look like

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    ) ELSE (
        IF %F%==1 IF %C%==0(
        ::moving the file c to d
        move "%sourceFile%" "%destinationFile%"
        ) ELSE (
            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
            ) ELSE (
                IF %F%==0 IF %C%==0(
                ::moving a directory
                xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
                rd /s /q "%sourceMoveDirectory%"

or as James suggested, chain your if's, however I think the proper syntax is

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
                if else, especially in C-like languages is just a nested if too. You don't have to nest them with blocks in batch files either.
– Joey
                Jun 18, 2012 at 11:31
                @Joey I don't quite follow. I know the else if combo is just a nested if but I didn't think you could use those keywords together in batch like you can in C languages.
– Bali C
                Jun 18, 2012 at 11:35
                Hmm I still can't get it to work, but I'll take your word for it, you know what you're talking about, I'll leave this answer as a long version :)
– Bali C
                Jun 18, 2012 at 11:50
                When you write IF (test) (command) ELSE IF (test) (command), you are implying IF (test) (command) ELSE (IF (test) (command)). This may work sometimes, but if you believe it is an actual programming structure acceptable in DOS then it's going to be a PITA to troubleshoot when it fails.
– Tim
                Aug 8, 2016 at 15:50

A little bit late and perhaps still good for complex if-conditions, because I would like to add a "done" parameter to keep a if-then-else structure:

set done=0
if %F%==1 if %C%==0 (set done=1 & echo found F=1 and C=0: %F% + %C%)
if %F%==2 if %C%==0 (set done=1 & echo found F=2 and C=0: %F% + %C%)
if %F%==3 if %C%==0 (set done=1 & echo found F=3 and C=0: %F% + %C%)
if %done%==0 (echo do something)

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.

:tasklist tasklist|find /i "%ProcessorTokill%.exe">nul & if errorlevel 1 ( REM check if the process name is invalid 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 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 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 )

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.