Warum wird der Pause Befehl ignoriert (Batch)?
Ich bin Neuling und übe. Diese Datei schließt sich immer sofort wieder, obwohl ich den pause Befehl benutze:
@echo off
set p/ person = geben sie die Zahl 10 ein:
if person == 10 echo.richtig
if not echo.falsch
pause
Wo ist da der Fehler? Andere, simple Batches, die ich früher schon mal gemacht hab, funktionieren. Nur jetzt diese neue nicht.
3 Antworten
In solchen Situationen ist es Hilfreich:
- Das @Echo off am Anfang wegzulassen. oder auf ::@echo off ändern/auskommentieren
- CMD von Hand zu starten. (WIN+R cmd [Enter])
- Die Batch auf das Consolfenster zu ziehen und [Enter] zu drücken.
...dann wird das Fenster nicht geschlossen wenn es zu einem "Abbruchfehler" kommt.
Damit wäre folgendes zu sehen:
Der Abbbruchfehler war:
if not echo.falsch
Wie Priesterlein schon erkannt hat... If not was? echo.falsch
Verwendung von if not:
If not exist "Dateiname" mach was...
If not defined Variable mach was...
If not "%variable"=="was auch immer" mach was...
::dann wäre es jedoch Sinnvoller
If "%variable" neq "was auch immer" mach was...
Der richtige Parameter für das Einlesen einer Eingabe über den Set-Befehl wäre
Set /p "Variable=Anzeigetext"
der Inhalt einer Variable wird abgerufen, indem man den Variablennamen in %-Zeichen "hüllt".
set /p "person=Wie heisst Du? : "
if "%person%" neq "Max" (echo Ach ja der %person%) else (Hallo Max)
https://ss64.com/nt/syntax-variables.html
Ansonsten hat @Pristerlein eine gute KomplettDemo geliefert.

Wenn ein Batchscript trotz pause Befehl einfach abbricht, deutet das auf einen Syntaxfehler im Script hin. In deinem Code sind folgende Fehler:
- Der Parameter des set Befehls muss hinter dem Slash stehen - also /p - und es dürfen keine Leerzeichen vor und hinter dem = sein.
- Die Variable person muss von %-Zeichen umschlossen werden, wenn dessen Wert abgefragt wird und sowohl die Variable als auch der Wert sollten in Anführungszeichen stehen (geht hier allerdings auch ohne, da im Wert keine Leerzeichen vorkommen).
- Hinter dem if not fehlt die zu prüfende Bedingung. Die beiden if Abfragen sollten als if/else Konstrukt umgesetzt werden.
Hier eine Lösung mit if/else:
@echo off
set /p person=Geben Sie die Zahl 10 ein:
if "%person%" == "10" (
echo.richtig
) else (
echo.falsch
)
pause
Danke! Dass es daran liegt, dass ein Fehler drin ist, hätt ich mir auch denken können. Hab auch zuerst mit else versucht, aber das gib ja nicht, dann erst anders. Hab vor ner Weile schon Batch gemacht und dann erst etwas Java und wollte jetzt wieder ne .bat, ich glaub, das bringt mich mit den Leerzeichen durcheinander.
Versuche doch mal /p statt p/, denn p/ ergibt gar keinen Sinn. Auch das "if not" steht meiner Meinung nach sinnlos da, da nicht angegeben wird, was not sein soll. An der Stelle wird das Script dann vor dem pause aussteigen. Hier mal eine Alternative zu deinem Script mit initialisierten Variablen:
@echo off
set ergebnis=falsch
set person=?
set /p person=Geben sie die Zahl 10 ein:
if "%person%" EQU "10" set ergebnis=richtig
echo.%ergebnis%
pause
...da fällt mir noch ein:
set person=?
Das Fragezeichen ist eine ganz schlechte Idee...
Fragezeichen sind eine allgemeine Zeichenmaske für ein beliebiges Zeichen bzw. Eine Dateimaske für alle Dateien mit nur einem Buchstaben im Namen...
Je nach Verwendung kann das Fragezeichen ordentlich Schaden anrichten:
set "var=?"
del /p "%var%"
In einem "nackten" for-loop (ohne /switch) wird normalerweise ein Set von Strings abgearbeitet.
...aaaaaber ? und * listen der Dateimaske entsprechende Dateien auf... und es ist kein Kraut dagegen gewachsen.
..und schon sind wir wieder in einer total "undefinierten Situation...
demo.cmd
rem kollektion von Strings
set "var= a b c "d e""
for %%a in (%var%) do (
echo %%a
)
pause
rem erzeuge 2 Dateien mit einen Buchstaben als Name
rem um sicher zu gehen, das "zufällig" solche Dateien im Verzeichnis sind um die reaktion zu verdeutlichen.
echo blubb >x
echo blubb >y
rem ein "?" repressentiert alle Dateinamen mit einem Zeichen Länge im Pfad
set "var=?"
for %%a in (%var%) do (
echo %%a
)
pause
rem ein "*" repressentiert alle Dateinamen im Pfad
set "var=*"
for %%a in (%var%) do (
echo %%a
)
pause
rem eine gelöschte/nicht initialisierte Variable ist ok
rem wenn nichts übergeben Wird , wird die Schleife garnicht ausgeführt
set "var="
for %%a in (%var%) do (
echo %%a
)
rem aufräumen....
set "var=?"
del /p "%var%"
pause
Muss man nicht, aber ich ziehe immer Initialisierungen vor, will immer wissen, was drin steht. Uninitialisierte Variablen sind in viel zu vielen Fällen Stolpersteine für Fehlerauftritte. Da sollte man sich immer angewöhnen, zu initialisieren.
ziehe immer Initialisierungen vor, will immer wissen, was drin steht
Zumindest bei Eingabe über Set /p macht es Sinn die Variable Zuvor mit einem Defaultwert zu belegen. Wenn der Nutzer ohne Eingabe einfach [Enter] drückt behält die Variable den zuvor gesetzten Wert.
Ansonsten ist es Egal , solange man für Vergleiche die die Variable in Anführunszeichen hält. Eine Nicht vorhandene Variable ist in Batch immer vergleichbar einem Leerstring "" .
Den Set- Term sollte man hingegen man möglichst in Gänsefüßchen halten:
set "var=na sowas "
...sonst könnten in der Variable am Ende zu viele oder zu wenige Leerzeichen landen. (Leerzeichen sieht man in einem Script nicht und weiß dann nicht wirklich was in der Variable landet) Auf diese Weise wird genau definiert was in die Variable gehört.
set var=na sowas
echo #%var%#
set var=na sowas
echo #%var%#
...das ist nicht das das gleiche ?
Vielen dank! Jetzt krieg ichs auf jeden Fall hin. Aber warum muss man erst person=? und dann direkt weitermachen und person definieren? Versteh ich irgendwie nicht.
Bin am rumprobieren und hab versucht irgendwie den if not Befehl zu benutzen, vllt bin ich auch durcheinander, weil ich batch vor ner Weile schon gemacht hatte, dann ein bisschen Java ausprobiert hab und jetzt wieder ne .bat machen wollte.