2011-01-10 23 views
23

Los comandos largos en archivos por lotes de Windows se pueden dividir en varias líneas utilizando ^ como se menciona en Long commands split over multiple lines in Windows Vista batch (.bat) file.¿Cómo dividir la línea entre comillas dobles en varias líneas en el archivo por lotes de Windows?

Sin embargo, si el símbolo de intercalación está dentro de una cadena con comillas dobles, no funcionará. Por ejemplo:

echo "A very long line I want to^
split into two lines" 

Esto imprimirá "A very long line I want to ^ y dime split es un comando desconocido.

¿Hay alguna forma de evitar esto?

Respuesta

18

Veo tres soluciones posibles.

1) Construcción de la línea que combina múltiples parámetros for.

@echo off 
SETLOCAL EnableDelayedExpansion 

set "line=" 
for %%a in ("line1" 
"line2" 
"line3" 
"line4" 
) do set line=!line!%%~a 
echo !line! 

2) Al salir de la "cita" al final de cada línea

@echo on 
SETLOCAL EnableDelayedExpansion 

set "line=line1 & x#"^ 
"line2 & a#"^ 
"line3 & b #"^ 
"line4 & c " 

set "line=!line:#" "=!" 
echo !line! 

El primer espacio de cada línea es importante, porque el símbolo de intercalación trabaja carácter como de varias líneas, pero también se escapa el primer personaje, por lo que también se escapó una cita.
Reemplazo el #ness "#" después de construir la línea.

EDITAR Agregado: 3) desaparición cita

setlocal EnableDelayedExpansion 
echo "A very long line I want to !"=!^ 
split into two lines" 

En mi opinión esta es la mejor manera, funciona como el analizador primera ver las cotizaciones y, por tanto, el último símbolo de intercalación funcionará, ya que parece estar fuera de las citas
Pero esta expresión !"=! expandirá la variable llamada "=, pero dicho nombre de variable no puede existir (un signo igual solo puede aparecer como primer carácter) por lo que se expande a nada.

También puede crear expresiones seguras, siempre se escaparán de las comillas, independientemente si hay una cita o no en la línea.
!"^"=!

echo This multiline works !"^"=!^ 
as expected 
echo "This multiline works !"^"=!^ 
too" 

Si desea evitar la expansión retardada, también se puede utilizar un -PARA-Loop como

for %%^" in ("") do (
echo "This multiline works %%~"^ 
too" 
) 
+0

¡La respuesta no es simple, pero estos son algunos trucos geniales! Ojalá pudiera tener múltiples votos ascendentes. ¡Gracias! –

+0

Realmente me gusta el método # 1. ¿Hay algún problema con ese método? – djangofan

+0

No funciona con caracteres como '*?' Y, como el bucle for, intente utilizarlos como comodines. Pero entonces se puede cambiar a un bucle FOR/F – jeb

7

La respuesta más directa es escapar de las comillas. Se imprimirán, pero no citarán funcionalmente los contenidos en lo que respecta a CMD.EXE.

@echo off 
echo ^"A very long line I want to^
split into two lines^" 

Los caracteres especiales que aparecen en la línea también se deben evitar ya que ya no se citan funcionalmente.

@echo off 
echo ^"A very long line I want to^
split into two lines^
that also contains special characters ^^ ^& ^| ^> ^< ^" 

Como dijo jeb, la continuación de la línea se escapa del primer carácter de la línea siguiente. Entonces, si el primer personaje de la siguiente línea resulta ser un personaje especial, no debería escaparse por segunda vez.El siguiente código dará exactamente los mismos resultados que en el ejemplo anterior.

@echo off 
echo ^"A very long line I want to^
split into two lines^
that also contains special characters ^^^
& ^| ^> ^< ^" 
+1

+1, pero prefiero las citas que desaparecen, ya que no necesita escapar de los caracteres especiales – jeb

+0

También me gustan mejor las citas que desaparecen :-) – dbenham

+0

Siempre que sepa que el carácter de escape es el carácter de escape, creo que esta técnica es mucho más fácil de recordar. No es necesario comprender/habilitar la expansión retardada, ni comprender/memorizar una expansión retrasada * hack *. Pero a cada cual lo suyo. –

Cuestiones relacionadas