Teilen Sie lange Befehle in mehrere Zeilen durch die Windows-Batchdatei

735

Wie kann ich lange Befehle in einer Batchdatei auf mehrere Zeilen aufteilen?

Ondra Žižka
quelle

Antworten:

919

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
Wayne
quelle
95
Sie können die nächste Zeile ohne Leerzeichen beginnen, wenn Sie kurz vor ^und nach Ihrem Befehlstext ein Leerzeichen hinzufügen .
Joseph Daigle
4
@SebaIllingworth - Nein, Sie können jederzeit [LEERTASTE] + [^] und zwei Leerzeilen hinzufügen, um beim Bearbeiten insgesamt 2 Zeilenvorschübe zu erstellen echo.
James K
12
Zur Sicherheit immer mit Leerzeichen enden, wenn Carets verwendet werden, siehe Einfaches Karat in Batch-Datei verbraucht den gesamten Speicher
Matt Wilkie
4
@ GavinMiller: "caret ^ nach Kopie und file1.txt in einer neuen Zeile funktioniert nicht" Das stimmt nicht. Sie können die Zeile überall teilen, auch in der Mitte eines Wortes, wie z co^␍py ^␍file1 ^␍file2. Ich schlage vor, Sie löschen Ihren Kommentar, um Verwirrung zu vermeiden, zumal diese Quest so beliebt ist
Borodin
3
Ein Problem hierbei ist, dass das ^ das letzte Zeichen in der Zeile sein muss - dh keine Leerzeichen danach. Ich hatte Probleme damit und es stellte sich heraus, dass ich nach dem Caret eine Reihe von Leerzeichen hatte - in dem von mir verwendeten Editor nicht leicht sichtbar.
GregHNZ
266

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

jeb
quelle
Der letzte Codeblock mit dem Zeilenvorschubbeispiel zeigt die leere Zeile nicht an, obwohl sie vorhanden ist. (Zumindest wird es in IE7 nicht angezeigt.) Versuchen Sie stattdessen, ein Blockquote neu zu formatieren.
Dbenham
5
Die Frage ist, sollten wir ein schlechtes Tool unterstützen, das nicht den Regeln entspricht (jemand nennt es einen Browser, aber es ist nicht so), oder sollten Sie zu einem Browser wechseln?
Jeb
1
Ich hatte doppelte Anführungszeichen um meine Werte, wie in set var = "text here ^", aber es funktioniert nicht. Entfernen Sie das doppelte Anführungszeichen und es ist in Ordnung.
rjt
1
@jeb, schrieb ein Beispiel fehlgeschlagenes cmd-Skript, fand dann aber diese Frage: stackoverflow.com/questions/4643376/…
rjt
Dies funktioniert nicht, wenn die nächste Zeile mit einem Anführungszeichen beginnt: copy ^[newline]"file1.txt" ^[newline]"file2.txt"funktioniert nicht! Ich musste ein Leerzeichen hinzufügen : copy ^[newline] "file1.txt" ^[newline] "file2.txt".
Alexander Gelbukh
70

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

T.J. Crowder
quelle
18

Mehrere Befehle können in Klammern gesetzt und über mehrere Zeilen verteilt werden. so etwas echo hi && echo hellokann 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 ifBedingungen nur dann folgen sollten, wenn ein Leerzeichen vorhanden war:

if exist ^
Todd Partridge
quelle
1
Die Zeile cmd1.bat && cmd2.batunterscheidet sich von der Parens-Form: Ausführen, cmd2.batwenn cmd1.baterfolgreich 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 .
Paul Michalik
( echo <line break here> hello )führt zu einer leeren Zeile.
Karl Morrison
beste und sauberste Antwort! Carets sind hässlich und problematisch in Regex
neoscribe
9

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.

Mohammed Safwat
quelle
Dies ist natürlich Teil der forSyntax: Die Trennzeichen der Elemente in der "for-Menge" sind Leerzeichen, Komma, Semikolon, Gleichheitszeichen, TAB-Zeichen und neue Zeilen.
Aacini
Was aber, wenn ein doTeil mehrere / verschachtelte if-elseAnweisungen enthält?
Vicky Dev
Dann können Sie einfach Klammern verwenden, um die Anweisungen wie für% n in (Hallo Tschüss) do (Echo% n Echo% n) einzuschließen
Mohammed Safwat