Pregunta Los comandos largos se dividen en varias líneas en el archivo por lotes de Windows Vista (.bat)


¿Cómo puedo hacer que los comandos largos recorran múltiples líneas en un archivo por lotes de Windows (Vista)?


560
2017-09-16 03:04


origen


Respuestas:


Puedes romper largas filas 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

sería escrito como:

copy file1.txt^
 file2.txt

704
2017-09-16 03:06



La regla para el caret es:

Una referencia al final de la línea, agrega la siguiente línea, se escapará el primer carácter de la línea anexa.
Puede usar el símbolo de intercalación varias veces, pero la línea completa no debe exceder la longitud máxima de línea de ~ 8192 caracteres (XP / Vista / Win7).

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 usar una redirección.
La redirección debe estar justo antes del cursor. Pero existe una curiosidad con la redirección antes del caret. Si coloca un token en el cursor, se elimina el token.

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 alimentación de línea embebida 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 solo funciona con la expansión retrasada, 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 línea pasa por alto la siguiente línea de alimentación y se escapa el carácter siguiente, incluso si el siguiente carácter es también un avance de línea (retornos de carro siempre se tienen en cuenta en esta fase).


221
2017-12-15 22:48



(Esto es básicamente una reescritura de La respuesta de Wayne pero con la confusión alrededor del caret aclarado. Así que lo publiqué como CW. No soy tímido para editar respuestas, pero reescribiéndolos por completo parece inapropiado.)

Puede dividir las líneas largas con el cursor (^), solo recuerda que el cursor y la nueva línea que lo sigue se eliminan por completo desde el comando, así que si lo pones donde se necesitaría un espacio (como entre los parámetros), asegúrate de incluir el espacio también (antes del ^, o al comienzo de la siguiente línea, esta última opción puede ayudar a aclarar que es 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

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

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

Asegúrate de que ^ es no lo último en un archivo por lotes, como parece ser un problema importante con eso.


53
2018-02-12 19:55



Se pueden poner múltiples comandos entre paréntesis y extenderlos en numerosas líneas; algo así 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 noté con caretas (^) que el if a los condicionales les gusta que sigan solo si hay un espacio presente:

if exist ^

10
2017-08-24 11:07



Sin embargo, parece que la división en el medio de los valores de un bucle for no necesita un símbolo de intercalación (y tratar de usar uno se considerará un error de sintaxis). Por ejemplo,

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

Tenga en cuenta que aún no se necesita espacio después de hola o antes de adiós.


7