Explicar cómo funciona el cambio de variable por lotes de Windows por lotes

¿Alguien puede explicar cómo funciona esto?

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

Emite:

 There should be a newline inserted here. 

from ¿Cómo se puede hacer eco de una nueva línea en los archivos por lotes?

El truco usa el comportamiento del caret.
También se explica en Comandos largos divididos en varias líneas en el archivo por lotes de Windows Vista (.bat)

El cursor es un carácter de escape para el siguiente personaje, o en el extremo de la línea se usa como carácter de línea múltiple, pero es casi lo mismo.

En el extremo de línea, simplemente escapa al siguiente carácter, en este caso el , pero hay una función oculta, por lo que si el carácter escapado es un se ignora y el siguiente carácter se lee y se escapa, pero esto charater siempre se escapará, incluso si también es un .

Ahora puedes entender

 set NLM=^ rem Two empty lines are required here 

La variable NLM contiene exactamente un caracter . Pero si intenta usarlo con echo Line1%NLM%Line2 , falla, ya que el analizador detiene el análisis en una sola .
Pero esto funciona

 echo Line1^ Line2 

Por lo tanto, debe agregar un salto de línea escapado en la línea y esa es la variable NL. La variable NL consta de solo tres caracteres.
NL=^ Y si esto se expande, crea solo un escapado como primer después de que se ignorará el símbolo de intercalación.

Por cierto. En mi opinión, es mucho más fácil usar avances de línea con expansión retardada, ya que no hay necesidad de escapar de nada.
En este ejemplo, uso %=EMPTY=% lugar de una línea vacía (para autocomentar), pero como la variable =EMPTY= no puede existir, se expandirá a una línea vacía.

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

EDITAR: agregue algunos consejos útiles usando

1) Úselo como nueva línea en un echo

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

2) Úselo para dividir comandos en un bloque de paréntesis

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

3) Cree un chaleter EOL (casi) vacío en un bucle FOR / F, ya que es el delimitador de línea una EOL de es la misma que una vacía.

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

4) Use LF para dividir texto en un bucle FOR / F

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

Parece una manera que también funciona con tubería:

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