(Windows-batch) Springen innerhalb der if-block verhält sich sehr seltsam
Wenn ich das folgende Windows-batch-code-snippet und führen Sie es:
echo foo
if 1 == 1 (
echo bar
goto asdf
:asdf
echo baz
) else (
echo quux
)
Den Ausgang, den ich erwarten würde ist:
foo
bar
baz
Aber stattdessen bekomme ich:
foo
bar
baz
quux
Wenn ich kommentiere die goto asdf
Linie, es gibt die Ausgabe, die ich erwarten. Die echo quux
Zeile sollte nie exectuted, also warum ist die Existenz von goto verursacht, dass das passiert?
UPDATE: Für was es Wert ist, hier ein workaround, der das richtig macht, was ich ursprünglich gedacht:
goto BEGIN
:doit
echo bar
goto asdf
:asdf
echo baz
goto :EOF
:BEGIN
echo foo
if 1 == 1 (
call :doit
) else (
echo quux
)
Aber, dies beantwortet nicht meine ursprüngliche Frage.
InformationsquelleAutor der Frage coledot | 2011-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Ziel einer CALL oder GOTO sollte man nie in einem block eine Anweisung innerhalb der Klammern. Es kann getan werden, aber wie Sie sehen, sind die Ergebnisse wahrscheinlich nicht gehen, um zu werden, was Sie wollen.
Die gesamte IF (...) ELSE ( ... ) - Konstrukt ist eingelesen und in den Arbeitsspeicher geladen, bevor es verarbeitet wird. In anderen Worten, es ist logisch behandelt, als eine Zeile code. Nachdem es geparst wird, CMD.EXE erwartet wird, resume parsing-beginnend mit der nächsten Zeile nach dem IF/ELSE Konstrukt.
Nach der parse-phase, die komplexen Befehls aus dem Speicher. Die WENN-Klausel ordnungsgemäß verarbeitet werden und die ELSE-Klausel wird übersprungen, richtig. ABER innerhalb der IF (true) - Klausel, führen Sie eine
GOTO :asdf
so CMD.EXE dutifly beginnt mit dem Scannen für das label. Es beginnt am Ende der IF/ELSE und scans, um die unten in der Datei, Schleifen zurück an die Spitze, und durchsucht, bis er Sie findet das label. Das label passiert zu sein in Ihre IF-Klausel, aber das label scanner weiß nichts über die Details. Wenn also die Komplex-Befehl beendet die Ausführung aus dem Speicher, batch-Verarbeitung fortgesetzt wird das label stattdessen aus dem Ende des Komplexes IF/ELSE.Deshalb an dieser Stelle der batch-Prozessor sieht, und führt die nächsten paar Zeilen
baz echo, und so ist quux. Aber man könnte Fragen, "Warum nicht
) else (
- und/oder)
erzeugen einen syntax-Fehler, da Sie jetzt sind unsymmetrisch und nicht mehr analysiert als Teil der größeren IF-Anweisung?Dass ist, weil, wie
)
behandelt wird.Wenn es eine offene
(
aktiv, wenn)
aufgetreten ist, dann ist die)
verarbeitet, als man es erwarten würde.Aber wenn der parser erwartet einen Befehl und findet eine
)
wenn es nicht eine aktive open(
dann die)
wird ignoriert, und alle Charaktere auf den Rest der Zeile werden ignoriert!!! Effektiv die)
jetzt funktioniert wie eine REM-Anweisung.InformationsquelleAutor der Antwort dbenham
Alles in eckigen Klammern ist considdered, um eine einzelne Zeile, verarbeitet, interpretiert und ausgeführt in einem Treffer. Ihr Skript erreicht
goto asdf
und springt aus, dass block/Zeile. Auf dem Etikett:asdf
gibt es keine Halterung, so dass es liest die Zeilen eins nach dem anderen. Es reichtelse
aber es gibt keineif
zwischen:asdf
undelse
so ignoriert Sie es.Um zu verhindern, dass Probleme wie diese, ich benutze immer
goto
odercall
aufif
undfor
Aussagen, sondern als Blöcke. Diese möglichen Probleme hin, die mit weiterengoto
Aussagen und sortiert auch Sie sich eine Menge Probleme mit Variablen zu.Verwenden
goto
:Oder verwenden
call
:InformationsquelleAutor der Antwort Hand-E-Food
In diesem Fall es stellt sich heraus, dass in Bezug auf die Armen Schachteln und Struktur innerhalb einer Schleife eine IF-Anweisung, wie klar und deutlich erklärt, durch https://stackoverflow.com/users/1012053/dbenham oben.
Dass sagte, dachte ich, eine ähnliche überlegung für dieses problem...
Bitte nehmen Sie einen Blick auf das folgende problem und die anschließende Lösung hier:
". unerwartet war in dieser Zeit" generiert sich aus batch-Skript die Zeile " if exist [Datei] (...
Die Lösung war einfach die Behandlung von '(' und ')' auf ECHO-Linien innerhalb einer IF-Anweisung block.
Der Punkt ist, Sie betrachten die Behandlung von Sonderzeichen als eine mögliche Ursache für ein problem bei der Fehlersuche, WENN (und eventuell auch FÜR die) Aussagen.
HTH
InformationsquelleAutor der Antwort sw.smayer97