Divida comandos largos en varias líneas a través de un archivo por lotes de Windows

StackOverflow https://stackoverflow.com/questions/69068

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Cómo puedo dividir comandos largos en varias líneas en un archivo por lotes?

¿Fue útil?

Solución

Puedes romper largas colas con el cursor. ^ siempre que recuerde que el símbolo de intercalación y la nueva línea que lo sigue se eliminan por completo.Entonces, si debe haber un espacio donde estás rompiendo la línea, incluye un espacio. (Más sobre eso a continuación.)

Ejemplo:

copy file1.txt file2.txt

se escribiría como:

copy file1.txt^
 file2.txt

Otros consejos

La regla para el signo de intercalación es:

Un signo de intercalación al final de la línea, agrega la siguiente línea, el primer carácter de la línea agregada se escapará.

Puede utilizar el cursor varias veces, pero la línea completa no debe exceder la longitud máxima de línea de ~8192 caracteres (Windows XP, Windows Vista y Windows 7).

echo Test1
echo one ^
two ^
three ^
four^
*
--- Output ---
Test1
one two three four*

echo Test2
echo one & echo two
--- Output ---
Test2
one
two

echo Test3
echo one & ^
echo two
--- Output ---
Test3
one
two

echo Test4
echo one ^
& echo two
--- Output ---
Test4
one & echo two

Para suprimir el escape del siguiente carácter, puede utilizar una redirección.

La redirección tiene que ser justo antes del signo de intercalación.Pero existe una curiosidad con la redirección antes del signo de intercalación.

Si coloca una ficha en el cursor, la ficha se elimina.

echo Test5
echo one <nul ^
& echo two
--- Output ---
Test5
one
two


echo Test6
echo one <nul ThisTokenIsLost^
& echo two
--- Output ---
Test6
one
two

Y también es posible insertar avances de línea en la cuerda:

setlocal EnableDelayedExpansion
set text=This creates ^

a line feed
echo Test7: %text%
echo Test8: !text!
--- Output ---
Test7: This creates
Test8: This creates
a line feed

La línea vacía es importante para el éxito.Esto funciona sólo con expansión retardada; de lo contrario, el resto de la línea se ignora después del avance de línea.

Funciona porque el cursor al final de la línea ignora el siguiente avance de línea y escapa del siguiente carácter, incluso si el siguiente carácter también es un avance de línea (los retornos de carro siempre se ignoran en esta fase).

(Esto es básicamente una reescritura de la respuesta de wayne pero con la confusión en torno al símbolo de intercalación aclarada.Así que lo publiqué como CW.No me da vergüenza editar las respuestas, pero reescribiéndolos completamente parece inapropiado.)

Puedes dividir las filas largas con el símbolo de intercalación (^), solo recuerda que el cursor y la nueva línea que le sigue se eliminan por completo del comando, por lo que si lo coloca donde se requeriría un espacio (como entre parámetros), asegúrese de incluir el espacio también (ya sea antes del ^, o al principio de la siguiente línea (esta última opción puede ayudar a aclarar que se trata de una continuación).

Ejemplos: (todo probado en Windows XP y Windows 7)

xcopy file1.txt file2.txt

Se puede escribir como:

xcopy^
 file1.txt^
 file2.txt

o

xcopy ^
file1.txt ^
file2.txt

o incluso

xc^
opy ^
file1.txt ^
file2.txt

(Esto último funciona porque no hay espacios entre los xc y el ^, y sin espacios al principio de la siguiente línea.Entonces cuando quitas el ^ y la nueva línea, obtienes...xcopy.)

Para mayor legibilidad y cordura, probablemente sea mejor dividir solo entre parámetros (asegúrese de incluir el espacio).

Asegúrese de que el ^ es no lo último en un archivo por lotes, ya que hay parece ser un problema importante con eso.

Se pueden poner varios comandos entre paréntesis y distribuirlos en numerosas líneas;entonces algo como echo hi && echo hello se puede poner así:

( echo hi
  echo hello )

También las variables pueden ayudar:

set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
if exist %AFILEPATH% (
  start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
) else (
...

También me di cuenta con signos de intercalación (^) que el if A los condicionales les gustaba que siguieran solo si había un espacio presente:

if exist ^

Sin embargo, parece que dividir en medio de los valores de un bucle for no necesita un signo de intercalación (y, de hecho, intentar usar uno se considerará un error de sintaxis).Por ejemplo,

for %n in (hello
bye) do echo %n

Tenga en cuenta que ni siquiera se necesita espacio después de hola o antes de adiós.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top