Wie kann ich einen Zeilenumbruch in einer Batchdatei wiederholen?

641

Wie können Sie eine neue Zeile aus Ihrer Batchdatei-Ausgabe einfügen?

Ich möchte so etwas tun wie:

echo hello\nworld

Welches würde ausgeben:

hello
world
Brian R. Bondy
quelle
6
Kam nützlich für mich. Ich musste echo \ n \ n | machen my_app.exe in einem Skript. Ich habe (echo. && echo.) | my_app.exe
Vignesh
2
Einfacher Ansatz "Code startet:"> Echo Hallo & Echo Welt, wird dir geben, was du brauchst
prudviraj
1
Sie können ein unsichtbares ASCII-Chr (255) in eine separate Zeile einfügen, wodurch eine leere neue Zeile erzwungen wird. Halten Sie die [Alt] -Taste gedrückt und drücken Sie 255 auf der Tastatur. Dies fügt chr (255) ein, das ein leeres Quadrat ist. dh " echo (alt + 255) " Sie können nur die Tastatur verwenden, nicht die Zahlen oben auf der Querty-Tastatur!
Jwzumwalt
So wie die Hälfte der Computerreparatur es einsteckt und einschaltet, ist die Hälfte der Softwareentwicklung das, was ich Raumfahrttechnik nenne . Wir brauchen unsere leeren Zeilen nur so.
Bob Stein
Wie wäre es damit ? echo Yes&echo No
Wissenschaftler_7

Antworten:

461

echo hello & echo.world

Dies bedeutet, dass Sie & echo.eine Konstante für eine neue Zeile definieren können \n.

Grimtron
quelle
43
Das Beispiel braucht keinen Punkt, aber Sie brauchen einen, um eine leere leere Zeile echo. && echo hello && echo. && echo world
wiederzugeben
4
Können Sie dies mit einem einzelnen Echo tun, damit es in eine Datei umgeleitet werden kann?
Shahbaz
46
@ Shahbaz -$ (echo Hello && echo World) > ./File.txt
Nathan JB
25
Die Punktsache in "Echo". hört nie auf mich zu verblüffen. Es ist so veraltet, und trotzdem vergesse ich immer, dass der Punkt streng mit dem Befehlsnamen verkettet sein muss, ohne Leerzeichen dazwischen. Es gibt keinen Fehler in Ihrem Beitrag, ich schreibe dies nur zur Erinnerung: "Echo". ! = "Echo." !
Quetzalcoatl
5
@quetzalcoatl, es wird noch seltsamer. Neben den Zeichen funktionieren auch andere Zeichen. Laut SS64 bedeutet eine bessere Syntax eine echo(verbesserte Leistung (immer noch ohne Platz). Erweiterte Diskussion anderer Charaktere und ihrer Vorzüge / Mängel bei ECHO. Fehler beim Geben von Text oder Leerzeichen - Verwenden Sie stattdessen ECHO /
Matt Wilkie
557

Verwenden:

echo hello
echo.
echo world
Matt Lacey
quelle
16
Ist es möglich, eine Zeichenfolge innerhalb einer einzelnen Echoanweisung bereitzustellen?
Brian R. Bondy
5
Warum müssen Sie dies mit einer einzelnen Echoanweisung tun? Wo ist der Schaden, wenn man einen anderen hat?
Rob
3
@Rob, ich bin gerade auf dieses Problem gestoßen und keine dieser Arbeiten. Sie müssen in meinem Beispiel eine einzige Aussage wiederholen. Ich generiere einige Tex-Dateien aus HTML und generiere ein Makefile unter Verwendung von echo "Makefile contents (which has \n)" > MakefileMit mehreren Echos würde es nicht funktionieren
Shahbaz
3
Verwenden Sie & (oder &&), um sie in einer einzigen Anweisung auszuführen: Zum Beispiel, um "hello \ nworld" in eine txt-Datei einzufügen:(echo hello & echo world) >> ./test.txt
Ned Martin
4
Für die mehrzeilige Ausgabe in eine Datei, warum nicht einfach Folgendes tun? echo line 1 > Makefileund dann echo line 2 >> Makefile. Durch die Verwendung von >>wird die Ausgabe an die Datei angehängt. Dies ist genau das Verhalten, das Sie für diesen Fall benötigen.
dgnuff
141

Erstellen Sie eine .bat-Datei mit den folgenden Angaben:

@echo off
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%
REM Example Usage:
echo There should be a newline%NL%inserted here.

echo.
pause

Sie sollten die folgende Ausgabe sehen:

There should be a newline
inserted here.

Press any key to continue . . .

Sie benötigen natürlich nur den Code zwischen den REM-Anweisungen.

jeb
quelle
51
Sehr beeindruckend, könnten Sie sich Zeit nehmen, um zu erklären, wie die Zeilengruppe NL = ^^^% NLM %% NLM% ^% NLM %% NLM% funktioniert? Ich kann es nicht ganz verstehen
Andy Morris
8
@andy meint, ein +8 Kommentar rechtfertigt eine Frage: stackoverflow.com/questions/6379619/…
matt wilkie
82
Dies ist ein wunderbares Beispiel, um zu zeigen, dass cmd.exe- und Windows-Batchdateien völlig verrückt sind!
Mivk
12
Merke: Die Zeile „Set NLM = ^“ muss nichts nach dem CARET haben und müssen zwei Leerzeilen nach ihm.
Mnemotronic
4
Siehe meine Antwort für eine einfachere Methode. set nl=^&echo., echo hello %nl% worldergibt dann nur den gleichen Effekt.
Coltonon
96

echo:In cmd / bat-Dateien gibt es eine Standardfunktion zum Schreiben von Leerzeilen, die eine neue Zeile in Ihrer cmd-Ausgabe emuliert:

@echo off
@echo line1
@echo:
@echo line2

Ausgabe der oben genannten cmd-Datei:

line1

line2
Macropas
quelle
37
Tatsächlich sollte jedes nicht verwendete Sonderzeichen funktionieren. Ich empfehle immer die Verwendung von /, da der Schrägstrich das Standardzeichen für Befehlsoptionen ist. Außerdem kritisiere ich immer die Verwendung des Punkts, den jemand in Microsoft leider gewählt hat, da der Befehl: echo.com je nach Version des MS-DOS / Windows Batch-Befehlsprozessors unterschiedliche Ergebnisse liefert.
Aacini
20
Die einzige Version, die immer funktioniert, ist echo(. Es sieht so aus, als könnte es Probleme verursachen, aber es funktioniert tatsächlich perfekt. Alle anderen Formulare haben mindestens eine Situation, in der der Befehl nicht wie gewünscht ausgeführt wird.
Dbenham
5
@naxa - Nichts offizielles, nur kollektives Wissen, das von einigen Batch-Hackern abgeleitet wurde. Das Ziel ist eine Syntax, mit der jeder Wert, einschließlich nichts, ECHO-fähig ist, und Sie müssen sich nie darum kümmern, etwas anderes als das zu erhalten, was erwartet wird. Die beste mir bekannte Zusammenfassung finden Sie unter dostips.com/forum/viewtopic.php?p=4554#p4554 . Es lässt dich irgendwie hängen, aber niemand hat sich jemals ein Szenario ausgedacht, in dem es ECHO(fehlschlägt.
Dbenham
2
@Pacerier - Für jeden dieser Vorschläge gibt es Beispiele für Fehler. Lesen Sie dostips.com/forum/viewtopic.php?p=4554#p4554 sorgfältig durch .
Dbenham
2
@ Pacerier Hier ist genug Echo für eine eigenständige Frage. Vielleicht etwas in der Art von "Welche Charaktere können sofort folgen echound welche Auswirkungen haben sie?"
Matt Wilkie
68

Wie die Antwort von Ken, aber mit der Verwendung der verzögerten Erweiterung.

setlocal EnableDelayedExpansion
(set \n=^
%=Do not remove this line=%
)

echo Line1!\n!Line2
echo Works also with quotes "!\n!line2"

Zuerst wird ein einzelnes Zeilenvorschubzeichen erstellt und der Variablen \ n zugewiesen.
Dies funktioniert, wenn das Caret am Zeilenende versucht, dem nächsten Zeichen zu entkommen. Wenn es sich jedoch um einen Zeilenvorschub handelt, wird dieser ignoriert und das nächste Zeichen wird gelesen und maskiert (auch wenn dies auch ein Zeilenvorschub ist).
Dann benötigen Sie einen dritten Zeilenvorschub, um den aktuellen Befehl zu beenden. Andernfalls wird die dritte Zeile an die LF-Variable angehängt.
Sogar Batch-Dateien haben Zeilenenden mit CR / LF, nur die LF sind wichtig, da die CRs in dieser Phase des Parsers entfernt werden.

Der Vorteil der verzögerten Erweiterung besteht darin, dass überhaupt keine Sonderzeichenbehandlung erfolgt.
echo Line1%LF%Line2würde fehlschlagen, da der Parser das Parsen bei einzelnen Zeilenvorschüben beendet.

Weitere Erklärungen finden Sie unter
SO: Lange Befehle, die in der Vista / DOS-Batchdatei (.bat) über mehrere Zeilen verteilt sind.
SO: Wie analysiert der Windows Command Interpreter (CMD.EXE) Skripts?

Bearbeiten: Vermeiden echo.

Dies beantwortet die Frage nicht, da es sich um eine einzelne Frage handelt, die echomehrere Zeilen ausgeben kann.

Trotz der anderen Antworten, die die Verwendung von echo.zum Erstellen einer neuen Zeile echo.vorschlagen, sollte beachtet werden, dass dies das Schlimmste ist, da es sehr langsam ist und vollständig fehlschlagen kann, da cmd.exe nach einer Datei mit dem Namen sucht ECHOund versucht, sie zu starten.

Zum Drucken nur einer leeren Zeile können Sie eine von verwenden

echo,
echo;
echo(
echo/
echo+
echo=

Aber die Verwendung von echo., echo\oder echo:sollte vermieden werden, da sie wirklich langsam sein können, abhängig von der Stelle , wo das Skript ausgeführt werden, wie ein Netzlaufwerk.

jeb
quelle
1
Wenn Sie die Zeichenfolge mit Zeilenumbrüchen als Parameter an eine Stapelunterroutine übergeben, z. B. call :pause line1!\n!line2beginnen Sie die Unterroutine mit setlocal EnableDelayedExpansionund beenden Sie sie mit setlocal DisableDelayedExpansion, um zu verhindern, dass die Zeilenumbrüche vorzeitig interpretiert werden.
stevek_mcc
2
+1 für die Besetzung der Charaktere echo, echo; echo( echo/ echo+ echo=und die Schurkengalerie echo. echo\ echo:. Wenn Sie jetzt erklären würden, warum zum Teufel diese Arbeit, würde ich Ihnen ein Freibier schulden.
Bob Stein
40

echo. Genug gesagt.

Wenn Sie es in einer einzelnen Zeile benötigen, verwenden Sie die &. Zum Beispiel,

echo Line 1 & echo. & echo line 3

würde ausgeben als:

Line 1

line 3

Sagen Sie jetzt, Sie wollen etwas schickeres, ...

set n=^&echo.
echo hello %n% world

Ausgänge

hello
world

Dann werfen %n%Sie einfach eine ein, wann immer Sie eine neue Zeile in einer Echo-Anweisung wünschen. Dies kommt Ihrer \nVerwendung in verschiedenen Sprachen näher .

Nervenzusammenbruch

set n=setzt die Variable ngleich:

^ Nullt das nächste folgende Symbol aus:

&Bedeutet, einen anderen Befehl in derselben Zeile auszuführen. Wir kümmern uns nicht um die Fehlerstufe (es ist eine Echo-Aussage für lautes Schreien), daher wird keine &&benötigt.

echo. Setzt die Echo-Anweisung fort.

All dies funktioniert, weil Sie tatsächlich Variablen erstellen können, die Code sind, und diese in anderen Befehlen verwenden können. Es ist eine Art Ghetto-Funktion, da Batch nicht gerade die fortschrittlichste Shell-Skriptsprache ist. Dies funktioniert nur, weil der Batch Variablen nicht richtig verwendet und nicht zwischen Ints, Zeichen, Floats, Strings usw. angegeben wird.

Wenn Sie schlau sind, können Sie dies dazu bringen, mit anderen Dingen zu arbeiten. Verwenden Sie diese Option beispielsweise, um eine Registerkarte wiederzugeben

set t=^&echo.     ::there are spaces up to the double colon
Coltonon
quelle
7
Verwenden echo.Sie diese Option nicht , wenn Sie zuerst versuchen, eine Datei mit diesem Namen zu finden. Verwenden Sie andere Interpunktion, wieecho,
Reinstate Monica
20

Wenn Sie etwas wiederholen, um es in eine Datei umzuleiten, funktionieren mehrere Echo-Befehle nicht. Ich denke, vielleicht ist der ">>" Redirector eine gute Wahl:

echo hallo> temp
Echo Welt >> Temp
Crend King
quelle
8
Im ersten Beispiel mit ">" wird eine neue Datei erstellt, im zweiten Beispiel mit ">>" wird eine vorhandene Datei angehängt (oder erstellt, wenn sie noch nicht vorhanden ist).
Yann Duran
1
(echo hello && echo world) > tempErwähnt von Nathan J. Brauer in einem Kommentar zu den (aktuell) akzeptierten Antwortwerken.
GeroldBroser stellt Monica am
15

Genau wie Grimtron vorschlägt - hier ist ein kurzes Beispiel, um es zu definieren:

@echo off
set newline=^& echo.
echo hello %newline%world

Ausgabe

C:\>test.bat
hello
world
Peter Mortensen
quelle
Es wird tatsächlich eine zusätzliche Zeile nach "world"
BlueRaja - Danny Pflughoeft
1
@blue Die nachfolgende Newline scheint eine Funktion der Batch-Datei selbst zu sein. Wenn Sie die echo hello %newline%worldZeile wiederholen , gibt es keine Leerzeichen dazwischen.
Matt Wilkie
2
echo "Hello %newline% world"schlägt fehl, da es in Anführungszeichen steht. Weil es keine echte Newline ist.
Jeb
14

Wenn Sie Ergebnisse in eine Datei einfügen müssen, können Sie verwenden

(echo a & echo. & echo b) > file_containing_multiple_lines.txt
test30
quelle
9

Sie können auch so tun,

(for %i in (a b "c d") do @echo %~i)

Die Ausgabe wird sein,

a
b
c d

Beachten Sie, dass '%' verdoppelt wird, wenn dies in eine Batch-Datei eingefügt wird.

(for %%i in (a b "c d") do @echo %%~i)
albert
quelle
Diese Lösung funktioniert auch, wenn Sie ein kaufmännisches Und & anstelle einer neuen Zeile wiedergeben möchten.
Parvus
Ich glaube, ich habe einen Fehler gefunden: der *char
7

Wenn jemand hierher kommt, weil er eine leere Zeile aus einem MINGW-Makefile wiedergeben möchte, habe ich verwendet

@cmd /c echo.

Einfaches Verwenden echo.verursacht die gefürchtete process_begin: CreateProcess(NULL, echo., ...) failed.Fehlermeldung.

Ich hoffe das hilft mindestens einer anderen Person da draußen :)

Wayne Uroda
quelle
Das ist aber nicht die Frage. Downvote!
Mesalcode
Nicht sicher, ob Sarkasmus oder nicht: P
Wayne Uroda
Finden Sie es heraus, indem Sie in Ihren Posteingang schauen: D
Mesalcode
3

Wenn Sie in Zeichenfolgenliteralen, die an eine Variable übergeben werden können, berühmte \ n verwenden müssen, schreiben Sie möglicherweise einen Code wie im folgenden Hello.bat- Skript:

@echo off
set input=%1
if defined input (
    set answer=Hi!\nWhy did you call me a %input%?
) else (
    set answer=Hi!\nHow are you?\nWe are friends, you know?\nYou can call me by name.
)

setlocal enableDelayedExpansion
set newline=^


rem Two empty lines above are essential
echo %answer:\n=!newline!%

Auf diese Weise kann die mehrzeilige Ausgabe an einem Ort, sogar in einem anderen Skript oder einer externen Datei, vorbereitet und an einem anderen gedruckt werden.

Der Zeilenumbruch wird in der Zeilenumbruchvariablen gehalten . Der Wert muss ersetzt werden , nachdem die Echolinie erweitert wird , so verwende ich setlocal enableDelayedExpansion Ausrufezeichen zu ermöglichen , die Variablen auf die Ausführung erweitern. Und die Ausführung ersetzt \ n mit Newline Inhalt (Look für Syntax bei Hilfe - Set ). Wir könnten natürlich ! Newline! während der Einstellung Antwort aber \ n ist bequemer. Es kann von außen übergeben werden (versuchen Sie es mit Hello R2 \ nD2 ), wobei niemand den Namen der Variablen kennt, die den Zeilenumbruch enthält (Ja, Hello C3! Newline! P0) funktioniert genauso).

Das obige Beispiel kann zu einem Unterprogramm oder einer eigenständigen Charge verfeinert werden, die wie folgt verwendet wird call:mlecho Hi\nI'm your comuter:

:mlecho
setlocal enableDelayedExpansion
set text=%*
set nl=^


echo %text:\n=!nl!%
goto:eof

Bitte beachten Sie, dass ein zusätzlicher Backslash das Skript nicht daran hindert, \ n Teilzeichenfolgen zu analysieren.

Tomator
quelle
1
Sie tun im Wesentlichen das Gleiche wie Jebs Antwort oben.
Squashman
Die Antworten, die ich oben gelesen habe, waren sehr hilfreich, aber ich musste ein Skript oder eine Unterroutine aufrufen, die \ n analysiert, damit ich den Trick nicht überall implementieren kann. Dies musste eine Lösung verfeinern und ich teilte diese Verfeinerung. Hoffe, es hat keinem Tier geschadet.
Tomator
2

Dies hat bei mir funktioniert, keine verzögerte Erweiterung notwendig:

@echo off
(
echo ^<html^> 
echo ^<body^>
echo Hello
echo ^</body^>
echo ^</html^>
)
pause

Es schreibt Ausgabe wie folgt:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
NahuelGQ
quelle
4
-1 echo asdf >myfile.txtliefert genau die gleichen Ergebnisse. echoHängt eine neue Zeile an das Ende der Zeichenfolge an.
BlueRaja - Danny Pflughoeft
2
Gute Antwort, die einzige Person zu sein, die den Wert der Verwendung der Klammern für neue Zeilen erkannt hat. Ich glaube, so haben die Macher von DOS beabsichtigt, dass Sie es tun.
Djangofan
2

Um eine neue Zeile im Stapel zu starten, müssen Sie lediglich "echo [" hinzufügen, wie folgt:

echo Hi!
echo[
echo Hello!
PryroTech
quelle
5
Es ist langsam und es schlägt fehl, wenn eine Datei mit dem Namen existiertecho[.bat
jeb
Was? Es sollte sofort funktionieren und auch nur die echo [.bat-Datei löschen.
PryroTech
2
Es ist so ziemlich das Gleiche wie Echo. Syntax.
PryroTech
5
Ja und echo.ist auch eine schlechte Lösung.
Jeb
1
Wie in den vorherigen Antworten zu sehen ist, wird versucht, zuerst eine Datei auf dem Pfad zu finden, was dazu führt, dass sie so langsam ist. Gleiches gilt für echo.. Von mir zu erwarten, dass Benutzer Ihres Skripts Dateien auf ihrem System löschen, nur weil Ihr Skript eine neue Zeile benötigt, klingt für mich nicht nach gutem Design.
Abel
2

Ken- und Jeb-Lösungen funktionieren gut.

Die neuen Zeilen werden jedoch nur mit einem LF-Zeichen generiert, und ich benötige CRLF-Zeichen (Windows-Version).

Zu diesem Zweck habe ich am Ende des Skripts LF in CRLF konvertiert.

Beispiel:

TYPE file.txt | FIND "" /V > file_win.txt
del file.txt
rename file_win.txt file.txt
otaviodecampos
quelle
0

Sie können verwenden @echo(@echo + [Leerzeichen] + [unsicheres Leerzeichen])

Hinweis: Der unsichere Speicherplatz kann mit Alt + 0160 abgerufen werden

Ich hoffe es hilft :)

[Bearbeiten] Hmm du hast recht, ich brauchte es in einem Makefile, es funktioniert dort perfekt. Ich denke, meine Antwort ist nicht für Batch-Dateien angepasst ... Mein schlechtes.

johan d
quelle
Ich habe ECHO ist eingeschaltet (ON).keine leere Zeile bekommen, versucht an der cmd-Eingabeaufforderung
jeb
1
Das ist ein ununterbrochener Raum, kein Zeilenumbruch.
Ry-
0

Diese Lösung funktioniert (getestet):

type nul | more /e /p

Dies wandelt isolierte Zeilenvorschübe in eine Wagenrücklauf-Zeilenvorschubkombination um.

Wasif Hasan
quelle
Aber wie fügt dies eine neue Zeile zwischen einem Text hinzu? Die Frage ist ungefährecho hello \n world
jeb
Ich stimme ab. Dies ist keine Antwort auf die Frage
Mesalcode
-2

Ich kann es nicht einfacher machen als:

echo echo hello^&echo world^&pause>silly.bat                       
call silly.bat
Kraft
quelle