Wie kann ich lange Befehle in einer Batchdatei auf mehrere Zeilen aufteilen?
Wie kann ich lange Befehle in einer Batchdatei auf mehrere Zeilen aufteilen?
Antworten:
Sie können lange Zeilen mit dem Caret ^
auflösen, solange Sie sich daran erinnern, dass das Caret und die darauf folgende neue Zeile vollständig entfernt wurden. Wenn es also ein Leerzeichen geben soll, in dem Sie die Linie brechen, fügen Sie ein Leerzeichen ein. ( Mehr dazu weiter unten. )
Beispiel:
copy file1.txt file2.txt
würde geschrieben werden als:
copy file1.txt^
file2.txt
echo
.
co^␍py ^␍file1 ^␍file2
. Ich schlage vor, Sie löschen Ihren Kommentar, um Verwirrung zu vermeiden, zumal diese Quest so beliebt ist
Die Regel für das Caret lautet:
Ein Caret am Zeilenende fügt die nächste Zeile an, das erste Zeichen der angehängten Zeile wird maskiert.
Sie können das Caret mehrmals verwenden, aber die gesamte 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^
*
--- Output ---
Test1
one two three four*
echo Test2
echo one & echo two
--- Output ---
Test2
one
two
echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two
echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two
Um das Entkommen des nächsten Zeichens zu unterdrücken, können Sie eine Umleitung verwenden.
Die Umleitung muss kurz vor dem Caret erfolgen. Aber es gibt eine Kuriosität mit Umleitung vor dem Caret.
Wenn Sie einen Token auf das Caret legen, wird der Token entfernt.
echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two
echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two
Es ist auch möglich, Zeilenvorschübe in den String einzubetten :
setlocal EnableDelayedExpansion
set text=This creates ^
a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed
Die leere Zeile ist wichtig für den Erfolg. Dies funktioniert nur bei verzögerter Erweiterung, andernfalls wird der Rest der Zeile nach dem Zeilenvorschub ignoriert.
Dies funktioniert, da das Caret am Zeilenende den nächsten Zeilenvorschub ignoriert und dem nächsten Zeichen entgeht, auch wenn das nächste Zeichen ebenfalls ein Zeilenvorschub ist (Wagenrückläufe werden in dieser Phase immer ignoriert).
copy ^[newline]"file1.txt" ^[newline]"file2.txt"
funktioniert nicht! Ich musste ein Leerzeichen hinzufügen : copy ^[newline] "file1.txt" ^[newline] "file2.txt"
.
(Dies ist im Grunde eine Neufassung von Waynes Antwort, aber mit der Verwirrung um das Caret. Ich habe es als CW gepostet. Ich bin nicht schüchtern, Antworten zu bearbeiten, aber es scheint unangemessen , sie komplett neu zu schreiben .)
Sie können mit caret ( ^
) lange Zeilen aufbrechen. Denken Sie jedoch daran, dass das Caret und die darauf folgende neue Zeile vollständig aus dem Befehl entfernt werden. Wenn Sie es also dort platzieren, wo ein Leerzeichen erforderlich wäre (z. B. zwischen Parametern), stellen Sie sicher, dass um auch das Leerzeichen einzuschließen (entweder vor ^
oder am Anfang der nächsten Zeile - diese letztere Auswahl kann dazu beitragen, klarer zu machen, dass es sich um eine Fortsetzung handelt).
Beispiele: (alle unter Windows XP und Windows 7 getestet)
xcopy file1.txt file2.txt
kann geschrieben werden als:
xcopy^
file1.txt^
file2.txt
oder
xcopy ^
file1.txt ^
file2.txt
oder auch
xc^
opy ^
file1.txt ^
file2.txt
(Das letzte funktioniert, weil es keine Leerzeichen zwischen dem xc
und dem ^
und keine Leerzeichen am Anfang der nächsten Zeile gibt. Wenn Sie also das ^
und die neue Zeile entfernen , erhalten Sie ... xcopy
)
Aus Gründen der Lesbarkeit und Vernunft ist es wahrscheinlich am besten, nur zwischen Parametern zu brechen (achten Sie darauf, das Leerzeichen einzuschließen).
Achten Sie darauf , dass das ^
ist nicht das letzte , was in einer Batch - Datei, wie es scheint , mit , dass ein großes Problem zu sein .
Mehrere Befehle können in Klammern gesetzt und über mehrere Zeilen verteilt werden. so etwas echo hi && echo hello
kann so ausgedrückt werden:
( echo hi
echo hello )
Auch Variablen können helfen:
set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...
Auch bei carets ( ^
) ist mir aufgefallen, dass die if
Bedingungen nur dann folgen sollten, wenn ein Leerzeichen vorhanden war:
if exist ^
cmd1.bat && cmd2.bat
unterscheidet sich von der Parens-Form: Ausführen, cmd2.bat
wenn cmd1.bat
erfolgreich ausgeführt (ohne Einstellung %errorcode%
). Die letztere Form wird bedingungslos ausgeführt. Etwas unerwartet (zumindest für mich) ist, dass Sie natürlich nicht die Kombination von beiden + verwenden können, dh &&
vor dem Zeilenumbruch hinzufügen .
( echo <line break here> hello )
führt zu einer leeren Zeile.
Es scheint jedoch, dass das Aufteilen in der Mitte der Werte einer for-Schleife kein Caret erfordert (und der Versuch, eines zu verwenden, wird als Syntaxfehler angesehen). Zum Beispiel,
for %n in (hello
bye) do echo %n
Beachten Sie, dass nach dem Hallo oder vor dem Abschied kein Platz mehr benötigt wird.
for
Syntax: Die Trennzeichen der Elemente in der "for-Menge" sind Leerzeichen, Komma, Semikolon, Gleichheitszeichen, TAB-Zeichen und neue Zeilen.
do
Teil mehrere / verschachtelte if-else
Anweisungen enthält?
^
und nach Ihrem Befehlstext ein Leerzeichen hinzufügen .