Escapar caracteres especiales
¿Alguna vez has escrito algo como echo A & B y has visto que solo se muestra A, seguido de un error que indica que B no se reconoce como comando?
Esto ocurre porque & es un carácter especial que el símbolo del sistema interpreta como separador de comandos.
El mecanismo que permite tratar esos caracteres especiales como caracteres normales se llama escape.
Este artículo explica cómo escapar caracteres especiales en el símbolo del sistema y en archivos por lotes.
¿Qué son los caracteres especiales?
Estos son los principales caracteres que el símbolo del sistema interpreta con un significado especial.
| Carácter | Significado original |
|---|---|
& | Ejecutar varios comandos en secuencia |
| | Pasar la salida del comando izquierdo al comando derecho |
< | Leer la entrada desde un archivo |
> | Escribir la salida en un archivo |
( ) | Agrupar comandos en un bloque |
^ | Carácter de escape (trata el siguiente carácter literalmente) |
% | Expandir variables y argumentos del archivo por lotes |
! | Expandir variables cuando la expansión retardada está activa |
Cuando quieres usar estos caracteres como texto normal, necesitas escaparlos.
Escapar con el acento circunflejo (^)
El carácter de escape del símbolo del sistema es el acento circunflejo (^).
Si colocas ^ justo antes de un carácter especial, este pierde su significado especial y se trata como un carácter normal.
^carácter-especial
Ejemplos
Este ejemplo muestra con echo una cadena que contiene &.
> y | funcionan igual. Añade ^ para mostrarlos.

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超 入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
Sin ^, todo lo que sigue a > se trata como nombre de archivo y la salida va a un archivo en lugar de a la pantalla.
Si ejecutas echo 1 > 0 sin ^, se crea un archivo llamado 0. Comprueba que no se hayan creado archivos no deseados.
Mostrar el propio ^
^ es en sí mismo el carácter de escape, así que para mostrarlo escríbelo dos veces: ^^.
Escapar % (%%)
% no se puede escapar con ^.
Para usar % como carácter literal en un archivo por lotes, escríbelo dos veces: %%.
@echo off
echo Progress: 50%%
echo Remainder: 7 %% 3
Al ejecutarlo se muestra Progress: 50% y Remainder: 7 % 3.
Lo mismo se aplica cuando calculas un resto con set /a: escribe %% dentro de un archivo por lotes.
@echo off
set /a REMAINDER=7 %% 3
echo %REMAINDER%
Al ejecutar este archivo por lotes se muestra 1.
Solo es necesario duplicar % dentro de archivos por lotes. Al escribir directamente en el símbolo del sistema, usa un solo %, como en echo 50%. Del mismo modo, la variable de bucle del comando for se escribe %%a en un archivo por lotes y %a al escribirla directamente.
Encerrar entre comillas dobles
&, |, <, >, ( y ) pierden su significado especial cuando se encierran entre comillas dobles (").
"cadena con caracteres especiales"
Ejemplos
Este ejemplo trabaja con un archivo cuyo nombre contiene &. No necesitas ^; basta con encerrar todo el nombre entre ".
Ten en cuenta que, si pasas a echo una cadena entre comillas dobles, también se muestran las propias ".
Dentro de comillas dobles, ^ no es un carácter de escape, sino un carácter normal. Por eso, escribir "A ^& B" también muestra el ^. Por otro lado, la expansión de variables con % sigue ocurriendo dentro de las comillas dobles, así que en un archivo por lotes debes seguir escribiendo %%. Además, cuando la expansión retardada está activa, ! también se expande dentro de las comillas dobles.
Asignar valores con caracteres especiales usando set
Al asignar a una variable con set un valor que contiene caracteres especiales, lo más seguro es encerrar todo "nombre=valor" entre comillas dobles.
Sin ellas, todo lo que sigue a & se ejecuta como un comando aparte.
@echo off
rem Mal: todo lo que sigue a & se ejecuta como un comando aparte
set TITLE=Tom & Jerry
rem Bien: encerrar toda la asignación entre "
set "TITLE=Tom & Jerry"
echo "%TITLE%"
Con el ejemplo correcto, Tom & Jerry se asigna correctamente a la variable TITLE.
Si expandes la variable sin comillas, como en echo %TITLE%, el & de echo Tom & Jerry ya expandido vuelve a interpretarse como separador. Enciérrala entre ", como en echo "%TITLE%" (las " también se muestran).
Esta forma también evita que se cuelen espacios finales no deseados en el valor.
Escapar ) dentro de un bloque
Si muestras una cadena que contiene ) dentro de los ( ) de un if o un for, el ) se interpreta como el final del bloque.
@echo off
if exist "C:\Windows" (
echo Encontrado ^(carpeta Windows^)
)
Como se ve arriba, escapa como ^) el ) que uses como carácter literal dentro de un bloque.
Ten especial cuidado al expandir una variable de entorno como %ProgramFiles(x86)%. Como %...% se expande antes de analizar el bloque, el ) de C:\Program Files (x86) ya expandido cierra el bloque, por lo que el primer ejemplo siguiente provoca un error. No se puede añadir ^ al resultado de una expansión de variable, así que enciérralo entre " como en el segundo ejemplo. La expansión retardada (!ProgramFiles(x86)!) también funciona.
@echo off
if 1==1 (
echo %ProgramFiles(x86)%
)
if 1==1 (
echo "%ProgramFiles(x86)%"
)
Ten en cuenta que ( no causa problemas en medio de un bloque, por lo que solo ) necesita escape.
Continuar un comando largo con ^ al final de la línea
Un ^ al final de una línea hace que la siguiente línea sea la continuación de esa línea.
Es útil para dividir comandos largos y mantenerlos legibles.
@echo off
robocopy C:\Source C:\Backup ^
/E ^
/R:3 ^
/W:5
Si hay un espacio después de ^, se escapa el espacio en lugar del salto de línea y la continuación no funciona. Asegúrate de que ^ sea siempre el último carácter de la línea.
Escapar dentro de for /f y cmd /c
Dentro del in ('...') de for /f, o en un comando pasado a cmd /c, el comando es reinterpretado por otro cmd.
Por ello, escapa con ^ las tuberías y redirecciones para que lleguen al comando interno. Ten en cuenta que, cuando encierras todo el comando entre ", como en cmd /c "tasklist | find /i notepad", no se necesita ^.
@echo off
for /f "tokens=*" %%a in ('tasklist ^| find "notepad.exe"') do (
echo %%a
)
Al escribir ^|, el | actúa como tubería entre tasklist y find, en lugar de ser interpretado por el comando for externo.
Resumen de los métodos de escape
| Carácter que se quiere mostrar | Sintaxis normal | Entre comillas dobles |
|---|---|---|
& | < > | ^& ^| ^< ^> | Se escribe tal cual |
( ) | ^( ^) | Se escribe tal cual |
^ | ^^ | Se escribe tal cual |
% (archivo por lotes) | %% | %% |
! (expansión retardada activa) | ^^! | ^! |
" | ^" (solo fuera de comillas) (*) | No se puede escapar |
* Fuera de las comillas dobles, " puede tratarse literalmente con ^", pero dentro de ellas ^ es un carácter normal, por lo que no se puede escapar. Para pasar un " a un programa, muchos programas esperan \", pero el propio cmd ignora \ y trata la " como apertura o cierre de una sección entre comillas, así que un & posterior y caracteres similares aún pueden ejecutarse como caracteres especiales.
Ejercicios
Resumen
- Los caracteres especiales (
&|<>()) se escapan colocando^justo antes - Escribe el propio
^como^^y%dentro de un archivo por lotes como%% - Al encerrar el texto entre comillas dobles,
&,|y similares se usan tal cual (pero^pasa a ser literal y%se sigue expandiendo) - Para asignar con
setun valor con caracteres especiales, usa la formaset "nombre=valor" - Un
^al final de la línea permite dividir un comando largo en varias líneas