Batch zwei Bedingungen bei if?
Gibt es eine Möglichkeit bei "if" zwei bedingungen anzugeben ohne immer auf eine neue Sprungmarke zu verweißen?
3 Antworten
[...] ohne immer auf eine neue Sprungmarke zu verweißen?
Springst du sonst bei jeder if-Abfrage zu einer Sprungmarke?
Du kannst Code nämlich auch direkt hinter die if-Abfrage schreiben und diesen sogar als Block über mehrere Zeilen fortführen:
if not exist beispiel.txt echo Datei nicht gefunden.
Hier ein (sinnloser) Beispiel-Block:
if "%variable%"=="Beispiel" (
set variable=0
pause
cls
)
Mit den Klammern lässt sich auch ein else-Block verwenden, der ausgeführt wird, wenn die Bedingung nicht zutrifft. Zudem lassen sich weitere if-Abfrage verwenden:
@echo off
if "%date:~0,6%"=="24.12." (
echo Heute ist Weihnachten
) else (
if %date:~3,2% GEQ 10 (
echo Nicht mehr lange bis Weihnachten
)
)
pause
Um zu deiner Frage zurück zu kommen:
Ein und gibt es in Batch nicht, ist aber so auch nicht viel umständlicher:
if <Bedingung1> if <Bedingung2> [(] <Befehl[e]> [)]
also zum Beispiel:
@echo off
choice /m "Beliebige Ziffer eingeben: " /c 0123456789 /n
set /a ziffer = %errorlevel% - 1
:: überprüfe ob ziffer im Bereich [3;6]
if %ziffer% GEQ 3 if %ziffer% LEQ 6 (
echo ziffer im Bereich [3;6]
) else (
echo ziffer groesser als 6
)
pause
Das Problem ist hier, das sich das else nicht auf beide Bedingungen bezieht, sondern nur auf die letzte, möchte man ein else im Sinne von
if not <Bedingung1> if not <Bedingung2>
muss man das entweder extra so hinschreiben, oder man verwendet Variablen/Sprungmarken (wie bei oder).
Problematischer wird es, wenn du ein oder verwenden willst. Also zum Beispiel "Zahl kleiner als 2 oder größer als 7"
Da könntest du natürlich auch wieder mit Sprungmarken arbeiten:
(Notiz: die Abfrage in dem Beispiel könnte natürlich stark vereinfacht werden, indem man nach GEQ 2 und LEQ 7 abfragt, aber soll ja nur ein Beispiel sein)
:: Anfangscode wie oben ::
if %ziffer% LSS 2 goto true
if %ziffer% GTR 7 goto true
echo Die ziffer ist groesser als 1 und kleiner als 8
goto continue
:true
echo Die Ziffer ist 0,1,8 oder 9
:continue
pause
exit
schöner denke ich wäre in dem Fall aber eine Variable:
:: Anfangscode wie oben ::
set "bool=false"
if %ziffer% LSS 2 set "bool=true"
if %ziffer% GTR 7 set "bool=true"
:: und dann reicht eine if-Abfrage
if %bool% equ true (
echo Die Ziffer ist 0,1,8 oder 9
) else (
echo Die ziffer ist groesser als 1 und kleiner als 8
)
pause
exit
FAZIT: Das beste ist wohl, zumindest für kompliziertere Fälle, mithilfe von mehreren if-Abfragen eine Variable zu setzten, mit der du dann eine finale if-Abfrage (inklusive else) durchführen kannst.
~Tim
Also zum einen kannst du den else-Block hier komplett weglassen, da du eh wegspringst und alles nach der if nur ausgeführt wird, wenn die Bedingungen falsch waren. Dann würde ich die Variablen und Sprungmarken anders benennen als 1 und 2 und dem Benutzer sagen, was er hier eingibt:
@echo off
:abfrage
set /p "input1= Erste Zahl: "
set /p "input2= Zweite Zahl: "
if %input1% EQU 1 if %input2% EQU 2 goto korrekt
goto abfrage
:korrekt
echo klappt!
pause
goto abfrage
Was ich aber unter anderem in meiner Antwort gesagt habe, war, dass man nicht immer goto benutzen muss. Wenn man nur an einem Punkt zu dem Label springt, kann man den Code auch direkt statt dem goto schreiben:
@echo off
:abfrage
set /p "input1= Erste Zahl: "
set /p "input2= Zweite Zahl: "
if %input1% EQU 1 if %input2% EQU 2 (
echo klappt!
pause
)
goto abfrage
Sollte beides funktionieren.
~Tim
Entweder verschachteln:
if %var% geq 2 (
if %var% leq 12 (
//mach etwas
)
)
Oder:
if %var% geq 2 if %var% leq 12 //mach etwas
Aber wie KnorxyThieus schon erwähnt hat. Batch ist wirklich aaaalt.
Nimm doch Powershell. Das ist die Zukunft ;) Dort geht es übrigens wie folgt:
If ($var -geq 2 -And $var -leq 12) //do something
Oder eben Python / Java.
Batch ist wirklich keine schöne Sprache, es gibt für jeden Zweck eine bessere (VBS, PowerShell, Python, um ein paar vergleichbare zu nennen).
Wenn du dir das aber trotzdem unbedingt antun willst: Ein and in dem Sinne kennt Batch nicht, du kannst nur schachteln, oder du verwendest Variablen (Google hilft).
Ok trotzdem danke für die Antwort : D Ich will jetzt vor allem mal mit was ganz simplen anfangen um generell Grundkenntnisse zu erlernen.
Batch ist auch nicht wirklich simpler. Es handelt sich um eine dermaßen uneinheitliche und veraltete Syntax, dass dir der Einstieg in eine der genannten Alternativen, vor allem Python, einfacher fallen dürfte.
Und wieso funktioniert folgender Code nicht ?
´´@echo off
:1
set /p 1=
set /p 2=
if %1% EQU 1 if %2% EQU 2 ( goto 3
) Else (
goto 1
)
goto 1
:3
echo klapt!
pause
goto 1´´
Ich finde einfach keinen Fehler.