2011-06-16 8 views
57

¿Puede alguien explicar cómo funciona esto?Explique cómo funciona el truco variable de nueva línea dos-batch

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

de How can you echo a newline in batch files?

+0

¿Hay alguna razón para hacer esto que no sea para crear una nueva línea en blanco? – Mechaflash

+0

Hay muchas, agregué algunas explicaciones a mi respuesta – jeb

Respuesta

82

El truco utiliza el comportamiento del cursor.
también explicó en Long commands split over multiple lines in Vista/DOS batch (.bat) file

El símbolo de intercalación es un carácter de escape para el siguiente carácter, o en la línea de fondo se utiliza como carácter de líneas múltiples, pero esto es casi la misma.

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

Ahora se puede entender

set NLM=^ 


rem Two empty lines are required here 

La NLM-variable contiene exactamente un <LF> carácter. Pero si intenta usarlo con echo Line1%NLM%Line2, falla, ya que el analizador detiene el análisis en un solo <LF>.
Pero esto funciona

echo Line1^ 

Line2 

Así que hay que añadir un salto de línea escaparon en la línea y que es la NL-variable. La variable NL consta de solo tres caracteres.
NL=^<LF><LF> Y si esto se expande, solo crea un <LF> escapado como el primer <LF> después de que se haya ignorado el símbolo de intercalación.

Btw. 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, utilizo %=EMPTY=% en lugar de una línea vacía (para autocomentar), pero como la variable =EMPTY= no puede existir, se ampliará a una línea vacía.

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

EDIT: Anexar algunos consejos para útil usando el <LF>

1) utilizarlo como nueva línea en un echo

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

2) Se usa para dividir los comandos en un bloque paréntesis

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

3) Crear un (casi) vacu-EOL-chararcter en un bucle FOR/F, como <LF> es el delimitador de línea una EOL de <LF> es la misma que una vacía.

FOR /F ^"eol^=^ 

delims^=^" %%a in (myFile.php) do echo %%a 

4) Uso LF para la División del texto en un for/F bucle

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

¡Excelente tema! ¿Cómo puedo insertar un carácter de nueva línea en una cadena que repetiré después de que haya creado la cadena de varias líneas? Gracias – RGuggisberg

+0

@RGuggisberg No estoy seguro de haber recibido tu pregunta, pero tal vez te refieres a 'establecer multiStr = Line1! LF! Line2 y echo! MultiStr!' – jeb

+0

¡Ahhh sí! Lo tengo. Gracias jeb – RGuggisberg

5

Parece un way que también trabaja con tubería:

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

Pero esto también ordena cada línea. Este truco no funciona para concatenar archivos de varias líneas – Armin