Batch zwei Bedingungen bei if?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
[...] 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

Woher ich das weiß:Hobby

Jesaja01 
Fragesteller
 05.10.2018, 18:17

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.

0
timlg07  06.10.2018, 08:19
@Jesaja01

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

1

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.


Jesaja01 
Fragesteller
 05.10.2018, 13:00

Ok danke werd mich mal umschauen

1

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).

Woher ich das weiß:Studium / Ausbildung – Studiere Informatik und programmiere aus Leidenschaft

Jesaja01 
Fragesteller
 04.10.2018, 23:08

Ok trotzdem danke für die Antwort : D Ich will jetzt vor allem mal mit was ganz simplen anfangen um generell Grundkenntnisse zu erlernen.

1
KnorxyThieus  05.10.2018, 08:55
@Jesaja01

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.

0