ss64 escape characters caracter batch batch-file cmd escaping special-characters

batch file - characters - Lote: caracteres especiales de escape automático



escape characters cmd (2)

Por lo que sé, necesito escapar de cada personaje de escape cuando me hago eco de ellos. El método ^ funciona bien para algunos echo . (que debería ser algo así :)

@echo ^| @echo ^> ^>^>

Sin embargo, cuando hay muchos personajes para escapar, el método ^ no funcionará más. Entonces, mi pregunta es:

¿Hay alguna forma de escapar de todos los caracteres especiales sin "spamming" del cursor?


Bueno, no hay necesidad de escapar de los operadores de redirección y otros caracteres especiales enumerados en el último párrafo en la salida de ayuda ejecutando cmd /? en una ventana del símbolo del sistema en la última página de ayuda cuando la cadena a la salida está entre comillas dobles.

Pero el uso de " en línea con el comando ECHO resulta en tener también la salida de comillas dobles".

Hay varias soluciones.

El primero es asignar la cadena a la salida a una variable de entorno y generar el valor de la variable de entorno mediante la expansión diferida.

@echo off setlocal EnableExtensions EnableDelayedExpansion set "Line=pipe = | and percent sign = %% and exclamation mark ^!" echo !Line! set "Line=redirection operators: < and > and >>" echo !Line! endlocal

O un poco más corto, pero no tan bueno:

@echo off setlocal EnableExtensions EnableDelayedExpansion set "Line=pipe = | and percent sign = %% and exclamation mark ^!" & echo !Line! set "Line=redirection operators: < and > and >>" & echo !Line! endlocal

Nota: % y ! Sin embargo, se debe escapar con otro % y con ^ para interpretarlo como un carácter literal en la cadena asignada a la variable de entorno Line .

Otra solución que utiliza una subrutina PrintLine :

@echo off setlocal EnableExtensions DisableDelayedExpansion call :PrintLine "pipe = | and percent sign = %%%% and exclamation mark !" call :PrintLine "redirection operators: < and > and >>" endlocal goto :EOF :PrintLine set "Line=%~1" setlocal EnableDelayedExpansion echo !Line! endlocal goto :EOF

Las desventajas de esta solución son:

  1. Un signo de porcentaje debe definirse con signos de 4 por ciento para finalmente ser impreso como carácter literal.
  2. Es más lento debido al uso de SETLOCAL y ENDLOCAL al imprimir cada línea.

Lea esta respuesta para obtener detalles sobre los comandos SETLOCAL y ENDLOCAL .

Una solución más según el comentario de JosefZ usa el comando FOR para una expansión implícitamente retrasada:

@echo off setlocal EnableExtensions DisableDelayedExpansion for %%I in ( "pipe = | and percent sign = %% and exclamation mark !", "redirection operators: < and > and >>" ) do echo %%~I endlocal

Las líneas a la salida se especifican en una lista separada por comas de cadenas entre comillas dobles para que FOR las procese.

Tiene la gran ventaja de que solo se debe escapar el signo de porcentaje con un signo de porcentaje adicional desactivado en la expansión retrasada. Pero la cadena a la salida no puede contener una comilla doble con la excepción de "" dentro de la cadena.

Gracias JosefZ por esta contribución.

Otras soluciones geniales son proporcionadas por jeb en su respuesta.


Como mencionó Mofi, podría usar variables con expansión retrasada para repetir cualquier contenido.

Hay algunas formas más posibles.

1) Frases que desaparecen

for /F %%^" in ("""") do ( echo %%~"Hello^you echo %%~"Line2 |&<> )

Esto funciona como %~" citará el resto de la línea, pero después de la expansión desaparecerá

2) Cuando desee hacer eco de múltiples líneas, debe leer acerca de las diferentes variantes de heredoc

3) MagicEcho puede mostrar cualquier contenido sin escapar o duplicar signos de porcentaje como

%magicEcho% "^!%path%<>" ^%!%<> ^