1

Я пытаюсь написать командный файл, который может генерировать некоторые файлы конфигурации XML, но экранирование знаков <и>, похоже, не работает. В начале моего сценария я написал тест:

SET test=^<foo^>^<bar what="cat"^>^</foo^>
ECHO %test%

Вывод выглядит так:

Z:\mypath>SET test=<foo><bar what="cat"></foo>
< was unexpected at this time.

Z:\mypath>ECHO <foo><bar what="cat"></foo>

Остальная часть сценария не выполняется, так как ни один из последних ECHO не запущен.

Что я делаю неправильно? Как это исправить? Я работаю на Windows 8.1.

2 ответа2

3

Побег работает, за исключением того, что вы убегаете недостаточно часто.

С вашим кодом вы должны дважды выйти: один раз для команды 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
2

Экранирование знака <с помощью ^ не работает в файле .bat

Вы можете обойти это, цитируя все set аргументы:

SET "test=<foo><bar what="cat"></foo>"

Это правильно установит значение test :

F:\test>set test
test=<foo><bar what="cat"></foo>

Вы можете повторить значение test , заключив его в кавычки:

F:\test>echo "%test%"
"<foo><bar what="cat"></foo>"

Если вы выполните эхо- test без кавычек, вы получите ошибку:

F:\test>echo %test%
< was unexpected at this time.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .