Was ist an dieser If Funktion falsch (Batch)?
(Sorry fürs doppelt fragen)
Warum crasht das Programm?
set /a Ergebnis=%F1%+%F2%+%F3%+%F4%+%F5%
echo.
echo Deine Punktzahl ist %Ergebnis%
echo.
ping localhost -n 3 > nul
if "%Ergebnis%" LEQ "7"
(
goto schlecht
)
else if %Ergebnis% LEQ "12"
(
goto besser
)
else if %Ergebnis% LEQ "16"
(
goto gut
)
else if %Ergebnis% LEQ "20" (
Goto Ehrenmann
)
:schlecht
echo wie auch immer
pause >nul
Das doppelte s in Ergebniss steht so nicht im code
2 Antworten
@echo off
chcp 65001 >nul
:loop
rem nur zur demo von Hand eingeben
set /p "ergebnis=Gib eine Zahl bs 16 ein :"
rem sicherstellen, das Zahl
set /a "ergebnis+=0"
rem nutze timeout statt ping (wir leben nicht mehr im Jahr 1995)
timeout 1 >nul
if %ergebnis% leq 7 (
echo %ergebnis% kleiner 7
) else (
if %ergebnis% leq 12 (
echo %ergebnis% kleiner 12
) else (
if %ergebnis% leq 16 (
echo kleiner 16
)else (
echo %ergebnis% größer 16
)
)
)
goto :loop
- ...bei einer Kaskade darauf achten, dass alle Klammern geschlossen werden.
- die öffnende Klammer muss in der gleichen Zeile wie if oder else stehen! https://ss64.com/nt/syntax-brackets.html
- Einrückungen Helfen den Überblick zu behalten
Bei Zahlenvergleichen darf die Variable / Zahl nicht in "Quotes" gesetzt werden!
chcp 65001 >nul
if 12 leq 2 (echo kleiner) else (echo größer)
if "12" leq "2" (echo kleiner) else (echo größer)
pause
Warum?: "12" und "2" sind Strings und da Zählt die Rangordnung der ersten Zeichen in der Zeichentabelle!
Wenn du nach einem Treffer ohnehin wegspringst, musst Du nicht Kaskadieren (wenn Du wegspringst, wird der Rest des Entscheidungsbaumes ja nicht mehr abgearbeitet)
echo off
chcp 65001 >nul
:loop
set /p "ergebnis=Gib eine Zahl ein :"
set /a "ergebnis+=0"
if %ergebnis% leq 7 goto :L7
if %ergebnis% leq 12 goto :L12
if %ergebnis% leq 16 goto :L16
echo %ergebnis% größer 16
goto :loop
:L7
echo %ergebnis% kleiner 7
goto :loop
:L12
echo %ergebnis% kleiner 12
goto :loop
:L16
echo %ergebnis% kleiner 16
goto :loop
zu guter Letzt habe ich die ultimative Automatisierung.
Lassen wir doch alle Cases in einer Schleife "durchsieben". Wenn der Richtige Case gefunden ist machen wir uns vom Acker (springen as der Schleife) wir brauchen nur eine Zeile statt jeden Fall von Hand zu schreiben!
echo off
chcp 65001 >nul
:loop
set /p "ergebnis=Gib eine Zahl ein :"
set /a "ergebnis+=0"
rem ganz heiße Sache : ein SprungMacro
for %%a in (7 12 16 20 66) do (if %ergebnis% leq %%a goto :label_%%a)
echo %ergebnis% größer 66
goto :loop
:label_7
echo %ergebnis% kleiner 7
goto :loop
:label_12
echo %ergebnis% kleiner 12
goto :loop
:label_16
echo %ergebnis% kleiner 16
goto :loop
:label_20
echo %ergebnis% kleiner 20
goto :loop
:label_66
echo %ergebnis% kleiner 66
goto :loop
Dir gefällt da mit den nummerierten Labeln nicht? ... mir auch nicht:
@echo off
chcp 65001 >nul
:loop
set /p "ergebnis=Gib eine Zahl ein :"
set /a "ergebnis+=0"
rem jeweils "case Sprungziel","case Sprungziel"
for %%a in ("7 schlecht","12 besser","16 gut","20 Ehrenmann","66 Halbgott") do (
for /f "tokens=1*" %%f in ("%%~a") do (if %ergebnis% leq %%f goto :%%g)
)
echo %ergebnis% größer 66
goto :loop
:schlecht
echo %ergebnis% ^<= 7
goto :loop
:besser
echo %ergebnis% ^<= 12
goto :loop
:gut
echo %ergebnis% ^<= 16
goto :loop
:Ehrenmann
echo %ergebnis% ^<= 20
goto :loop
:Halbgott
echo %ergebnis% ^<= 66
goto :loop
Also deiner Antwort nach passt der Titel Halbgott sehr gut zu dir, wie ich finde. Danke
Was mir zuerst auffällt sind die falschen if-Abfragen: Du hast hier Zahlen vorliegen, da solltest du keinen String-Vergleich durchführen und demnach auch keine Anführungszeichen verwenden. Vor allem aber solltest du nie die Anführungszeichen nur auf einer Seite verwenden, da z.B. `5=="5"` oder auch `16 leq "16"` immer false ist.
Zudem brauchst du keine else-if Verschachtelung, wenn du nur goto's benutzt.
Was aber wahrscheinlich den Fehler verursacht hat, ist das Springen zu Labels, welche nicht existieren. Ich habe dir hier mal eine verbesserte Version aufgeschrieben:
set /a ergebnis=%F1%+%F2%+%F3%+%F4%+%F5%
echo.
echo Deine Punktzahl ist %ergebnis%
echo.
ping localhost -n 3 >nul
if %ergebnis% LEQ 7 goto schlecht
if %ergebnis% LEQ 12 goto besser
if %ergebnis% LEQ 16 goto gut
if %ergebnis% LEQ 20 goto ehrenmann
:schlecht
echo schlecht
goto ende
:besser
echo besser
goto ende
:gut
echo gut
goto ende
:ehrenmann
echo ehrenmann
echo wie auch immer