Kann mir bitte jemand erklären, wie das funktioniert?
@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.
emittiert:
There should be a newline
inserted here.
von Wie können Sie eine neue Zeile in Batch-Dateien wiedergeben?
batch-file
matt wilkie
quelle
quelle
Antworten:
Der Trick nutzt das Verhalten des Carets.
Wird auch unter Lange Befehle erläutert , die in der Windows Vista-Batchdatei (.bat) über mehrere Zeilen verteilt sind
Das Caret ist ein Escape-Zeichen für das nächste Zeichen oder wird am Zeilenende als mehrzeiliges Zeichen verwendet, dies ist jedoch nahezu identisch.
Am Zeilenende wird einfach das nächste Zeichen maskiert , in diesem Fall das
<Linefeed>
, aber es gibt eine versteckte Funktion. Wenn das maskierte Zeichen also a<LF>
ist, wird es ignoriert und das nächste Zeichen wird gelesen und maskiert, aber dieses Zeichen wird immer maskiert. auch wenn es auch ein ist<LF>
.Jetzt kannst du verstehen
Die NLM-Variable enthält genau ein
<LF>
Zeichen. Wenn Sie jedoch versuchen, esecho Line1%NLM%Line2
damit zu verwenden, schlägt dies fehl, da der Parser das Parsen bei einem einzelnen beendet<LF>
.Aber das funktioniert
Sie müssen also einen Escape-Zeilenvorschub in die Zeile einfügen, und das ist die NL-Variable. Die NL-Variable besteht nur aus drei Zeichen.
NL=^<LF><LF>
Und wenn dies erweitert wird, wird nur ein Escape<LF>
als erstes erstellt,<LF>
nachdem das Caret ignoriert wurde.Übrigens. Meiner Meinung nach ist es viel einfacher, Linefeeds mit verzögerter Erweiterung zu verwenden, da nichts entgangen werden muss.
In diesem Beispiel verwende ich
%=EMPTY=%
anstelle einer leeren Zeile (zum Selbstkommentieren), aber da die Variable=EMPTY=
nicht existieren kann, wird sie zu einer leeren Zeile erweitert.BEARBEITEN: Fügen Sie einige nützliche Hinweise hinzu
<LF>
1) Verwenden Sie es als Zeilenumbruch in einem
echo
2) Verwenden Sie diese Option, um Befehle in einem Klammerblock aufzuteilen
3) Erstellen Sie einen (fast) leeren EOL-Charakter in einer FOR / F-Schleife, ebenso
<LF>
wie der Zeilenbegrenzer, dessen EOL<LF>
der gleiche ist wie ein leerer.4) Verwenden Sie LF zum Teilen von Text in einer FOR / F-Schleife
quelle
set multiStr=Line1!LF!Line2 & echo !multiStr!
Es scheint einen Weg zu geben , der auch mit Pipe funktioniert:
quelle