Was ist an dieser If Funktion falsch (Batch)?


06.06.2020, 22:05

Das doppelte s in Ergebniss steht so nicht im code

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
@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
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
bingomann9 
Fragesteller
 07.06.2020, 21:11

Also deiner Antwort nach passt der Titel Halbgott sehr gut zu dir, wie ich finde. Danke

0

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