Побег работает, за исключением того, что вы убегаете недостаточно часто.
С вашим кодом вы должны дважды выйти: один раз для команды SET, и второй раз для ECHO. Код для набора имеет двойной выход. После выполнения значение test будет содержать одиночные экранированные значения, чтобы ECHO работал правильно.
SET test=^^<foo^^>^^<bar what="cat"^^>^^</foo^^>
ECHO %test%
Вы можете обойтись с одиночными escape-символами, если вы напрямую измените значение ECHO:
ECHO test=^<foo^>^<bar what="cat"^>^</foo^>
Или если вы используете отложенное расширение:
setlocal enableDelayedExpansion
SET test=^<foo^>^<bar what="cat"^>^</foo^>
ECHO !test!
Вы можете исключить все экранированные символы, если заключите это в кавычки:
setlocal enableDelayedExpansion
SET "test=<foo><bar what="cat"></foo>"
ECHO !test!
Помните, что в приведенном выше примере "кот" больше не указывается в кавычках, поэтому вам придется избегать любых ядовитых символов, которые могут там появиться.
Если вам нужно написать много текста, возможно, стоит воспользоваться моей утилитой PrintHere.bat, которая эмулирует функцию документа unix here. Предполагая, что у вас есть PrintHere.bat в папке, которая появляется в вашем PATH, вы можете использовать:
call PrintHere :test
<foo><bar what="cat"></foo>
:test