Windows 명령 프롬프트에서 꺾쇠 괄호 이스케이프


93

꺾쇠 괄호 (<및>)가 포함 된 문자열을 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
따옴표도 에코됩니다.
dalle

답변:


171

어떤 이유로 Windows 이스케이프 문자는 ^입니다.

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

10
글쎄, 백 슬래시는 경로 이름에 사용되며 큰 따옴표는 공백이있는 파일 이름을 감싸는 것이므로 많은 문자 선택이 남아 있지 않습니다.
James Curran

앰퍼샌드 (&)와 같은 다른 문자에도 적용됩니다. 감사합니다.
tenfour

2
잘 작동합니다! echo some string ^< with angle ^> brackets >>con결과 : 일부 문자열 <꺾쇠 괄호> 대괄호
Ross Bradbury

1
원래 pc-dos가 경로 및 이전 버전과의 호환성을 위해 백 슬래시를 사용했기 때문입니다.
Jahmic

그다지 무작위가 아니었다 고 생각합니다. 제 생각에는 그들은 일반 텍스트에 나타날 것 같지 않은 문자를 사용하기를 원했기 때문에 쉽게 피할 수 없지만 원치 않는 문자 이스케이프를 유발하지 않았습니다.
데이비드 A. 그레이

23

사실, 공식적인 이스케이프 문자는입니다 ^. 그러나 때때로 ^ 문자 가 필요하므로주의하십시오 . 이것은 때때로 다음과 같습니다.

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>

이것은 프롬프트 텍스트의 선행 공백을 유지하지 않습니다.


1
파이프에 여러 이스케이프가 필요한 이유에 대한 설명 은 내 대답 의 두 번째 부분을 참조하십시오 .
dbenham 2014 년

이 세 ^^^가지는 Azure DOS / Kudu 콘솔에서 명령을 이스케이프하는데도 필요합니다.
lionello

8

^이스케이프 시퀀스 를 피하는 방법이 있습니다 .

확장이 지연된 변수를 사용할 수 있습니다. 아래는 작은 배치 스크립트 데모입니다.

@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 프로세스에서 실행되어 라인이 여러 번 구문 분석되기 때문입니다. 파이프 된 코드 블록 내부에서 지연된 확장이 실패하는 이유를 참조하십시오 . Window의 파이프 구현의 많은 어색한 결과에 대한 설명.

파이프를 사용할 때 다중 이스케이프를 방지하는 또 다른 방법이 있습니다. 자신의 CMD 프로세스를 명시 적으로 인스턴스화하고 따옴표로 단일 이스케이프를 보호 할 수 있습니다.

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

이스케이프를 피하기 위해 지연된 확장 기술을 사용하려는 경우 더 많은 놀라움이 있습니다 (CMD.EXE 디자인에 대한 전문가라면 놀라지 않을 수 있지만이 내용을 설명하는 공식 MicroSoft 문서는 없습니다).

파이프의 각 측면은 자체 CMD.EXE 프로세스에서 실행되지만 프로세스는 지연된 확장 상태를 상속 하지 않으며 기본값은 OFF입니다. 따라서 자신의 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 .

인용 된 경우 단일 이스케이프가 사용됩니다.

@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 .

그러나 배치 파서가 괄호를 사용할 때 끝에 추가 (아마도 원치 않는) 공간을 도입하기 때문에 공짜 점심이 아니라고 생각합니다.

배치 스크립팅 재미 없음 ;-)


3

에코가있는 Windows에서 '>'와 같은 특수 문자를 사용하려면 그 앞에 특수 이스케이프 문자를 배치해야합니다.

예를 들어

echo A->B

'>'는 '^'로 이스케이프해야하므로 작동하지 않습니다.

 echo A-^>B

이스케이프 시퀀스를 참조하십시오 . 여기에 이미지 설명 입력

기본 특수 문자 세트와 해당 이스케이프 시퀀스를 인쇄하는 짧은 배치 파일이 있습니다.


0

대괄호 ala unix를 이스케이프해도 작동하지 않습니다.

일부 문자열 \ <꺾쇠 \> 대괄호 >> myfile.txt 에코

백 슬래시는 절대 경로 이름의 시작으로 간주됩니다.


2
현재 드라이브 문자에 상대적인 절대 경로 이름 ...;)
dalle

백 슬래시는 echo 명령에 대한 텍스트 내부의 절대 경로 이름의 시작으로 간주되지 않습니다. 보내는 곳마다 파이프되는 일반 텍스트 일뿐입니다. - echo \ 예를 들어 예상대로 작동합니다. -그러나 예, "\"는 경로 나 파일 이름이 필요한 모든 명령 / 프로그램이 대신`\`를 입력해야하기 때문에 명령 줄 이스케이프 문자에 대한 잘못된 선택입니다.
BrainSlugs83

1
이 대답은, 틀림없이 막연한 질문에 대한 해결책을 제공하지 않습니다
G-합니다.

-2

큰 따옴표를 사용하여 특수 문자를 이스케이프 할 수도 있습니다.

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

4
작동하지 않습니다. echo some string "<" with angle ">" brackets >>con결과 : 일부 문자열 "<"with angle ">"대괄호 그러나 OP는 <with angle> 대괄호 문자열을
Ross Bradbury
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.