sirven que programacion por para lotes los ejemplos crear copiar como codigo carpetas batch bat archivos archivo abrir batch-file parentheses

batch file - que - Escapar de paréntesis entre paréntesis para archivo por lotes



para que sirven los archivos batch (4)

El triple caret no funciona en todas las situaciones. toma lo siguiente:

IF EXIST file.txt ( ECHO ...OK ) ELSE ( ECHO TEST THIS: (SOME WORDING! ^^^) > file.txt )

Los contenidos de file.txt son:

TEST THIS: (SOME WORDING! ^)

Esto es lo que estoy tratando de hacer:

( @echo This is some code that is @echo Important to echo exactly as-is @echo Even if I use parenthesis @echo for something (like this) )|clip

Así que habiendo copiado eso en el portapapeles. He probado lo siguiente:

( @echo This is some code that is @echo Important to echo exactly as-is @echo Even if I use parenthesis @echo for something ^(like this^) )|clip

Pero esto parece afectar mis paréntesis DESEADOS también porque recibo un error. Para probar esto, simplemente hice:

( @echo This is some code that is @echo Important to echo exactly as-is @echo Even if I use parenthesis @echo for something ^(like this^) FFF )|clip

¡Oye! Esto casi funciona, el texto se copia hasta la "s" en "esto". No copia los últimos paréntesis, o obviamente las F''s. ¿Algunas ideas?


Es obvio que necesitas tres caretas allí :-)

( @echo This is some code that is @echo Important to echo exactly as-is @echo Even if I use parenthesis @echo for something (like this^^^) )|clip

¿Por qué? Eso es un poco complicado ...

Primero, el analizador analiza el bloque y escapa de la parte ( this^^^) a this^) , el paréntesis se escapó aquí la primera vez.

Pero a medida que usa una tubería, el bloque completo se traducirá y transferirá a una nueva instancia de cmd.exe.
C:/Windows/system32/cmd.exe /S /D /c" ( @ echo This is some code is ... & @ echo for something (like this^) )"

Y en la nueva instancia es necesario escapar nuevamente del paréntesis de cierre.
¡Eso es todo!

Y para más información puedes leer una pregunta similar.
SO: ¿por qué falla la expansión retrasada cuando está dentro de un bloque de código canalizado?


Mi solución cuando necesito usar un paréntesis de cierre en mis ecos encapsulados es crear una variable llamada% endPar% al comienzo de mi script, algo como esto:

@set "endPar=)" @echo This is some code that is>tmp @echo Important to echo exactly as-is>>tmp @echo Even if I use parenthesis>>tmp @echo for something (like this%endPar%>>tmp @type tmp|clip @del tmp

Lo cambié un poco, y lo probé dos veces.

El código simplemente envía los ecos a un archivo llamado tmp, luego canaliza el contenido del archivo para recortarlo y está listo para que lo pegue donde quiera.


Si se confunde con el recuento de caracteres, recuerde que siempre es una potencia de 2 menos 1 . Como alternativa, recuerde que la primera vez que agregue 2, la segunda vez 4, la tercera vez 8, ...

Por ejemplo, (probado en XP)

( for /f "tokens=* delims=" %%S in ( ''echo X^^^^^^^^^^^^^^^& ^^^^^^^^^^^^^^^| ^^^| find " "'' ) do @echo %%S ) | find "X"

La instrucción echo se lee primero normalmente cuando DOS analiza el archivo por lotes (1), segundo porque es un comando interno canalizado (DOS parece querer programas en canalizaciones, y los comandos internos no son programas) (3), tercero porque está en una lista de palabras dirigida por comando ''para / f'' (ver para /?) (7), y una cuarta vez por razones ya dadas en este hilo (15).

También puedo tener en cuenta que personalmente, considero que es una codificación descuidada el dejar el escape correcto de los caracteres calientes lejos porque el DOS ignora el escape que falta en ese caso en particular. Entonces, si quisiera repetir un par de paréntesis literal en el ejemplo anterior, le daría a cada uno 15 caretas, incluso si el paréntesis de apertura no lo necesita. Entonces, cualquiera que lea mi código no tiene que preguntarse por qué se cita un paréntesis y el otro no. Y cómo modificar la cotización bajo modificación de código.