it-swarm.com.de

Wie kann ich eine neue Zeile in einer Batch-Datei ausgeben?

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

Ich möchte etwas machen wie:

echo hello\nworld

Welches würde ausgeben:

hello
world
592
Brian R. Bondy

echo hello & echo.world

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

433
Grimtron

Verwenden:

echo hello
echo.
echo world
521
Matt Lacey

Erstellen Sie jetzt eine .bat-Datei mit den folgenden Inhalten:

@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

Die Ausgabe sollte folgendermaßen aussehen:

There should be a newline
inserted here.

Press any key to continue . . .

Sie brauchen natürlich nur den Code zwischen den REM Anweisungen.

131
Ken

Es gibt eine Standardfunktion echo: in cmd/bat-Dateien zum Schreiben einer leeren Zeile, die eine neue Zeile in Ihrer cmd-Ausgabe emuliert:

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

Ausgabe der oben genannten cmd-Datei:

line1

line2
93
macropas

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

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, das nächste Zeichen zu maskieren. Handelt es sich jedoch um einen Zeilenvorschub, wird dieser ignoriert und das nächste Zeichen gelesen und maskiert (auch wenn dies ebenfalls ein Zeilenvorschub ist).
Dann brauchen Sie einen dritten Zeilenvorschub, um den aktuellen Befehl zu beenden, sonst würde die dritte Zeile an die LF-Variable angehängt.
Auch 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 Verwendung der verzögerten Erweiterung besteht darin, dass es überhaupt keine spezielle Zeichenbehandlung gibt.
echo Line1%LF%Line2 würde fehlschlagen, da der Parser das Parsen bei einzelnen Zeilenvorschüben beendet.

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

Bearbeiten: echo. vermeiden

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

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

Zum Drucken einer leeren Zeile können Sie eine der folgenden Optionen verwenden

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

Die Verwendung von echo., echo\ oder echo: sollte jedoch vermieden werden, da sie je nach dem Ort, an dem das Skript ausgeführt wird, sehr langsam sein können, z. B. ein Netzlaufwerk.

60
jeb

echo. Genug gesagt.

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

echo Line 1 & echo. & echo line 3

würde ausgeben als:

Line 1

line 3

Jetzt sag mal, du willst etwas ausgefalleneres, ...

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

Ausgänge

hello
world

Dann geben Sie einfach einen %n% ein, wann immer Sie eine neue Zeile in einer Echo-Anweisung wünschen. Dies ist näher an Ihrem \n, der in verschiedenen Sprachen verwendet wird.

Aufschlüsselung

set n= setzt die Variable n gleich:

^ Hebt das nächste folgende Symbol auf Null:

& Bedeutet, einen anderen Befehl in derselben Zeile auszuführen. Wir kümmern uns nicht um die Fehlerstufe (es ist ein Echo-Statement, um laut zu schreien), daher wird kein && benötigt.

echo. Setzt die Echo-Anweisung fort.

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

Wenn Sie schlau sind, können Sie dies mit anderen Dingen arbeiten. Verwenden Sie es beispielsweise, um einen Tabulator wiederzugeben

set t=^&echo.     ::there are spaces up to the double colon
37
coltonon

Wenn Sie ein Echo für die Umleitung in eine Datei erstellen, funktionieren mehrere Echo-Befehle nicht. Ich denke, vielleicht ist der ">>" Redirector eine gute Wahl:

 hallo hallo> temp 
 echo welt >> temp 
19
Crend King

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

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

Ausgabe

C:\>test.bat
hello
world
15
user287293

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

(echo a & echo. & echo b) > file_containing_multiple_lines.txt
13
test30

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 beim Einfügen in eine Batch-Datei '%' verdoppelt werden soll.

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

Wenn jemand hierher kommt, weil er versucht, eine leere Zeile aus einem MINGW-Makefile wiederzugeben, habe ich verwendet

@cmd /c echo.

die einfache Verwendung von echo. verursacht die gefürchtete process_begin: CreateProcess(NULL, echo., ...) failed. Fehlermeldung.

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

6
Wayne Uroda

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

echo Hi!
echo[
echo Hello!
3
PryroTech

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

Dazu 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
2
otaviodecampos

Das hat bei mir geklappt, keine verzögerte Erweiterung notwendig:

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

Es schreibt die Ausgabe wie folgt:

<html>
<body>
Hello
</body>
</html>
Press any key to continue . . .
2
NahuelGQ

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

@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 einer Stelle, auch in einem anderen Skript oder einer externen Datei, vorbereitet und an einer anderen Stelle gedruckt werden.

Der Zeilenumbruch wird in einer Newline Variablen festgehalten. Sein Wert muss ersetzt werden nach Die Echo Zeile wird erweitert, so dass ich setlocal enableDelayedExpansion verwende , um Ausrufezeichen zu aktivieren, die die Variablen bei der Ausführung erweitern. Und die Ausführung ersetzt \n durch Zeilenumbrüche Hilfesatz ). Wir könnten natürlich ! Newline! verwenden, während wir die Antwort setzen, aber \n ist bequemer. Es kann von außen übergeben werden (try Hello R2\nD2 ), wobei niemand den Namen der Variablen kennt, die den Zeilenumbruch enthält (Yes, Hallo C3! Newline! P0 funktioniert genauso).

Das obige Beispiel kann auf eine Subroutine oder einen Standalone-Batch verfeinert werden, der 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 Teilzeichenfolge zu analysieren.

2
Tomator

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

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

Ich hoffe es hilft :)

Hmm du hast recht, ich brauchte es in einem Makefile, es funktioniert dort perfekt. Ich denke, meine Antwort ist nicht für Batch-Dateien geeignet ... Meine schlechte.

0
johan d.