Escape-угловые скобки в командной строке 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
идеи?
6 ответов:
по какой-то причине escape-символ Windows равен^.
echo some string ^< with angle ^> brackets >>myfile.txt
правда, официальный escape-символ
^, но будьте осторожны, потому что иногда нужно три^символы. Это просто иногда: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>обратите внимание, что это не сохранит ведущие пробелы в тексте приглашения.
есть методы, которые позволяют избежать
^escape-последовательности.вы можете использовать переменные с задержкой расширения. Ниже приведен небольшой пакетный скрипт демонстрации
@echo off setlocal enableDelayedExpansion set "line=<html>" echo !line!или вы можете использовать цикл FOR /F. Из командной строки:
for /f "delims=" %A in ("<html>") do @echo %~Aили из пакетного сценария:
@echo off for /f "delims=" %%A in ("<html>") do echo %%~Aпричина, по которой эти методы работают, заключается в том, что как отложенное расширение, так и для переменного расширения происходят после специальных операторов, таких как
<,>,&,|,&&,||разбираются. Смотрите как работает интерпретатор команд Windows (CMD.EXE) разбирать скрипты? для получения дополнительной информации.
sin3. 14 указывает, что трубы могут потребовать нескольких побегов. Например:
echo ^^^<html^^^>|findstr .причина, по которой трубы требуют нескольких экранирований, заключается в том, что каждая сторона трубы выполняется в новом процессе CMD, поэтому линия анализируется несколько раз. Смотрите почему задерживается расширение сбой, когда внутри конвейерного блока кода? для объяснения многих неудобных последствий реализации трубы окна.
существует еще один способ избежать нескольких побегов при использовании труб. Вы можете явно создать свой собственный процесс CMD и защитить один escape с кавычками:
cmd /c "echo ^<html^>"|findstr .если вы хотите использовать метод отложенного расширения, чтобы избежать побега, то есть еще больше сюрпризов (вы не могли бы быть удивлены, если вы являетесь экспертом по проектирование КМД.EXE, но нет официальной документации MicroSoft, которая объясняет этот материал)
помните, что каждая сторона трубы выполняется в своем собственном CMD.EXE процесс, но процесс делает не наследовать состояние отложенного расширения - по умолчанию он выключен. Таким образом, вы должны явно создать экземпляр собственного CMD.EXE-процесс и используйте параметр /V:ON для включения отложенного расширения.
@echo off setlocal disableDelayedExpansion set "line=<html>" cmd /v:on /c echo !test!|findstr .обратите внимание, что отложенное расширение выключено родительский сценарий.
но весь ад вырвется на свободу, если в Родительском скрипте включено отложенное расширение. Следующее делает не работы:
@echo off setlocal enableDelayedExpansion set "line=<html>" REM - the following command fails cmd /v:on /c echo !test!|findstr .проблема в том, что
!test!расширяется в Родительском скрипте, поэтому новый процесс CMD пытается разобрать незащищенный<и>.вы могли бы избежать
!, но это может получить сложно, потому что это зависит от того, является ли!цитируется или не.если не указано, то требуется двойной побег:
@echo off setlocal enableDelayedExpansion set "line=<html>" cmd /v:on /c echo ^^!test^^!|findstr .если указано, то используется один escape:
@echo off setlocal enableDelayedExpansion set "line=<html>" cmd /v:on /c "echo ^!test^!"|findstr .но есть удивительный трюк, который позволяет избежать всех побегов-заключая левую сторону трубы предотвращает Родительский скрипт от расширения
!test!преждевременно:@echo off setlocal enableDelayedExpansion set "line=<html>" (cmd /v:on /c echo !test!)|findstr .но я полагаю, что даже это не бесплатный обед, потому что пакетный парсер вводит дополнительное (возможно, нежелательное) пространство в конце, когда используются круглые скобки.
Aint batch scripting fun ; -)
чтобы использовать специальные символы, такие как '>' в Windows с echo, вам нужно поместить перед ним специальный escape-символ.
например
echo A->Bне будет работать, так как '>' должен быть экранирован '^':
echo A-^>Bсм. также escape-последовательности.
есть короткий пакетный файл, который печатает базовый набор специальных символов и их последовательностей.
экранирование скобок ala unix не делает работы:
Эхо некоторые строки \ кронштейны >>мой_файл.txt
обратная косая черта будет считаться началом абсолютного пути.
вы также можете использовать двойные кавычки для экранирования специальных символов...
echo some string "<" with angle ">" brackets >>myfile.txt

Comments