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:
- Un signo de porcentaje debe definirse con signos de 4 por ciento para finalmente ser impreso como carácter literal.
- 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%<>" ^%!%<> ^