Wie Dbenham sagte, kann es auch mit for/f gemacht werden, aber es ist ein bisschen komplizierter.
Die einfache 80% ige Lösung ist
setlocal EnableDelayedExpansion
set "var="
set LF=^
rem *** Two empty lines are required for the linefeed
FOR /F "delims=" %%a in (myFile.txt) do (
set "var=!var!!LF!%%a"
)
echo !var!
aber es funktioniert nicht mit:
- Wenn eine Zeile leer ist, wird es
übersprungen werden - Wenn eine Zeile beginnt mit ;
die EOL-Zeichen
- wenn eine Zeile enthält !
(und Carets)
Aber dann könnte man ein wenig komplexe Lösung
verwenden
@echo off
SETLOCAL DisableDelayedExpansion
set "all="
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ aux1.txt"`) do (
set "line=%%a"
SETLOCAL EnableDelayedExpansion
set "line=!line:#=#S!"
set "line=!line:*:=!"
for /F "delims=" %%p in ("!all!#L!line!") do (
ENDLOCAL
set "all=%%p"
)
)
SETLOCAL EnableDelayedExpansion
if defined all (
set "all=!all:~2!"
set ^"all=!all:#L=^
!"
set "all=!all:#S=#!"
)
echo !all!
Was macht der Code?
Zunächst wird die findstr /n ^^
wird jede Zeile mit einer Zeilennummer vorangestellt wird und ein Doppelpunkt, wie
1:My first Line
2:; beginning with a semicolon
3:
4:there was an empty line
Dies löst das Problem der leeren Linien und auch das Standard-EOL-Zeichen ;
kann ignoriert werden.
Um den Inhalt der Zeile zu erhalten, wird der Wert auf eine Variable gesetzt, während die verzögerte Erweiterung deaktiviert ist. Dies löst das Problem mit den Zeichen !
und ^
.
Um die Zeilennummer und den Doppelpunkt zu entfernen, wird die verzögerte Erweiterung aktiviert (nein, ein Delim von :
kann es nicht lösen).
Dann werden alle durch #S
ersetzt, dies wird zuerst durchgeführt, da nach dem Präfix das Entfernen der Zeile leer sein könnte und der Austausch fehlschlagen würde.
Aber warum ich es ersetzen?
Das ist, weil ich nicht die Zeilenvorschübe hier einfügen kann, wie die folgenden FOR/F mit eingebetteter Zeilenvorschübe,
so nur scheitern würde ich Zeilenvorschub Marker (in diesem Fall ich #L
verwenden), aber der Inhalt der Datei hinzufügen könnte auch eine #L
enthalten, aber durch den Austausch aller durch #S
sind alle Marker einzigartig.
Nach der Markierung gibt es das Problem, das verzögerte Expansion mit einem endlocal
, zu schließen/deaktivieren, aber dem Inhalt der modifizierten all
und line
variable zu bewahren.
Dies ist mit der FOR/F-endlocal
Trick gemacht, wie die %%p
Inhalt hinter der endlocal
Barriere transportieren kann.
Dann nach dem Lesen der vollständigen Datei, ich überprüfe, ob die all
definiert ist, da es für eine leere Datei leer wäre.
Dann wird der erste Zeilenvorschubmarker#L
entfernt, und alle anderen Markierungen werden durch ein echtes Zeilenvorschubzeichen ersetzt.
Dann wird die scharfe sicherer #S
wieder auf #
zurückgesetzt werden.
Das ist alles, so auch offensichtlich ist diese Lösung ...
das Karat ist^wirklich in der Datei, oder ist das ein Platzhalter für einen CRLF? Ich nehme an, das ist eine Windows-Maschine. – RobW
Das Caret ist wirklich in der Datei, es ist die Möglichkeit, eine Variable zu erstellen, die ein Zeilenvorschubzeichen enthält. 'set LF = ^' gefolgt von zwei leeren Zeilen – jeb
danke jeb für die Klarstellung –