Мне нужно вывести строку, содержащую угловые скобки (<и>), в файл на компьютере с Windows. В основном я хочу сделать следующее:
echo some string < with angle > brackets >>myfile.txt
Это не работает, поскольку интерпретатор команд путается с угловыми скобками. Я мог бы процитировать всю строку так:
echo "some string < with angle > brackets" >>myfile.txt
Но тогда в моем файле есть двойные кавычки, которые мне не нужны.
Экранирование скобок ala unix тоже не работает:
echo some string \< with angle \> brackets >>myfile.txt
Идеи?
Ответы:
По какой-то причине escape-символ Windows - ^.
источник
echo some string ^< with angle ^> brackets >>con
приводит к: некоторые строковые скобки <с углом>Правда, официальный escape-символ есть
^
, но будьте осторожны, потому что иногда вам нужно три^
символа. Это просто иногда :Один из трюков из этой ерунды - использовать команду,
echo
отличную от вывода и заключения в двойные кавычки:Обратите внимание, что это не сохранит начальные пробелы в тексте подсказки.
источник
^^^
также необходимы для экранирования команд в консоли Azure DOS / Kudu.Есть методы, позволяющие избежать
^
escape-последовательностей.Вы можете использовать переменные с отложенным расширением. Ниже представлена небольшая демонстрация пакетного сценария.
Или вы можете использовать цикл FOR / F. Из командной строки:
Или из пакетного скрипта:
Причина этих методы работа , потому что оба отсроченное расширение и для расширения переменного происходит после специальных операторов , такие как
<
,>
,&
,|
,&&
,||
обрабатывается. См. Как интерпретатор команд Windows (CMD.EXE) анализирует сценарии? для получения дополнительной информации.sin3.14 указывает, что для каналов может потребоваться несколько экранирований . Например:
Причина, по которой для каналов требуется несколько экранирований, заключается в том, что каждая сторона канала выполняется в новом процессе CMD, поэтому строка анализируется несколько раз. См. Почему не удается отложенное расширение внутри блока кода, передаваемого по конвейеру? для объяснения многих неудобных последствий реализации канала Window.
Есть еще один способ избежать многократных выходов при использовании каналов. Вы можете явно создать экземпляр своего собственного процесса CMD и защитить одиночный escape-код кавычками:
Если вы хотите использовать технику отложенного расширения, чтобы избежать побега, тогда есть еще больше сюрпризов (вы можете не удивиться, если вы эксперт по дизайну CMD.EXE, но нет официальной документации MicroSoft, объясняющей этот материал)
Помните, что каждая сторона конвейера выполняется в своем собственном процессе CMD.EXE, но процесс не наследует состояние отложенного раскрытия - по умолчанию оно выключено. Таким образом, вы должны явно создать экземпляр своего собственного процесса CMD.EXE и использовать параметр / V: ON, чтобы включить отложенное расширение.
Обратите внимание, что отложенное расширение отключено в родительском пакетном сценарии.
Но ад вырвется наружу, если в родительском скрипте включено отложенное расширение. Следующее не работает:
Проблема в том, что
!test!
это расширено в родительском скрипте, поэтому новый процесс CMD пытается проанализировать незащищенные<
и>
.Вы можете избежать
!
, но это может быть сложно, потому что это зависит от того,!
цитируется или нет.Если не кавычки, то требуется двойной escape:
В кавычках используется единственный escape-код:
Но есть удивительный трюк, который позволяет избежать всех экранирований - включение левой части канала предотвращает
!test!
преждевременное расширение родительского скрипта :Но я полагаю, что даже это не бесплатный обед, потому что пакетный синтаксический анализатор вводит дополнительное (возможно, нежелательное) пространство в конце, когда используются круглые скобки.
Не весело писать сценарии ;-)
источник
Чтобы использовать специальные символы, такие как '>' в Windows с эхо, вам необходимо поместить перед ним специальный escape-символ.
Например
не будет работать, так как '>' должно быть экранировано '^':
См. Также escape-последовательности .
Существует небольшой командный файл, который печатает базовый набор специальных символов и их управляющих последовательностей.
источник
Обратная косая черта будет считаться началом абсолютного пути.
источник
echo \
например работает как положено. - Но да, "\" было бы плохим выбором для escape-символа командной строки, так как для каждой команды / программы, которым нужен путь или имя файла, вам придется вместо этого набирать `\`.Вы также можете использовать двойные кавычки для экранирования специальных символов ...
источник
echo some string "<" with angle ">" brackets >>con
приводит к: некоторые строковые скобки "<" с углом ">", но OP хочет некоторые строковые скобки <с углом>