it-swarm-es.tech

Dividir los comandos largos en varias líneas a través del archivo por lotes de Windows

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

634
Dan

Puede dividir las líneas largas con el ^ de caret, siempre y cuando recuerde que el caret y la nueva línea que lo sigue están completamente eliminados. Por lo tanto, si debe haber un espacio donde se está rompiendo la línea, incluya un espacio. ( Más sobre eso a continuación. )

Ejemplo:

copy file1.txt file2.txt

se escribiría como:

copy file1.txt^
 file2.txt
795
Wayne

La regla para el caret es:

Una careta al final de la línea, agrega la siguiente línea, se escapará el primer carácter de la línea adjunta.

Puede usar el cursor varias veces, pero la línea completa no debe exceder la longitud de línea máxima 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 caret. Pero existe una curiosidad con la redirección antes del caret.

Si coloca un token en el caret, el token 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 incrustar feeds de línea en la cadena:

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 solo con la expansión demorada; de lo contrario, el resto de la línea se ignorará después del salto de línea.

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

239
jeb

(Esto es básicamente una reescritura de la respuesta de Wayne pero con la confusión en torno al cursor). Así que lo publiqué como un CW. No soy tímido para editar respuestas, pero completamente reescribirlos parece inapropiado.)

Puede dividir las líneas largas con el símbolo de intercalación (^), solo recuerde que el símbolo de intercalación y la nueva línea que lo sigue se eliminan por completo del comando, por lo que si lo coloca donde sea necesario un espacio como entre los parámetros), asegúrese de incluir el espacio también (ya sea 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

(Lo último funciona porque no hay espacios entre xc y ^, y no hay espacios al comienzo de la siguiente línea. Entonces, cuando elimine ^ y la nueva línea, obtendrá ...xcopy.)

Para facilitar la lectura y la cordura, probablemente sea mejor romper solo entre parámetros (asegúrese de incluir el espacio).

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

59
T.J. Crowder

Se pueden poner varios comandos entre paréntesis y repartirlos en numerosas líneas; Así que 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 noté con carets (^) que a los condicionales if les gustaba que los siguieran solo si había un espacio presente:

if exist ^
13
Todd Partridge

Sin embargo, parece que dividir en medio de los valores de un bucle for no necesita un carácter de intercalación (y tratar de usar uno en realidad será considerado un error de sintaxis). Por ejemplo,

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

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

8
Mohammed Safwat