it-swarm-eu.dev

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

Wie kann ich lange Befehle in einer Batch-Datei über mehrere Zeilen aufteilen?

664
Dan

Sie können lange Zeilen mit dem Caret ^ auflösen, solange Sie sich daran erinnern, dass das Caret und die darauf folgende Zeile vollständig entfernt wurden. Wenn es also ein Leerzeichen gibt, bei dem die Linie unterbrochen wird, 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
827
Wayne

Die Regel für das Caret lautet:

Ein Caret am Zeilenende fügt die nächste Zeile hinzu, 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 Entweichen 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 Neugier mit Umleitung vor dem Caret.

Wenn Sie einen Token beim Caret platzieren, 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

Und es ist auch möglich, Zeilenvorschübe einbetten in den String einzufügen:

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 mit verzögerter Erweiterung, ansonsten wird der Rest der Zeile nach dem Zeilenvorschub ignoriert.

Dies funktioniert, da das Caret am Zeilenende den nächsten Zeilenvorschub ignoriert und das nächste Zeichen ignoriert, auch wenn das nächste Zeichen ebenfalls ein Zeilenvorschub ist (Zeilenumbrüche werden in dieser Phase immer ignoriert).

247
jeb

(Dies ist im Grunde eine Neufassung von Waynes Antwort , aber mit der Klarstellung der Verwirrung um das Caret. Also habe ich es als CW gepostet. Ich bin nicht schüchtern in Bezug auf die Bearbeitung Antworten, aber sie komplett neu schreiben scheint unangemessen.)

Sie können lange Zeilen mit dem Caret (^) auflösen. Denken Sie jedoch daran, dass das Caret und die darauf folgende neue Zeile vollständig aus dem Befehl entfernt werden Stellen Sie sicher, dass ein Leerzeichen erforderlich ist (z. B. zwischen den Parametern), und fügen Sie dieses ebenfalls ein (entweder vor dem ^ oder am Anfang der nächsten Zeile). Diese letztere Auswahl kann dazu beitragen, die Übersichtlichkeit zu verbessern es ist eine Fortsetzung).

Beispiele: (alle getestet unter 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 auch

xc^
opy ^
file1.txt ^
file2.txt

(Letzteres funktioniert, weil zwischen xc und ^ keine Leerzeichen und am Anfang der nächsten Zeile keine Leerzeichen stehen. Wenn Sie also ^ und die neue Zeile entfernen, werden Sie get ...xcopy.)

Aus Gründen der Lesbarkeit und Übersichtlichkeit ist es wahrscheinlich am besten, nur zwischen den Parametern zu wechseln (achten Sie darauf, das Leerzeichen einzuschließen).

Stellen Sie sicher, dass der ^nicht ​​das Letzte in einer Batch-Datei ist, da scheint ein großes Problem damit zu sein .

64
T.J. Crowder

Mehrere Befehle können in Klammern gesetzt und auf mehrere Zeilen verteilt werden. So etwas wie echo hi && echo hello kann folgendermaßen 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 gelten, wenn ein Leerzeichen vorhanden ist:

if exist ^
15
Todd Partridge

Es scheint jedoch, dass das Teilen in der Mitte der Werte einer for-Schleife kein Caret erfordert (und der Versuch, einen zu verwenden, wird als Syntaxfehler angesehen). Zum Beispiel,

for %n in (hello
bye) do echo %n

Beachten Sie, dass nach hallo oder vor tschüss kein Platz benötigt wird.

9
Mohammed Safwat