используя пакетное эхо со специальными символами - PullRequest
59 голосов
/ 05 сентября 2011

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

echo <?xml version="1.0" encoding="utf-8" ?> > myfile.xml

есть ли способ дать подсказку пакетному анализатору не интерпретировать специальную строку? Я использовал двойные кавычки, но он также записывает их в файл! Файл должен выглядеть так после echo:

<?xml version="1.0" encoding="utf-8" ?>

Ответы [ 7 ]

90 голосов
/ 05 сентября 2011

Вы можете экранировать метасимволы оболочки с помощью ^:

echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml

Обратите внимание, что, поскольку echo является встроенной оболочкой, она не следует обычным соглашениям относительно цитирования, поэтому просто цитируйте аргументбудет выводить кавычки вместо их удаления.

18 голосов
/ 23 ноября 2015

Чтобы использовать специальные символы, такие как «>» в ​​Windows, с эхом, вам нужно поместить специальный escape-символ перед ним.

Например,

echo A->B

не будет работать, так как '>' должно быть экранировано '^':

 echo A-^>B

См. Также escape-последовательности .enter image description here

Существует короткий пакетный файл, который печатает базовый набор специальных символов и их escape-последовательности.

18 голосов
/ 05 сентября 2011

другой метод:

@echo off

for /f "useback delims=" %%_ in (%0) do (
  if "%%_"=="___ATAD___" set $=
  if defined $ echo(%%_
  if "%%_"=="___DATA___" set $=1
)
pause
goto :eof

___DATA___
<?xml version="1.0" encoding="utf-8" ?>
 <root>
   <data id="1">
      hello world
   </data>
 </root>
___ATAD___


rem # 
rem # 
16 голосов
/ 05 сентября 2011

Одним из простых решений является использование отложенного расширения, поскольку оно не меняет никаких специальных символов.

set "line=<?xml version="1.0" encoding="utf-8" ?>"
setlocal EnableDelayedExpansion
(
  echo !line!
) > myfile.xml

РЕДАКТИРОВАТЬ: Другое решение состоит в том, чтобы использовать исчезающую кавычку .

Эта техника использует кавычки для цитирования специальных символов

@echo off
setlocal EnableDelayedExpansion
set ""="
echo !"!<?xml version="1.0" encoding="utf-8" ?>

Трюк работает, так как в фазе специальных символов начальная кавычка в !"! сохранит оставшуюся часть строки (если других кавычек нет).
И в отложеннойВ фазе расширения !"! будет заменено содержимым переменной " (одиночная кавычка является допустимым именем!).

Если вы работаете с отключенным отложенным расширением, вы можете использовать FOR /Fцикл вместо

for /f %%^" in ("""") do echo(%%~" <?xml version="1.0" encoding="utf-8" ?>

Но так как это немного раздражает, вы также можете создать макрос.

set "print=for /f %%^" in ("""") do echo(%%~""

%print%<?xml version="1.0" encoding="utf-8" ?>
%print% Special characters like &|<>^ works now without escaping
10 голосов
/ 05 сентября 2011

Способ вывода символа > заключается в добавлении к нему ^ escape-символа:

echo ^>

напечатает просто

>
2 голосов
/ 27 марта 2014

Ответ от Джои не работал для меня. После выполнения

  echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml

Я получил эту ошибку bash: синтаксическая ошибка рядом с неожиданным токеном `> '

Это решение сработало для меня:

 echo "<?xml version=\"1.0\" encoding=\"utf-8\">" > myfile.txt

Смотри также http://www.robvanderwoude.com/escapechars.php

0 голосов
/ 05 февраля 2018

Почему бы не использовать одинарные кавычки?

echo '<?xml version="1.0" encoding="utf-8" ?>'

output

<?xml version="1.0" encoding="utf-8" ?>
...