Warum wird der Pause Befehl ignoriert (Batch)?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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:

Bild zum Beitrag

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...

https://ss64.com/nt/if.html

Der richtige Parameter für das Einlesen einer Eingabe über den Set-Befehl wäre

Set /p "Variable=Anzeigetext"

https://ss64.com/nt/set.html

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.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
 - (Computer, programmieren, cmd)

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
kappe619 
Fragesteller
 06.10.2019, 21:38

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.

0

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
kappe619 
Fragesteller
 06.10.2019, 21:33

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.

0
priesterlein  06.10.2019, 21:34
@kappe619

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.

1
Erzesel  06.10.2019, 23:56
@priesterlein
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 ?

0
Erzesel  07.10.2019, 01:33

...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
0