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%" ) 
4

8 Answers

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:

8

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 
1

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%" ) 
5

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

I believe you can use something such as

if ___ ( do this ) else if ___ ( do this ) 
3

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.

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 ) 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy