Скобки для скобок в командной строке Windows

Мне нужно эхо-строку, содержащую угловые скобки (< и > ) в файл на машине 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

Идеи?

Ответ 1

По какой-то причине escape-символ Windows является ^.

echo some string ^< with angle ^> brackets >>myfile.txt

Ответ 2

Правда, официальный escape-символ ^, но будьте осторожны, потому что иногда вам нужны символы three ^. Это просто иногда:

C:\WINDOWS> echo ^<html^>
<html>

C:\WINDOWS> echo ^<html^> | sort
The syntax of the command is incorrect.

C:\WINDOWS> echo ^^^<html^^^> | sort
<html>

C:\WINDOWS> echo ^^^<html^^^>
^<html^>

Один трюк из этой глупости заключается в использовании команды, отличной от echo, для выполнения вывода и цитирования с двойными кавычками:

C:\WINDOWS> set/p _="<html>" <nul
<html>
C:\WINDOWS> set/p _="<html>" <nul | sort
<html>

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

Ответ 3

Существуют методы, которые избегают escape-последовательностей ^.

Вы можете использовать переменные с задержкой расширения. Ниже представлена ​​небольшая демонстрация script

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!

Или вы можете использовать цикл FOR/F. Из командной строки:

for /f "delims=" %A in ("<html>") do @echo %~A

Или из пакета script:

@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A

Причина, по которой эти методы работают, заключается в том, что как замедленное расширение, так и расширение переменной FOR происходят после того, как анализируются специальные операторы типа <, >, &, |, &&, ||. См. Как интерпретировать скрипт командной строки Windows (CMD.EXE) для получения дополнительной информации.


sin3.14 указывает, что для труб может потребоваться несколько экранов. Например:

echo ^^^<html^^^>|findstr .

Причина, по которой требуются несколько экранов, заключается в том, что каждая сторона канала выполняется в новом CMD-процессе, поэтому линия обрабатывается несколько раз. См. Почему задержка с расширением заканчивается, когда внутри блок кода кода? объясняется много неудобных последствий реализации окна.

Существует еще один способ избежать множественных экранов при использовании труб. Вы можете явно создать свой собственный CMD-процесс и защитить одиночный побег с помощью кавычек:

cmd /c "echo ^<html^>"|findstr .

Если вы хотите использовать технику замедленного расширения, чтобы избежать побегов, то есть еще больше сюрпризов (вы можете не удивляться, если вы являетесь экспертом по дизайну CMD.EXE, но нет официальной документации MicroSoft, которая объясняет этот материал)

Помните, что каждая сторона канала выполняется в своем собственном процессе CMD.EXE, но процесс не наследует состояние с задержкой расширения - по умолчанию он отключен. Поэтому вы должны явно создать экземпляр собственного процесса CMD.EXE и использовать параметр /V: ON, чтобы включить замедленное расширение.

@echo off
setlocal disableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo !test!|findstr .

Обратите внимание, что замедленное расширение выключено в родительской партии script.

Но все ад разрывается, если отложенное расширение включено в родительском script. Ниже приведена работа не:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .

Проблема заключается в том, что !test! расширяется в родительском script, поэтому новый CMD-процесс пытается разобрать незащищенные < и >.

Вы можете избежать !, но это может стать сложным, потому что это зависит от того, цитируется ли ! или нет.

Если не указано, требуется двойной escape:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .

Если указано, то используется один побег:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .

Но есть удивительный трюк, который позволяет избежать всех экранов - прикрывая левую часть канала, предотвращает преждевременное расширение родительского script !test!:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
(cmd /v:on /c echo !test!)|findstr .

Но я полагаю, что даже это не бесплатный обед, потому что парсерный парсер вводит дополнительное (возможно, нежелательное) пространство в конце, когда используются круглые скобки.

Aint batch scripting fun; -)

Ответ 4

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

Например

echo A->B

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

 echo A-^>B

См. также escape-последовательности. введите описание изображения здесь

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

Ответ 5

Выход из скобок ala unix не позволяет либо:

эхо некоторой строки \< с угол \ > скобки → myfile.txt

Обратная косая черта будет считаться началом абсолютного пути.

Ответ 6

Вы также можете использовать двойные кавычки для вызова специальных символов...

echo some string "<" with angle ">" brackets >>myfile.txt