Frage von Fiveheader, 15

Wie kann ich einen goto Fehler beim batch programmieren verhindern?

Hallo zusammen, ich habe mich heute mal an eine Batch-Programmierung getraut.Ich möchte einen Chat mit einem Bot programmieren jedoch funktionieren meine "goto" Befehle nicht so wie sie sollten!Wenn ich zum Beispielt dem bot "hallo" kann er hallo zurückschreiben aber wenn ich so etwas wie "wie gehts dir so" etc. schreibe schließt sich das Programm sofort.Hier der Quelltext:

@echo off

echo Schreib mit mir! set /p Frage1=Ich: if %Frage1%==hallo goto answer1 if %Frage1%==servus goto answer1 if %Frage1%==hello goto answer1 if %Frage1%==wie geht es dir goto answer2 if %Frage1%==wie geht es dir? goto answer2 if %Frag1%==was machst du so goto answer3

:answer1 echo bot:Hallo! set /p Frage1=Ich: if %Frage1%==hallo goto answer1 if %Frage1%==servus goto answer1 if %Frage1%==hello goto answer1 if %Frage1%==wie geht es dir goto answer if %Frage1%==wie geht es dir? goto answer2 if %Frage1%==was machst du so goto answer3 pause

:answer2 echo bot:Gut und dir? set /p Frage1=Ich: if %Frage1%==hallo goto answer1 if %Frage1%==servus goto answer1 if %Frage1%==hello goto answer1 if %Frage1%==wie geht es dir goto answer2 if %Frage1%==wie geht es dir? goto answer2 if %Frage1%==was machst du so goto answer3 pause

:answer3 echo bot:nichts besonderes und du set /p Frage1=Ich: if %Frage1%==hallo goto answer1 if %Frage1%==servus goto answer1 if %Frage1%==hello goto answer1 if %Frage1%==wie geht es dir goto answer2 if %Frage1%==wie geht es dir? goto answer2 if %Frage1%==was machst du so goto answer3 pause

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von MarkusGenervt, 2

Viele Fehler!

Zum Einen, was Pr0fessor gesagt hat. Immer Anführungszeichen setzen.

Allerdings darf in diesem Fall die Variable %Frage1% selbst KEINE Anführungszeichen enthalten. Das musst Du vorher sicher stellen, ist aber in Batch echt umständlich.

Weiterhin funktioniert deine Passwort-Bestätigung nicht. Bei einem falschen Passwort wird nur kurz "Invalid Passwort" geflasht und dann "Richtiges Passwort!" angezeigt.

Nutze den Section-CALL-Befehl. Damit kannst Du auch dieselben Prozess-Abschnitte immer wieder erneut aufrufen, ohne den ganzen Mist bis ins Endlose zu wiederholen!

Außerdem kannst Du auch strukturierte IF-ELSE-Bedingungen setzen.

z.B.:

if /i "%Frage1%" == "Hallo" (
call :Answer1
) else (
call :Answer2
)

IF kann auch verschachtelt werden.

oder für "Hallo" auch:

for %%F in (Hallo Servus Hello) do (
if /i "%Frage1%" == "%%~F" call :Answer1
)
for %%F in ("Wie geht es Dir" "Wie geht es Dir?") do (
if /i "%Frage1% == "%%~F" call :Answer2
)

In den Answer-Sections kannst Du z.B. Flag-Variablen setzen, die besagen, dass eine Antwort erfolgreich gegeben wurde:

:Answer1
echo Hallo!
set answered=1
goto :eof

Und wenn alle Eingangs-Optionen abgefragt wurden, dann geht es so weiter:

:Start
set answered=
REM [***hier die Abfragen***]
if not defined answered (
echo Ich habe Deine Antwort nicht verstanden!
goto :Start
)
goto :eof

Dafür muss aber vorher "SETLOCAL EnableDelayedExpansion" aufgerufen werden (ließ unbedingt die Hilfe hierzu!).

Da ist noch viel Luft für Verbesserungen.

Studiere mal alle Batch-Befehle. Das ist wirklich nicht so viel. Einfach mit "HELP" alles auflisten lassen und mit "HELP Befehl" oder "Befehl /?" die Hilfe-Details durcharbeiten.

Antwort
von MatthiasHerz, 12

Du hast keinen Befehl eingebaut für den Fall, dass keine Deiner Bedingungen wahr ist, also endet das Programm, wenn etwas anderes eingibst als das Abgefragte.

Kommentar von Fiveheader ,

Wie lautet der Befehl für den Fall dass keine Bedingung wahr ist?

Kommentar von MatthiasHerz ,

Woher soll ich das wissen? Es ist Dein Programm.

Wenn Dich mit Shellprogrammierung beschäftigst, musst doch wissen, wie man ein Programm zur Laufzeit beendet.

Antwort
von Pr0fessor, 6

Versuchs mal mit Anführungszeichen. Also so:

 if "%Frage1%"=="wie geht es dir" goto answer2

Antwort
von Fiveheader, 15

eigentlich sieht der Text ordentlicher aus aber gutefrage.net stellt ihn so komisch dar :/ deshalb hier ein Screenshot

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten