wie kann ich das if und else problem in batch beheben?

3 Antworten

Als erstes Label (Sprungmarken) dürfen keine Leerzeichen enthalten . Es wird ohnehin nur bis zum Leerzeichen ausgewertet....

dein:

set /a a=a
set /a b=b
set /a c=c
set /a d=d

ist totaler Müll und lässt deine if %eingabe% equ %a% endgültig scheitern...

  • set /a ist die "Rechenmaschine" von Batch (alles was keine Zahlen sind, sind Variablen (auch ohne Prozentzeichen)
  • ergo ist set /a a=a das gleiche wie set /a a=%a%
  • leere Variablen sind bei set /a automatisch = 0

Das folgende IF %eingabe% EQU %a% wird wiefolgt ausgewertet:

  • es wurde d gedrückt...
  • IF d EQU 0 goto...

nur die Eingabe von 0 würde überhaupt wahr sein... ( die Leertaste oder nur Enter lassen die Batch abstürzten)

Bei if else - Statements muss der Ausführungsblock in Klammern aufgeführt werden:

if "%Variable%" equ "blah" (echo mach was) else (echo mach was anderes)

So müsste dann dein If else-Monster aussehen:

@echo off
echo a Addition      c Multiplikation
echo b Subtraktion   d Division
set /P eingabe="Rechenoperation: "
if "%eingabe%" equ "a" (
   goto :Addition
) else (
    if "%eingabe%" equ "b" (
        goto :Subtraktion
    ) else (
        if "%eingabe%" equ "c" (
            goto :Multiplikation
        ) else (
            if "%eingabe%" equ "d" (
                 goto :Division
            )
        )
    )  
)
  rem was  passiert  bei  falscchen Eingaben?
echo pfui 
goto ende
:Addition
echo Addition:
:....
goto ende

:Subtraktion
echo Subtraktion:
:....
goto ende

:Multiplikation
echo Multiplikation:
:....
goto ende

:Division
:....
:ende
pause

sexy und übersichtlich ist anders 🤢 (ich nenne das mit dem Klammerbeutel gepudert)

...da ohnehin nur eine Eingabe zutrifft brauchst du keine else-Alternativen.

rem wie oben

set /P eingabe="Rechenoperation: "
if "%eingabe%" equ "a"  goto :Addition
if "%eingabe%" equ "b"  goto :Subtraktion
if "%eingabe%" equ "c"  goto :Multiplikation
if "%eingabe%" equ "d"  goto :Division
echo pfui 
goto ende

rem wie oben

das sieht schon besser aus

.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Erzesel  03.01.2020, 18:09

Natürlich ist auch die Eingabe des Menüs verbesserungswürdig :

für Menüs gibt es den Choice-Befehl https://ss64.com/nt/choice.html

Die Buchstaben abcd sind für ein Menü ungünstig:

@echo off
echo Menue:
echo:
echo [A]ddition      [M]ultiplikation
echo [S]ubtraktion   [D]ivision


choice /c asmd /m "Rechenoperation:" 
if %errorlevel% equ 1  goto :Addition
if %errorlevel% equ 2  goto :Subtraktion
if %errorlevel% equ 3  goto :Multiplikation
if %errorlevel% equ 4  goto :Division

:Addition
echo Addition:
set /P summand1="Summand 1: "
set /P summand2="Summand 2: "
set/a ergebnis1=%summand1% + %summand2%
echo Summe: %ergebnis1%
goto ende

:Subtraktion
echo Subtraktion:
set /P minuend="Minuend: "
set /P subtrahend="Subtrahend: "
set/a ergebnis2=%minuend% - %subtrahend%
echo Differenz: %ergebnis2%
goto ende

:Multiplikation
echo Multiplikation:
set /P faktor1="Faktor 1: "
set /P faktor2="Faktor 2: "
set/a ergebnis3=%faktor1% * %faktor2%
echo Produkt: %ergebnis3%
goto ende

:Division
echo Division:
set /P dividend="Dividend: "
set /P divisor="Divisor: "
set/a ergebnis4=%dividend% / %divisor%
echo Quotient: %ergebnis4%
:ende
pause

Natürlich ist das ganze eine wertlose Übung, den Rechnen und Batch ist eine zwiespältige Sache . Batch kann nur Ganze Zahlen... eine Division ergibt auch nur die Stellen vor dem Komma... (nicht einmal ordentlich gerundet)

0

Wir kennen Deinen Taschenrechner nicht. Im schlimmsten Fall ist die Firmware drin Schrott. Doch vorher kannst Du noch systematisch debuggen.

Finde heraus, was GENAU nicht funktioniert.

Es kann sein, die Variablenübergabe, das goto, ein Teil der Bedngung, die Sprunganweisung, eine der Sprungangweisungen:

IF %eingabe% EQU %a% goto a Addition ELSE if %eingabe% EQU %b% goto b Subtraktion ELSE if %eingabe% EQU %c% goto c Multiplikation ELSE if %eingabe% EQU %d% goto d Division

Daher vereinfache Schritt für Schritt, etwa

if 1000 > 1 then echo "if geht".

So gehst Du Element für Element durch und prüfst, woran es hakt.

Syntax Anweisung für eine if-then Schleife wäre noch spannend. Brauchen wir das "then"? Einen Strichpunkt? Eine Klammer? Ist etwas case-sensitive?

Woher ich das weiß:Berufserfahrung – ich arbeite schon sehr lange im EDV Bereich, viele Sparten