Hay métodos que evitan las ^secuencias de escape.
Puede utilizar variables con expansión retardada. A continuación se muestra una pequeña demostración de secuencia de comandos por lotes
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!
O puede usar un bucle FOR / F. Desde la línea de comando:
for /f "delims=" %A in ("<html>") do @echo %~A
O desde un script por lotes:
@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A
La razón de que estos métodos de trabajo se debe a que tanto la expansión retardada y para la expansión de la variable se producen después de operadores especiales como <, >, &, |, &&, ||se analizan. Consulte ¿Cómo analiza el intérprete de comandos de Windows (CMD.EXE) las secuencias de comandos? para más información.
sin3.14 señala que las tuberías pueden requerir múltiples escapes . Por ejemplo:
echo ^^^<html^^^>|findstr .
La razón por la que las tuberías requieren múltiples escapes es porque cada lado de la tubería se ejecuta en un nuevo proceso de CMD, por lo que la línea se analiza varias veces. Consulte ¿Por qué falla la expansión retrasada cuando está dentro de un bloque de código canalizado? para obtener una explicación de muchas consecuencias incómodas de la implementación de la tubería de Windows.
Existe otro método para evitar múltiples fugas al utilizar tuberías. Puede crear una instancia explícita de su propio proceso de CMD y proteger el escape único con comillas:
cmd /c "echo ^<html^>"|findstr .
Si desea utilizar la técnica de expansión retardada para evitar fugas, entonces hay aún más sorpresas (es posible que no se sorprenda si es un experto en el diseño de CMD.EXE, pero no hay documentación oficial de MicroSoft que explique estas cosas)
Recuerde que cada lado de la tubería se ejecuta en su propio proceso CMD.EXE, pero el proceso no hereda el estado de expansión retardada, por defecto está APAGADO. Por lo tanto, debe crear una instancia explícita de su propio proceso CMD.EXE y usar la opción / V: ON para habilitar la expansión retardada.
@echo off
setlocal disableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo !test!|findstr .
Tenga en cuenta que la expansión retrasada está DESACTIVADA en el script de lote principal.
Pero todo el infierno se desata si se habilita la expansión retardada en el script principal. Lo siguiente no funciona:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .
El problema es que !test!está expandido en el script principal, por lo que el nuevo proceso CMD está tratando de analizar archivos desprotegidos <y >.
Podría escapar del !, pero eso puede ser complicado, porque depende de si !se cotiza o no.
Si no se cita, se requiere doble escape:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .
Si se cita, se usa un solo escape:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .
Pero hay un truco sorprendente que evita todos los escapes: encerrar el lado izquierdo de la tubería evita que el script principal se expanda !test!prematuramente:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
(cmd /v:on /c echo !test!)|findstr .
Pero supongo que incluso eso no es un almuerzo gratis, porque el analizador de lotes introduce un espacio adicional (quizás no deseado) al final cuando se usan paréntesis.
No es divertido escribir secuencias de comandos por lotes ;-)