Hay métodos que evitan las secuencias de escape ^
.
Puede usar variables con expansión retardada. A continuación se muestra una pequeña demostración de secuencia de comandos
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!
O podría utilizar un ciclo FOR/F.Desde la línea de comandos:
for /f "delims=" %A in ("<html>") do @echo %~A
o desde un archivo 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 retraso en expansión y para la expansión de la variable se producen después de operadores especiales como <
, >
, &
, |
, &&
, ||
se analizan. Ver How does the Windows Command Interpreter (CMD.EXE) parse scripts? para más información.
sin3.14 points out that pipes may require multiple escapes. Por ejemplo:
echo ^^^<html^^^>|findstr .
La razón 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. Vea Why does delayed expansion fail when inside a piped block of code? para una explicación de muchas consecuencias incómodas de la implementación de tuberías de Window.
Hay otro método para evitar escapes múltiples al usar tuberías. Usted puede crear una instancia de forma explícita su propio proceso de CMD, y proteger el single de escape con citas:
cmd /c "echo ^<html^>"|findstr .
Si desea utilizar la técnica de expansión retardada para evitar fugas, entonces hay más sorpresas (Es posible que no se sorprenda si usted es un experto en el diseño de CMD.EXE, pero no hay documentación oficial de MicroSoft que explique esto)
Recuerde que cada lado de la tubería se ejecuta en su propio proceso CMD.EXE, pero el proceso hace no hereda el estado de expansión retardada - por defecto está en OFF. 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 retrasada.
@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 la secuencia de comandos principal del proceso por lotes.
Pero todo se dispara si la expansión retrasada está habilitada en el script principal. A continuación se hace no trabajo:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .
El problema es que !test!
se expande en el guión de los padres, por lo que el nuevo proceso CMD está tratando de analizar sin protección <
y >
.
Puede escapar del !
, pero eso puede ser complicado, ya que depende de si el !
está cotizado o no.
Si no cotizado, a continuación, se requiere el doble de escape:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .
Si citado, a continuación, una sola de escape se utiliza:
@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .
Pero hay un truco sorprendente que evita todos los escapes - encerrando el lado izquierdo de la tubería impide que la secuencia de comandos 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 extra (quizás no deseado) al final cuando se usan paréntesis.
Aint diversión lotes de secuencias de comandos ;-)
¿Qué ocurre con las cotizaciones? – Oskar
Las comillas también se repetirán. – dalle