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