Explicar como o hack de variável de nova linha em lote do Windows funciona

Alguém pode explicar como isso funciona?

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

Como você pode ecoar uma nova linha em arquivos em lote?

O truque usa o comportamento do cursor.
Também explicado em Longos comandos divididos em várias linhas no arquivo em lotes do Windows Vista (.bat)

O cursor é um caractere de escape para o próximo caractere ou, no final da linha, é usado como caractere multilinha, mas isso é quase o mesmo.

No final da linha, ele simplesmente escapa do próximo caractere, neste caso o , mas há um recurso oculto, portanto, se o caractere de escape for um ele será ignorado e o próximo caractere será lido e escapingá, mas isso O charater sempre será salvo, mesmo que seja também um .

Agora você pode entender

 set NLM=^ rem Two empty lines are required here 

A variável NLM contém exatamente um caractere . Mas se você tentar usá-lo com o echo Line1%NLM%Line2 ele falhará, pois o analisador parará a análise em um único .
Mas isso funciona

 echo Line1^ Line2 

Então você precisa adicionar um linefeed com escape na linha e essa é a NL-Variable. A variável NL consiste em apenas três caracteres.
NL=^ E se isso for expandido, ele cria apenas um escape, pois o primeiro após o cursor será ignorado.

Btw. Na minha opinião, é muito mais fácil usar linefeeds com expansão atrasada, já que não há necessidade de escaping de nada.
Neste exemplo eu uso %=EMPTY=% vez de uma linha vazia (para auto-comentar), mas como a variável =EMPTY= não existe, ela será expandida para uma linha vazia.

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

EDIT: Anexar algumas dicas para útil usando o

1) Use-o como nova linha em um echo

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

2) Use-o para dividir comandos em um bloco parêntese

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

3) Crie um EOL-chararcter (quase) vazio em um loop FOR / F, pois é o delimitador de linha que um EOL de é o mesmo que um vazio.

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

4) Use LF para dividir o texto em um loop FOR / F

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

Parece haver uma maneira que também funciona com o pipe:

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