1008 Stimmen

Teile lange Befehle in mehrere Zeilen durch eine Windows-Batchdatei.

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

1246voto

Wayne Punkte 36217

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

142 Stimmen

Sie können die nächste Zeile ohne Leerzeichen beginnen, wenn Sie ein Leerzeichen gerade vor dem ^ und nach Ihrem Befehlstext hinzufügen.

2 Stimmen

Scheint auf die ersten beiden zusätzlichen Zeilen beschränkt zu sein?

0 Stimmen

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!

350voto

jeb Punkte 74279

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

`

0 Stimmen

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.

6 Stimmen

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?

2 Stimmen

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.

128voto

T.J. Crowder Punkte 948310

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

0 Stimmen

@Prid - Vielen Dank für diese Ergänzung! Eines noch: Bitte verwenden Sie kein Blockquote zur Hervorhebung. Blockquote dient für zitiertes Material.

26voto

Todd Partridge Punkte 623

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 ^

1 Stimmen

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.

0 Stimmen

( echo hallo ) führt zu einer leeren Zeile.

0 Stimmen

Beste und sauberste Antwort! Karotten sind hässlich und problematisch in Regex.

15voto

Mohammed Safwat Punkte 181

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.

1 Stimmen

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.

0 Stimmen

Aber was, wenn der do-Teil mehrere/verschachtelte if-else-Anweisungen enthält?

0 Stimmen

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

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.

Powered by:

X