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.txt
Esto no funciona porque el intérprete de comandos se confunde con los corchetes angulares. Podría citar toda la cadena así:
echo "some string < with angle > brackets" >>myfile.txt
Pero luego tengo comillas dobles en mi archivo que no quiero.
Escapar de los corchetes ala unix tampoco funciona:
echo some string \< with angle \> brackets >>myfile.txt
Ideas?
Respuestas:
El carácter de escape de Windows es ^, por alguna razón.
fuente
echo some string ^< with angle ^> brackets >>con
resultados en: algunos corchetes <con ángulo> de cadenaEs cierto que el personaje de escape oficial es
^
, pero ten cuidado porque a veces necesitas tres^
personajes. Esto es solo a veces :Un truco de esta tontería es usar un comando que no sea
echo
hacer la salida y citar con comillas dobles:Tenga en cuenta que esto no conservará los espacios iniciales en el texto del mensaje.
fuente
^^^
también son necesarios para escapar de los comandos en la consola de Azure DOS / Kudu.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
O puede usar un bucle FOR / F. Desde la línea de comando:
O desde un script por lotes:
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:
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:
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.
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:
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:
Si se cita, se usa un solo escape:
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: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 ;-)
fuente
Para utilizar caracteres especiales, como '>' en Windows con eco, debe colocar un carácter de escape especial antes.
Por ejemplo
no funcionará ya que '>' tiene que ser escapado por '^':
Consulte también secuencias de escape .
Hay un archivo por lotes corto, que imprime un conjunto básico de caracteres especiales y sus secuencias de escape.
fuente
La barra invertida se consideraría el inicio de un nombre de ruta absoluto.
fuente
echo \
por ejemplo, funciona como se esperaba. - Pero sí, el "\" sería una mala elección para un carácter de escape de la línea de comandos, ya que cada comando / programa que necesitara una ruta o nombre de archivo tendría que escribir `\` en su lugar.También puede utilizar comillas dobles para escapar de los caracteres especiales ...
fuente
echo some string "<" with angle ">" brackets >>con
da como resultado: algunos corchetes de cadena "<" con ángulo ">" pero el OP quiere algunos corchetes de cadena <con ángulo>