Come diceva dbenham, può essere fatto anche con/f ma è un po 'più complicato.
La soluzione semplice 80% è
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!
ma non riesce con:
- Se una linea è vuota verrà saltato
- Se una linea inizia con ;
l'EOL caratteri
- Se una riga contiene !
(e CARETS)
Ma allora si potrebbe usare un po 'complessa soluzione più
@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!
Che codice fa?
primo luogo, il findstr /n ^^
sarà all'inizio di ciascuna riga un numero di riga e due punti, come
1:My first Line
2:; beginning with a semicolon
3:
4:there was an empty line
Questo risolve il problema di righe vuote e anche l'EOL-caratteri standard ;
può essere ignorato.
Per ottenere il contenuto della linea, il valore è impostato su una variabile mentre l'espansione ritardata è disabilitata, questo risolve il problema con !
e ^
caratteri.
Per rimuovere il numero di riga e i due punti, verrà abilitata l'espansione ritardata (no, un delim di :
non può risolverlo).
Quindi tutti gli #
vengono sostituiti con #S
, questo verrà eseguito prima, poiché dopo il prefisso la rimozione della riga potrebbe essere vuota e la sostituzione non riuscirebbe.
Ma perché lo sostituisco?
Ecco perché non posso inserire i ritorni a capo qui, come la seguente FOR/F fallirebbe con ritorni a capo incorporati,
così ho solo aggiungere avanzamento riga marcatore (in questo caso io uso #L
), ma il contenuto del file potrebbe contenere anche un #L
, ma sostituendo tutti gli #
con #S
tutti i contrassegni sono unici.
Dopo il contrassegno, c'è il problema di chiudere/disattivare l'espansione ritardata con un endlocal
, ma conservare il contenuto della variabile modificata all
e line
.
Questo è fatto con il trucco FOR/F-endlocal
, in quanto il %%p
può trasportare il contenuto dietro la barriera endlocal
.
Quindi, dopo aver letto il file completo, controllo se lo all
è definito, in quanto sarebbe vuoto per un file vuoto.
Quindi il primo indicatore di riga #L
verrà rimosso e tutti gli altri indicatori verranno sostituiti con un carattere di avanzamento reale.
Quindi il sicuro più sicuro #S
verrà ripristinato su #
.
Questo è tutto, quindi, anche questa soluzione è ovviamente ...
è la carati^davvero nel file, o è che un segnaposto per un CRLF? Presumo che questa sia una macchina Windows. – RobW
Il punto di inserimento è veramente nel file, è il modo di creare una variabile che contiene un carattere di avanzamento riga. 'imposta LF = ^' seguito da due righe vuote – jeb
grazie jeb per il chiarimento –