Multiple If-Else Conditions in Batch-File

Recently I asked a question about how to use a if-else-Check in a batch-file which got solved. Now i tried to Expand on that by using multiple if-else-conditions in my batch-file. When executing it, nothing happens.

To understand what I'm trying to accomplish: I have an .ini-file with 4 different states. I want my batch-script to check every state and perform a task for the respective case. For testing I set a command to just create a folder but when ready it should perform other tasks. But that's not important for my question I think. This is my code so far:

  @echo off
setlocal enabledelayedexpansion
for /f "tokens=2 delims==" %%G in ('findstr "lang=" conf.ini') do (
    if "%%G"=="deu" (
        for /f "tokens=2 delims==" %%G in ('findstr "vers=" conf.ini') do (
            if "%%G"=="orig" (
                for /f "tokens=2 delims==" %%G in ('findstr "enhancements=" conf.ini') do (
                    if "%%G"=="0" (
                        for /f "tokens=2 delims==" %%G in ('findstr "modifications=" conf.ini') do (
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOff.modificationsOff
                                goto :done
                                )
                            if "%%G"=="1" (
                                mkdir DeutscheSprache.Original.EnhancementsOff.modificationsOn
                                )
                                goto :done
                                )
                    if "%%G"=="1" (
                        for /f "tokens=2 delims==" %%G in ('findstr "modifications=" conf.ini') do (
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOn.modificationsOff
                                goto :done
                                )
                            if "%%G"=="1" (
                                mkdir DeutscheSprache.Original.EnhancementsOn.modificationsOn
                                )
                                goto :done
                            )
            if  "%%G"=="rem" (
                for /f "tokens=2 delims==" %%G in ('findstr "enhancements=" conf.ini') do (
                    if "%%G"=="0" (
                        for /f "tokens=2 delims==" %%G in ('findstr "modifications=" conf.ini') do (
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOff.modificationsOff
                                goto :done
                                )
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOff.modificationsOn
                                )
                                goto :done
                            )
                    if "%%G"=="1" (
                        for /f "tokens=2 delims==" %%G in ('findstr "modifications=" conf.ini') do (
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOn.modificationsOff
                                goto :done
                                )
                            if "%%G"=="1" (
                                mkdir DeutscheSprache.Original.EnhancementsOn.modificationsOn
                                )
                                goto :done
                            )
  if "%%G"=="deu" (
        for /f "tokens=2 delims==" %%G in ('findstr "vers=" conf.ini') do (
            if "%%G"=="orig" (
                for /f "tokens=2 delims==" %%G in ('findstr "enhancements=" conf.ini') do (
                    if "%%G"=="0" (
                        for /f "tokens=2 delims==" %%G in ('findstr "modifications=" conf.ini') do (
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOff.modificationsOff
                                )
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOff.modificationsOn
                                )
                                goto :done
                            )
                    if "%%G"=="1" (
                        for /f "tokens=2 delims==" %%G in ('findstr "modifications=" conf.ini') do (
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOn.modificationsOff
                                goto :done
                                )
                            if "%%G"=="1" (
                                mkdir DeutscheSprache.Original.EnhancementsOn.modificationsOn
                                )
                                goto :done
                            )
            if  "%%G"=="rem" (
                for /f "tokens=2 delims==" %%G in ('findstr "enhancements=" conf.ini') do (
                    if "%%G"=="0" (
                        for /f "tokens=2 delims==" %%G in ('findstr "modifications=" conf.ini') do (
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOff.modificationsOff
                                goto :done
                                )
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOff.modificationsOn
                                )
                                goto :done
                            )
                    if "%%G"=="1" (
                        for /f "tokens=2 delims==" %%G in ('findstr "modifications=" conf.ini') do (
                            if "%%G"=="0" (
                                mkdir DeutscheSprache.Original.EnhancementsOn.modificationsOff
                                goto :done
                                )
                            if "%%G"=="1" (
                                mkdir DeutscheSprache.Original.EnhancementsOn.modificationsOn
                                )
                                goto :done
                            )
:done
endlocal
    

Edit: Since I was recommended in the Comments to show my conf.ini-file:

lang=deu
vers=orig
enhancements=0
modifications=0

The Script should check all four entries and do tasks which are different to each other. For testing reasons it should just create a folder. ifst it should check the language (lang) and continue to go to ger or eng. For both cases it should check the version (vers). After that (again for both cases) it should check enhancements and the same process should be repeated for the last line. Therefore i have 16 possible outcomes

Edit 2: These are the outcomes i expect. For testing it should start a pre-definied bath script:

Case 1
lang=ger
vers=orig
enhancements=0
modifications=0
=> Start case1.bat

Case 2
lang=ger
vers=orig
enhancements=0
modifications=1
=> Start case2.bat

Case 3
lang=ger
vers=orig
enhancements=1
modifications=0
=> Start case3.bat

Case 4
lang=ger
vers=orig
enhancements=1
modifications=1
=> Start case4.bat

Case 5
lang=ger
vers=rem
enhancements=0
modifications=0
=> Start case5.bat

Case 6
lang=ger
vers=rem
enhancements=0
modifications=1
=> CStart case6.bat

Case 7
lang=ger
vers=rem
enhancements=1
modifications=0
=> Start case7.bat

Case 8
lang=eng
vers=rem
enhancements=1
modifications=1
=> Start case8.bat

Case 9
lang=eng
vers=orig
enhancements=0
modifications=0
=> Start case9.bat

Case 10
lang=eng
vers=orig
enhancements=0
modifications=1
=> Start case10.bat

Case 11
lang=eng
vers=orig
enhancements=1
modifications=0
=> Start case11.bat

Case 12
lang=eng
vers=orig
enhancements=1
modifications=1
=> Start case12.bat

Case 13
lang=eng
vers=rem
enhancements=0
modifications=0
=> Start case13.bat

Case 14
lang=eng
vers=rem
enhancements=0
modifications=1
=> Start case14.bat

Case 15
lang=eng
vers=rem
enhancements=1
modifications=0
=> Start case15.bat

Case 16
lang=eng
vers=rem
enhancements=1
modifications=1
=> Start case16.bat
11

3 Answers

Instead of using nested loops It is easier to extract and process the values independent from each other.

@echo on

setlocal enabledelayedexpansion

REM Extract values from the file to individual variables independent from each other.

for /f "tokens=2 delims==" %%G in ('findstr "lang=" conf.ini') do set LNG=%%G
for /f "tokens=2 delims==" %%G in ('findstr "vers=" conf.ini') do set VER=%%G
for /f "tokens=2 delims==" %%G in ('findstr "enhancements=" conf.ini') do set ENH=%%G
for /f "tokens=2 delims==" %%G in ('findstr "modifications=" conf.ini') do set MOD=%%G

REM Derive 4 parts of the directory name from individual values independent from each other.

if "%LNG%"=="deu"  set XL=DeutscheSprache
if "%LNG%"=="eng"  set XL=EnglischeSprache

if "%VER%"=="orig" set XV=Original
if "%VER%"=="rem"  set XV=Remastered

if "%ENH%"=="0"    set XE=EnhancementsOff
if "%ENH%"=="1"    set XE=EnhancementsOn

if "%MOD%"=="0"    set XM=ModificationsOff
if "%MOD%"=="1"    set XM=ModificationsOn

REM Create directory name based on the parts defined above.

set DIR=%XL%.%XV%.%XE%.%XM%

REM (Using "echo mkdir" instead of "mkdir for testing only.)

echo mkdir %DIR%

REM Other possibilities to answer the comment about running multiple commands instead of a single "set" command.

REM Depending on your requirements you can also run multiple commands
REM or check combinations of values using a single "if" statement.
REM Example:

if "%LNG%.%VER%.%ENH%.%MOD%"=="deu.orig.0.0" (
    echo This is case DeutscheSprache.Original.EnhancementsOff.modificationsOff
    echo foo
    echo bar
)
if "%LNG%.%VER%.%ENH%.%MOD%"=="deu.orig.0.1" (
    echo This is case DeutscheSprache.Original.EnhancementsOff.modificationsOn
    echo bar
    echo baz
)

REM etc...

endlocal

This script does not handle errors if the expected patterns are not found or if the configuration contains unexpected values.

4
  • You can do this without if()else() conditions by using Findstr with operators && ||:
@echo off

setlocal enabledelayedexpansion
cd /d "%~dp0" && set "_01=Enhancements,Modifications"

for %%i in (%_01%)do %__AppDir__%Findstr.exe /ibl %%~i=0 <.\conf.ini >nul && (
     set "_%%~i=%%~iOff" && %comSpec% /v:on /q /c "set^ "_%%~i=!_%%~i!"") || (
     set "_%%~i=%%~iOn". && %comSpec% /v:on /q /c "set^ "_%%~i=!_%%~i!"")

2>nul >con: %__AppDir__%Findstr.exe /ibl "vers=rem" <.\conf.ini >nul && (
     set "_dir=Sprache.Remastered.!_Enhancements!.!_Modifications!") || (
     set "_dir=Sprache.Original.!_Enhancements!.!_Modifications!"..)
      
2>nul >con: %__AppDir__%Findstr.exe /ibl "lang=deu" <.\conf.ini >nul && (
     2>nul dir/ad/b .\Deutsche!_dir!\.||>nul mkdir "Deutsche!_dir!") || (
     2>nul dir/ad/b .\Englishe!_dir!\.||>nul mkdir "Englishe!_dir!")

2>con: %__AppDir__%Timeout.exe /t -1|dir/a:d/tc/o-d/b *!_dir!. & endlocal


  • You also can to do this by using if() if else() else() in one for /f loop too:
@echo off

cd /d "%~dp0" && setlocal enabledelayedexpansion
set "_str=vers= lang= enhancements= modifications="

for /f usebackq^tokens^=1*delims^=^= %%a in (`%__AppDir__%Findstr.exe /ibl "!_str!" ^<.\conf.ini
=;`)do if /i "%%~a" == "vers" (if /i "%%~b" == "rem" (set "_sts=Remastered")else set "_sts=Original"
      )else if /i "%%~a" == "lang" (if /i "%%~b" == "eng" (set "_lng=EnglisheSprache")else set "_lng=DeutscheSprache"
      )else if /i "%%~a" == "enhancements" (if "%%~b" == "0" (set "_enh=EnhancementsOff")else set "_enh=EnhancementsOn" 
      )else if /i "%%~a" == "modifications" (if "%%~b" == "0" (set "_mod=ModificationsOff")else set "_mod=ModificationsOn")
     
2>nul mkdir "!_lng!.!_sts!.!_enh!.!_mod!" & endlocal


  • For all Cases.bat:
@echo off
cd /d "%~dp0" && setlocal enabledelayedexpansion
set "_str=vers= lang= enhancements= modifications="

for /f tokens^=1*delims^=^= %%a in ('%__AppDir__%Findstr.exe /ibl "!_str!" ^<.\conf.ini
=;')do if /i "%%~a" == "vers" (if /i "%%~b" == "rem" (set "_sts=Rem")else set "_sts=Orig"
      )else if /i "%%~a" == "enhancements" (if "%%~b" == "0" (set "_enh=0")else set "_enh=1" 
      )else if /i "%%~a" == "modifications" (if "%%~b" == "0" (set "_mod=0")else set "_mod=1"
      )else if /i "%%~a" == "lang" (if /i "%%~b" == "eng" (set "_lng=Eng")else set "_lng=Ger")

goto %:^)

 ::  Running: .\GerOrig00.bat | Case 01  ::
 ::  Running: .\GerOrig01.bat | Case 02  ::
 ::  Running: .\GerOrig10.bat | Case 03  ::
 ::  Running: .\GerOrig11.bat | Case 04  ::
 ::  Running: .\GerRem00.bat  | Case 05  ::
 ::  Running: .\GerRem01.bat  | Case 06  ::
 ::  Running: .\GerRem10.bat  | Case 07  ::
 ::  Running: .\EngRem11.bat  | Case 08  ::
 ::  Running: .\EngOrig00.bat | Case 09  ::
 ::  Running: .\EngOrig01.bat | Case 10  ::
 ::  Running: .\EngOrig10.bat | Case 11  ::
 ::  Running: .\EngOrig11.bat | Case 12  ::
 ::  Running: .\EngRem00.bat  | Case 13  ::
 ::  Running: .\EngRem01.bat  | Case 14  ::
 ::  Running: .\EngRem10.bat  | Case 15  ::
 ::  Running: .\EngRem11.bat  | Case 16  ::

%:^)
%__AppDir__%Findstr.exe /li ".\!_lng!!_sts!!_enh!!_mod!\.bat" <"%~f0"
Call .\!_lng!!_sts!!_enh!!_mod!.bat & endlocal & goto :eOf || exit /b
  • File conf.ini content:
lang=deu
vers=rem
enhancements=0
modifications=1
  • Outputs Results:
 ::  Running: .\GerRem01.bat  | Case 06  ::


  • For all dir\folder\Case options:
@echo off

cd /d "%~dp0" && setlocal enabledelayedexpansion
set "_str=vers= lang= enhancements= modifications="

for /f usebackq^tokens^=1*delims^=^= %%a in (`%__AppDir__%Findstr.exe /ibl "!_str!" ^<.\conf.ini
=;`)do if /i "%%~a" == "vers" (if /i "%%~b" == "rem" (set "_sts=Remastered")else set "_sts=Original"
      )else if /i "%%~a" == "lang" (if /i "%%~b" == "eng" (set "_lng=EnglisheSprache")else set "_lng=DeutscheSprache"
      )else if /i "%%~a" == "enhancements" (if "%%~b" == "0" (set "_enh=EnhancementsOff")else set "_enh=EnhancementsOn" 
      )else if /i "%%~a" == "modifications" (if "%%~b" == "0" (set "_mod=ModificationsOff")else set "_mod=ModificationsOn")

goto %:^)

 :: Case N  | Strings   | Folder Names                                             
 :: -------   ---------   --------------------------------------------------------
 :: Case 01 | GerOrig00 | DeutscheSprache.Original.EnhancementsOff.ModificationsOff
 :: Case 02 | GerOrig01 | DeutscheSprache.Original.EnhancementsOff.ModificationsOn
 :: Case 03 | GerOrig10 | DeutscheSprache.Original.EnhancementsOn.ModificationsOff
 :: Case 04 | GerOrig11 | DeutscheSprache.Original.EnhancementsOn.ModificationsOn
 :: Case 05 | GerRem00  | DeutscheSprache.Remastered.EnhancementsOff.ModificationsOff
 :: Case 06 | GerRem01  | DeutscheSprache.Remastered.EnhancementsOff.ModificationsOn
 :: Case 07 | GerRem10  | DeutscheSprache.Remastered.EnhancementsOn.ModificationsOff
 :: Case 08 | EngRem11  | EnglisheSprache.Remastered.EnhancementsOn.ModificationsOn
 :: Case 09 | EngOrig00 | EnglisheSprache.Original.EnhancementsOff.ModificationsOff
 :: Case 10 | EngOrig01 | EnglisheSprache.Original.EnhancementsOff.ModificationsOn
 :: Case 11 | EngOrig10 | EnglisheSprache.Original.EnhancementsOn.ModificationsOff
 :: Case 12 | EngOrig11 | EnglisheSprache.Original.EnhancementsOn.ModificationsOn
 :: Case 13 | EngRem00  | EnglisheSprache.Remastered.EnhancementsOff.ModificationsOff
 :: Case 14 | EngRem01  | EnglisheSprache.Remastered.EnhancementsOff.ModificationsOn
 :: Case 15 | EngRem10  | EnglisheSprache.Remastered.EnhancementsOn.ModificationsOff
 :: Case 16 | EngRem11  | EnglisheSprache.Remastered.EnhancementsOn.ModificationsOn

%:^)
<con: %__AppDir__%Findstr.exe /i "|.!_lng!.!_sts!.!_enh!.!_mod!" <"%~f0"
2>nul md "!_lng!.!_sts!.!_enh!.!_mod!" & endlocal & goto :eOf || exit /b 
  • File conf.ini content:
lang=eng
vers=ori
enhancements=1
modifications=0
  • Outputs Results:
 :: Case 11 | EngOrig10 | EnglisheSprache.Original.EnhancementsOn.ModificationsOff


  • For all mkdir .\Folder and also all yours CaseStringOptions.bat in one bat:
@echo off 

cd /d "%~dp0" && setlocal enabledelayedexpansion
set "_str=vers= lang= enhancements= modifications="

for /f tokens^=1*delims^=^= %%a in ('%__AppDir__%Findstr.exe /ibl "!_str!" ^<.\conf.ini
=;')do if /i "%%~a" == "vers" (if /i "%%~b" == "rem" (set "_sts=Rem")else set "_sts=Orig"
      )else if /i "%%~a" == "enhancements" (if "%%~b" == "0" (set "_enh=0")else set "_enh=1" 
      )else if /i "%%~a" == "modifications" (if "%%~b" == "0" (set "_mod=0")else set "_mod=1"
      )else if /i "%%~a" == "lang" (if /i "%%~b" == "eng" (set "_lng=Eng")else set "_lng=Ger")

goto %:^)

 ::  Case N   | Strings/Script  | Folder Names To Create     
 ::  Case 01  | .\GerOrig00.bat | DeutscheSprache.Original.EnhancementsOff.ModificationsOff
 ::  Case 02  | .\GerOrig01.bat | DeutscheSprache.Original.EnhancementsOff.ModificationsOn
 ::  Case 03  | .\GerOrig10.bat | DeutscheSprache.Original.EnhancementsOn.ModificationsOff
 ::  Case 04  | .\GerOrig11.bat | DeutscheSprache.Original.EnhancementsOn.ModificationsOn
 ::  Case 05  | .\GerRem00.bat  | DeutscheSprache.Remastered.EnhancementsOff.ModificationsOff
 ::  Case 06  | .\GerRem01.bat  | DeutscheSprache.Remastered.EnhancementsOff.ModificationsOn
 ::  Case 07  | .\GerRem10.bat  | DeutscheSprache.Remastered.EnhancementsOn.ModificationsOff
 ::  Case 08  | .\EngRem11.bat  | EnglisheSprache.Remastered.EnhancementsOn.ModificationsOn
 ::  Case 09  | .\EngOrig00.bat | EnglisheSprache.Original.EnhancementsOff.ModificationsOff
 ::  Case 10  | .\EngOrig01.bat | EnglisheSprache.Original.EnhancementsOff.ModificationsOn
 ::  Case 11  | .\EngOrig10.bat | EnglisheSprache.Original.EnhancementsOn.ModificationsOff
 ::  Case 12  | .\EngOrig11.bat | EnglisheSprache.Original.EnhancementsOn.ModificationsOn
 ::  Case 13  | .\EngRem00.bat  | EnglisheSprache.Remastered.EnhancementsOff.ModificationsOff
 ::  Case 14  | .\EngRem01.bat  | EnglisheSprache.Remastered.EnhancementsOff.ModificationsOn
 ::  Case 15  | .\EngRem10.bat  | EnglisheSprache.Remastered.EnhancementsOn.ModificationsOff
 ::  Case 16  | .\EngRem11.bat  | EnglisheSprache.Remastered.EnhancementsOn.ModificationsOn

%:^)
for /f usebackq^tokens^=2-5^delims^=^|^  %%i in (`%__AppDir__%Findstr.exe /i "!_lng!!_sts!!_enh!!_mod!" ^<"%~f0"
`)do echo\%%i %%~j ^| File: !_lng!!_sts!!_enh!!_mod! ^| Dir: %%~l& 2>nul mkdir ".\%%~l" & Call "%%~k" & endlocal
  • File conf.ini content:
lang=eng
vers=orig
enhancements=0
modifications=0
  • Outputs Results:
Case 09 | File: EngOrig00 | Dir: EnglisheSprache.Original.EnhancementsOff.ModificationsOff

Obs.: usebackq^tokens^=2-5^delims^=^|^SpaceSpace%%i in (...

I figured it out. Huge Credit to User Bobo for giving me to the right direction. This is the code, if anybody else ever want to do the same thing:

@echo off

setlocal enabledelayedexpansion

for /f "tokens=2 delims==" %%G in ('findstr "lang=" conf.ini') do set LNG=%%G
for /f "tokens=2 delims==" %%G in ('findstr "vers=" conf.ini') do set VER=%%G
for /f "tokens=2 delims==" %%G in ('findstr "enhancements=" conf.ini') do set ENH=%%G
for /f "tokens=2 delims==" %%G in ('findstr "modifications=" conf.ini') do set MOD=%%G

if "%LNG%"=="deu" (
    if "%VER%"=="orig" (
        if "%ENH%"=="0" (
            if "%MOD%"=="0" (
                mkdir DeutscheSprache.Original.EnhancementsOff.modificationsOff
            )
            if "%MOD%"=="1" (
                mkdir DeutscheSprache.Original.EnhancementsOff.modificationsOn
            )
        )
        if "%ENH%"=="1" (
            if "%MOD%"=="0" (
                mkdir DeutscheSprache.Original.EnhancementsOn.modificationsOff
            )
            if "%MOD%"=="1" (
                mkdir DeutscheSprache.Original.EnhancementsOn.modificationsOn
            )
        )
    )
    if  "%VER%"=="rem" (
        if "%ENH%"=="0" (
            if "%MOD%"=="0" (
                mkdir DeutscheSprache.Remastered.EnhancementsOff.modificationsOff
            )
            if "%MOD%"=="1" (
                mkdir DeutscheSprache.Remastered.EnhancementsOff.modificationsOn
            )
        )
        if "%ENH%"=="1" (
            if "%MOD%"=="0" (
                mkdir DeutscheSprache.Remastered.EnhancementsOn.modificationsOff
            )
            if "%MOD%"=="1" (
                mkdir DeutscheSprache.Remastered.EnhancementsOn.modificationsOn
            )
        )
    )
)
if "%LNG%"=="eng" (
    if "%VER%"=="orig" (
        if "%ENH%"=="0" (
            if "%MOD%"=="0" (
                mkdir EnglischeSprache.Original.EnhancementsOff.modificationsOff
            )
            if "%MOD%"=="1" (
                mkdir EnglischeSprache.Original.EnhancementsOff.modificationsOn
            )
        )
        if "%ENH%"=="1" (
            if "%MOD%"=="0" (
                mkdir EnglischeSprache.Original.EnhancementsOn.modificationsOff
            )
            if "%MOD%"=="1" (
                mkdir EnglischeSprache.Original.EnhancementsOn.modificationsOn
            )
        )
    )
    if  "%VER%"=="rem" (
        if "%ENH%"=="0" (
            if "%MOD%"=="0" (
                mkdir EnglischeSprache.Remastered.EnhancementsOff.modificationsOff
            )
            if "%MOD%"=="0" (
                mkdir EnglischeSprache.Remastered.EnhancementsOff.modificationsOn
            )
        )
        if "%ENH%"=="1" (
            if "%MOD%"=="0" (
                mkdir EnglischeSprache.Remastered.EnhancementsOn.modificationsOff
            )
            if "%MOD%"=="1" (
                mkdir EnglischeSprache.Remastered.EnhancementsOn.modificationsOn
            )
        )
    )
)
endlocal
4

Your Answer

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

David Miller

David Miller

Executive Financial & Market Analyst

David Miller brings 15 years of experience in global economics, personal finance strategy, and market dynamics. He specializes in turning complex economic trends into actionable insights for everyday readers.

Share this article
Twitter Facebook Pinterest