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 113 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 usingFindstrwith 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 onefor /floop 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.inicontent:
lang=deu vers=rem enhancements=0 modifications=1- Outputs Results:
:: Running: .\GerRem01.bat | Case 06 ::- For all
dir\folder\Caseoptions:
@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.inicontent:
lang=eng vers=ori enhancements=1 modifications=0- Outputs Results:
:: Case 11 | EngOrig10 | EnglisheSprache.Original.EnhancementsOn.ModificationsOff- For all
mkdir .\Folderand also all yoursCaseStringOptions.batin 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.inicontent:
lang=eng vers=orig enhancements=0 modifications=0- Outputs Results:
Case 09 | File: EngOrig00 | Dir: EnglisheSprache.Original.EnhancementsOff.ModificationsOffObs.: usebackq^tokens^=2-5^delims^=^|^SpaceSpace%%i in (...
Some further reading:
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