Spiega come funziona la modifica della variabile newline di Windows

Qualcuno può spiegare come funziona?

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

emette:

 There should be a newline inserted here. 

da Come puoi echo una nuova riga nei file batch?

Il trucco utilizza il comportamento del cursore.
Spiegato anche nei comandi lunghi suddivisi su più righe nel file batch (.bat) di Windows Vista

Il segno di omissione è un carattere di escape per il prossimo carattere, o alla fine della riga è usato come carattere multilinea, ma questo è quasi lo stesso.

Alla fine della linea sfugge semplicemente il carattere successivo, in questo caso il , ma c’è una funzione nascosta, quindi se il carattere di escape è un viene ignorato e il carattere successivo viene letto ed ejar, ma questo il charater sarà sempre scappato, anche se è anche un .

Ora puoi capire

 set NLM=^ rem Two empty lines are required here 

La variabile NLM contiene esattamente un carattere . Ma se provi ad usarlo con echo Line1%NLM%Line2 fallisce, poiché il parser smette di parsing in un singolo .
Ma questo funziona

 echo Line1^ Line2 

Quindi è necessario aggiungere un linefeed con escape alla linea e questa è la variabile NL. La variabile NL è composta da soli tre caratteri.
NL=^ E se questo è espanso, crea solo un escape come primo dopo che il segno di omissione verrà ignorato.

Btw. A mio parere, è molto più semplice utilizzare i linefeed con un’espansione ritardata, in quanto non è necessario sfuggire a nulla.
In questo esempio, utilizzo %=EMPTY=% anziché una riga vuota (per il self commenting), ma poiché la variabile =EMPTY= non può esistere, verrà espansa su una riga vuota.

 setlocal EnableDelayedExpansion (set NLM=^ %=EMPTY=% ) echo Line1!NLM!Line2 

EDIT: aggiungi alcuni suggerimenti utili usando

1) Usalo come newline in un echo

 setlocal EnableDelayedExpansion (set LF=^ %=EMPTY=% ) echo Line1!LF!Line2 

2) Usalo per dividere i comandi in un blocco di parentesi

 setlocal EnableDelayedExpansion (set LF=^ %=EMPTY=% ) ( echo Line1%LF%set x=4%LF%echo !x!%LF% ) 

3) Creare un (quasi) vuoto EOL-cararcter in un ciclo FOR / F, poiché è il delimitatore di linee e un EOL di è lo stesso di uno vuoto.

 FOR /F ^"eol^=^ delims^=^" %%a in (myFile.php) do echo %%a 

4) Utilizzare LF per dividere il testo in un ciclo FOR / F

 setlocal EnableDelayedExpansion (set LF=^ %=EMPTY=% ) set "var=Content1;Content2" FOR /F "delims=" %%a in ("%var:;=!LF!%") do ( echo %%a ) 

Sembra che funzioni anche con pipe:

 (echo 1st line^ &echo 2nd line) | sort