2008-10-30 11 views
77

Necesito hacer eco de una cadena que contiene corchetes angulares (< y>) en un archivo en una máquina con Windows. Básicamente lo que quiero hacer es lo siguiente:
echo some string < with angle > brackets >>myfile.txtSoportes de ángulo de escape en un símbolo del sistema de Windows

Esto no funciona ya que el intérprete de comandos se confunde con los corchetes angulares. Podría citar toda la cadena de esta manera:
echo "some string < with angle > brackets" >>myfile.txt

Pero luego tengo comillas dobles en mi archivo que no quiero.

Escapar de los soportes de ala UNIX no funciona bien:
echo some string \< with angle \> brackets >>myfile.txt

ideas?

+0

¿Qué ocurre con las cotizaciones? – Oskar

+3

Las comillas también se repetirán. – dalle

Respuesta

138

El carácter de escape de Windows es ^, por alguna razón.

echo some string ^< with angle ^> brackets >>myfile.txt 
+8

Bueno, la barra diagonal inversa se usa para nombres de ruta y la comilla doble es para envolver el nombre de archivo que tiene espacios, por lo que no quedan muchas opciones de caracteres. –

+0

Esto también funciona para otros personajes como ampersand (&), gracias. – tenfour

+2

¡Funciona muy bien! 'echo alguna cadena^ paréntesis >> con' resultados en: _alguna cadena paréntesis_ –

0

Escapar de los soportes de ala UNIX no trabajo ya sea:

eco de alguna cadena \ < con ángulo \> soportes >> MyFile.txt

La barra invertida haría ser considerado el comienzo de una ruta de acceso absoluta.

+2

Nombre de ruta absoluta relativo a la letra de unidad actual ...;) – dalle

+0

Una barra invertida no se considera el inicio de un nombre de ruta absoluto dentro del texto para un comando de eco; es texto simple que se canaliza donde sea que lo envíe. - 'echo \' por ejemplo funciona como se espera. - Pero sí, la "\" sería una mala elección para un personaje de escape de línea de comandos, ya que cada comando/programa que necesitara una ruta o nombre de archivo tendría que escribir '\\' en su lugar. – BrainSlugs83

+0

esta respuesta no ofrece una solución a la pregunta, ciertamente vaga, –

-2

También puede utilizar comillas dobles para escapar caracteres especiales ...

echo some string "<" with angle ">" brackets >>myfile.txt 
+3

Eso no funciona. 'echo algo de cadena" <"con ángulo"> "paréntesis >> con' resultados en: _alguna cadena" <"con ángulo"> "paréntesis_ pero el OP quiere _alguna cadena paréntesis_ –

23

Es cierto que el carácter oficial de escape es ^, pero tenga cuidado, porque a veces se necesita tres^ caracteres. Esto es sólo veces:

C:\WINDOWS> echo ^<html^> 
<html> 

C:\WINDOWS> echo ^<html^> | sort 
The syntax of the command is incorrect. 

C:\WINDOWS> echo ^^^<html^^^> | sort 
<html> 

C:\WINDOWS> echo ^^^<html^^^> 
^<html^> 

Un truco de este disparate es usar un comando que no sea echo hacer la salida y la cita entre comillas dobles:

C:\WINDOWS> set/p _="<html>" <nul 
<html> 
C:\WINDOWS> set/p _="<html>" <nul | sort 
<html> 

Tenga en cuenta que esto no se preservar los espacios iniciales en el texto del mensaje.

+0

Gracias. Eso no es obvio – user1167442

+1

Consulte la segunda parte de [mi respuesta] (http://stackoverflow.com/a/26041395/1012053) para obtener una explicación de por qué las tuberías requieren escapes múltiples. – dbenham

+0

Los tres '^^^' también son necesarios para escapar de los comandos en la consola de Azure DOS/Kudu. – lionello

5

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 ;-)

1

Para utilizar caracteres especiales, como '>' en Windows con eco, es necesario colocar un carácter especial de escape antes de ella.

Por ejemplo

echo A->B 

habrá ningún trabajo desde '>' tiene que ser escritos mediante un '^':

echo A-^>B 

Ver también escape sequences. enter image description here

Hay un pequeño archivo por lotes, que imprime un conjunto básico de caracteres especiales y sus secuencias de escape.

+1

Actualizada la respuesta – orbitcowboy

Cuestiones relacionadas