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%"
–
–
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
–
–
–
–
–
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%"
–
–
–
–
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.