Wie kann ich lange Befehle in einer Batchdatei über mehrere Zeilen aufteilen?
Sie können die nächste Zeile ohne Leerzeichen beginnen, wenn Sie ein Leerzeichen gerade vor dem ^
und nach Ihrem Befehlstext hinzufügen.
Wie kann ich lange Befehle in einer Batchdatei über mehrere Zeilen aufteilen?
Sie können lange Zeilen mit dem Zirkumflexzeichen ^
unterbrechen, solange Sie daran denken, dass das Zirkumflexzeichen und die folgende Zeilenumbruch vollständig entfernt werden. Wenn also an der Stelle, an der Sie die Zeile unterbrechen, ein Leerzeichen stehen soll, geben Sie ein Leerzeichen ein. (Mehr dazu weiter unten.)
Beispiel:
copy file1.txt file2.txt
würde geschrieben als:
copy file1.txt^
file2.txt
Sie können die nächste Zeile ohne Leerzeichen beginnen, wenn Sie ein Leerzeichen gerade vor dem ^
und nach Ihrem Befehlstext hinzufügen.
Hat wunderbar für mich funktioniert mit einem SQL-Skript, das lange SQL-Abfragen mit sqlcmd.exe ausführt. Die verzögerte Ausweitung ermöglicht es mir sogar, die größer-als und kleiner-als Zeichen zu escapen. Danke!
Die Regel für das Ankerzeichen lautet:
Ein Ankerzeichen am Zeilenende fügt die nächste Zeile an, wobei das erste Zeichen der angefügten Zeile escaped wird.
Sie können das Ankerzeichen mehrmals verwenden, aber die komplette Zeile darf die maximale Zeilenlänge von ~8192 Zeichen (Windows XP, Windows Vista und Windows 7) nicht überschreiten.
echo Test1
echo one ^
two ^
three ^
four^
*
--- Ausgabe ---
Test1
one two three four*
echo Test2
echo one & echo two
--- Ausgabe ---
Test2
one
two
echo Test3
echo one & ^
echo two
--- Ausgabe ---
Test3
one
two
echo Test4
echo one ^
& echo two
--- Ausgabe ---
Test4
one & echo two
Um das Escaping des nächsten Zeichens zu unterdrücken, können Sie eine Umleitung verwenden.
Die Umleitung muss direkt vor dem Ankerzeichen stehen. Es existiert jedoch eine Kuriosität mit der Umleitung vor dem Ankerzeichen.
Wenn Sie ein Token am Ankerzeichen platzieren, wird das Token entfernt.
echo Test5
echo one
`
Es ist auch möglich, Zeilenumbrüche in den String einzubetten:
setlocal EnableDelayedExpansion
set text=This creates ^
a line feed
echo Test7: %text%
echo Test8: !text!
--- Ausgabe ---
Test7: This creates
Test8: This creates
a line feed
Die leere Zeile ist wichtig für den Erfolg. Dies funktioniert nur mit verzögerter Auswertung, ansonsten wird der Rest der Zeile nach dem Zeilenumbruch ignoriert.
Es funktioniert, weil das Ankerzeichen am Zeilenende den nächsten Zeilenumbruch ignoriert und das nächste Zeichen escaped, auch wenn das nächste Zeichen ebenfalls ein Zeilenumbruch ist (Wagenrückläufe werden in dieser Phase immer ignoriert).
`
Der letzte Code-Block mit dem Zeilenvorschub-Beispiel zeigt die leere Zeile nicht an, obwohl sie vorhanden ist. (Zumindest wird sie in IE7 nicht angezeigt) Versuchen Sie, sie stattdessen mit einem Blockzitat neu zu formatieren.
Die Frage ist, sollen wir ein schlechtes Tool unterstützen, das sich nicht an die Regeln gehalten hat (jemand bezeichnet es als Browser, aber das ist es nicht), oder sollten Sie zu einem Browser wechseln?
Ich hatte doppelte Anführungszeichen um meine Werte herum, wie in set var="hier Text ^ " aber es funktioniert nicht. Entfernen Sie das doppelte Anführungszeichen und es funktioniert.
Du kannst lange Zeilen mit dem Zirkumflexzeichen (^
) unterbrechen, aber denke daran, dass das Zirkumflexzeichen und der darauffolgende Zeilenumbruch völlig entfernt werden vom Befehl, also wenn du es dort platzierst, wo ein Leerzeichen erforderlich wäre (wie zwischen Parametern), vergewissere dich, dass du auch das Leerzeichen inkludierst (entweder vor dem ^
oder am Anfang der nächsten Zeile — letztere Wahl kann helfen, klarzumachen, dass es eine Fortsetzung ist).
Hinweis: Das erste Zeichen der nächsten Zeile ist escapet. Wenn es eine besondere Bedeutung hat (wie &
oder |
), geht diese verloren und es wird als einfaches Textzeichen interpretiert (siehe letztes Beispiel unten).
Beispiele: (alle getestet auf Windows XP und Windows 7)
xcopy file1.txt file2.txt
kann geschrieben werden als:
xcopy^
file1.txt^
file2.txt
oder
xcopy ^
file1.txt ^
file2.txt
oder sogar
xc^
opy ^
file1.txt ^
file2.txt
(Das letzte funktioniert, weil es keine Leerzeichen zwischen dem xc
und dem ^
gibt und keine Leerzeichen am Anfang der nächsten Zeile. Wenn du also das ^
und den Zeilenumbruch entfernst, erhältst du...xcopy
.)
Zur Lesbarkeit und Vernunft ist es wahrscheinlich am besten, nur zwischen Parametern zu unterbrechen (vergewissere dich, dass du das Leerzeichen inkludierst).
Vergewissere dich, dass das ^
nicht das letzte Zeichen in einer Batch-Datei ist, da es scheinbar ein größeres Problem damit gibt.
Hier ist ein Beispiel für ein Zeichen, das am Anfang der nächsten Zeile escapet ist:
xcopy file1.txt file2.txt ^
& echo copied successfully
Dies wird nicht funktionieren, weil &
escapet wird und seine besondere Bedeutung verliert, somit alle "file1.txt file2.txt & echo copied successfully" als Parameter an xcopy
gesendet werden, was einen Fehler verursacht (in diesem Beispiel).
Um dies zu umgehen, füge ein Leerzeichen am Anfang der nächsten Zeile hinzu.
(Dies ist im Grunde eine Überarbeitung von Waynes Antwort, aber mit Klarheit um das Zirkumflexzeichen herum. Deshalb habe ich es als CW veröffentlicht. Ich zögere nicht, Antworten zu bearbeiten, aber sie komplett umzuschreiben erscheint unpassend.)
Mehrere Befehle können in Klammern gesetzt und über mehrere Zeilen verteilt werden; so etwas wie echo hi && echo hello
kann so geschrieben werden:
( echo hi
echo hello )
Außerdem können Variablen helfen:
set AFILEPATH="C:\EINIGE\LANGE\PFADE\ZU\EINEM\DATEI"
if exist %AFILEPATH% (
start "" /b %AFILEPATH% -option C:\PFADE\ZU\EINSTELLUNG...
) else (
...
Außerdem ist mir aufgefallen, dass die if
Bedingungen mit Dachzeichen (^
) gerne nur folgten, wenn ein Leerzeichen vorhanden war:
if exist ^
Die Zeile cmd1.bat && cmd2.bat
unterscheidet sich von der Klammernform: Führen Sie cmd2.bat
aus, wenn cmd1.bat
erfolgreich ausgeführt wurde (ohne %errorcode%
zu setzen). Die letztere Form wird bedingungslos ausgeführt. Etwas unerwartet (zumindest für mich) ist, dass Sie offensichtlich die Kombination beider nicht verwenden können + d.h. fügen Sie &&
vor dem Zeilenumbruch hinzu.
Es scheint jedoch, dass das Aufteilen in der Mitte der Werte einer for-Schleife kein Caret benötigt (und tatsächlich wird der Versuch, einen zu verwenden, als Syntaxfehler betrachtet). Zum Beispiel,
for %n in (hello
bye) do echo %n
Beachten Sie, dass nicht einmal ein Leerzeichen nach hello oder vor bye benötigt wird.
Natürlich ist dies Teil der for
-Syntax: Die Trennzeichen der Elemente im "for-Set" sind Leerzeichen, Komma, Semikolon, Gleichheitszeichen, TAB-Zeichen und Zeilenumbrüche.
Dann können Sie einfach Klammern verwenden, um die Anweisungen wie for %n in (hello bye) do ( echo %n echo %n ) zu umschließen
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.