run make how example create commands batch bat batch-file

batch-file - example - how to make a batch file



¿Cómo dividir la línea entre comillas dobles en varias líneas en el archivo por lotes de Windows? (3)

Hoy ideé mi propio método para esto y nunca lo había visto sugerido, así que pensé en publicarlo aquí. Ciertamente, no es elegante en un sentido objetivo. Yo diría que tiene su propio tipo de fealdad y algunas limitaciones, pero me parece mucho más "ergonómico" en comparación con las alternativas.

Específicamente, este método tiene la característica única de no tener que escapar de nada, mientras sigue realizando una sustitución de variable típica. Esto me permite tomar una cadena que se ve exactamente como la quiero, distribuirla entre varias líneas y agregar un prefijo a cada línea sin cambiar nada más en la cadena. Por lo tanto, no se necesita prueba y error para descubrir cómo podrían interactuar los personajes especiales y los personajes de escape. En general, creo que reduce la carga cognitiva necesaria para producir determinísticamente una variable de cadena complicada en múltiples líneas, lo cual es bueno para mí porque no quiero tener que pensar mucho y frustrarme con la complejidad incidental, como los matices del comando de Windows. Interprete. Además, se puede usar una técnica similar en linux bash, haciéndola algo portátil.

Nota: No lo he probado a fondo, puede que no funcione en algunos casos de uso, no lo sé. Sin embargo, el ejemplo tiene un buen número de personajes aparentemente problemáticos y funciona, por lo que parece algo robusto.

set IMAGE_NAME=android-arm64 set CMD=docker run --rm set CMD=%CMD% --platform=linux set CMD=%CMD% -v %CD%:/work set CMD=%CMD% dockcross/%IMAGE_NAME% set CMD=%CMD% /bin/sh -c set CMD=%CMD% "mkdir build-%IMAGE_NAME% && set CMD=%CMD% cd build-%IMAGE_NAME% && set CMD=%CMD% cmake .. && set CMD=%CMD% cmake --build ." echo %CMD%

En mi caso, es un comando, así que puedo ejecutarlo con:

%CMD%

Estaría abierto a cualquier comentario o sugerencia sobre este método. Tal vez incluso se puede mejorar.

Los comandos largos en archivos por lotes de Windows se pueden dividir en varias líneas utilizando ^ como se menciona en Comandos largos divididos en varias líneas en el archivo por lotes de Windows Vista (.bat) .

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 que split es un comando desconocido.

¿Hay alguna forma de evitar esto?


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^"

Todos los caracteres especiales que aparecen en la línea también deben ser escapados ya que ya no se cotizan 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 escapa al primer personaje 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 ^^ ^ & ^| ^> ^< ^"


Veo tres posibles soluciones.

1) Construir la línea combinando 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) Dejar 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 en cada línea es importante, porque el símbolo de intercalación funciona como un carácter de línea múltiple pero también escapa al primer carácter, por lo que también se escapó una cita.
Así que reemplazo el "#" sin escrúpulos después de construir la línea.

EDITAR Añadido: 3) Frases de desaparición

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

En mi opinión, esta es la mejor manera, funciona ya que el analizador primero ve las comillas y, por lo tanto, la última referencia funcionará, ya que parece estar fuera de las comillas.
Pero esta expresión !"=! Expandirá la variable llamada "= , pero ese 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 escaparán de las comillas, independientemente de 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 puede usar un -FOR-Loop como

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