está bastante bueno, eso si podrías añadir la coma.
Y siempre asignar con las comillas, mira lo que pasa con la variable z por no encerrarla: con el texto: &calc
@echo off
setlocal enabledelayedexpansion enableextensions
:prompt
set "t="
set /p t=Texto:
if not defined t (goto :prompt)
for %%a in ("^","&","<",">","|",",") do (set "t=!t:%%~a=^%%~a!")
if not defined t (goto :prompt)
set "v=%t%"
set z=%t%
echo.t=%t%
echo.v=%v%
echo.z=%z%
goto :prompt
Es decir, tu filtro está muy bueno, pero debes indicar esto de las asignaciones para que no haya problemas.
Pero, aún da problemas por ejemplo en un if:
setlocal enabledelayedexpansion enableextensions
:prompt
set "t="
set /p t=Texto:
if not defined t (goto :prompt)
for %%a in ("^","&","<",">","|",",") do (set "t=!t:%%~a=^%%~a!")
if not defined t (goto :prompt)
if "%t%"=="texto" (echo.Escribio texto)
goto :prompt
si escribes una comilla, se produce un error.
Para el uso que le estás dando, es un buen filtro, pero si utilizas las variables para otras cosas, como dentro de un if, no es un filtro completo.
En todo caso este tema ya está solucionado, básicamente usando expansión retardada en la mayoría de los casos no necesitas escapar ningún carácter.
Mira, como queda así:
@echo off
:: Mini calculadora creada por xassiz para explicar el uso
:: de un pequeño filtro de variables.
setlocal enabledelayedexpansion
:ini
cls&echo.
set "op="&set/p "op= Escribe tu operacion: "
set/a "res=!op!"
cls&echo.
echo. Operacion: !op!&echo. Resultado: !res!
pause>nul
goto:ini
Te recomiendo leas el artículo de las inyecciones batch, ahí expliqué prácticamente todo.
http://foro.elhacker.net/scripting/inyecciones_batch-t263688.0.html