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
echo hello & echo.world
Dies bedeutet, dass Sie & echo.
als Konstante für eine neue Zeile \n
definieren können.
Verwenden:
echo hello
echo.
echo world
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.
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
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.
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
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
Genau wie Grimtron vorschlägt - hier ein kurzes Beispiel, um es zu definieren:
@echo off
set newline=^& echo.
echo hello %newline%world
C:\>test.bat
hello
world
Wenn Sie Ergebnisse in eine Datei einfügen müssen, können Sie verwenden
(echo a & echo. & echo b) > file_containing_multiple_lines.txt
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)
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 :)
Um eine neue Zeile im Stapel zu beginnen, müssen Sie nur "echo [" hinzufügen, wie folgt:
echo Hi!
echo[
echo Hello!
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
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 . . .
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.
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.