^
이스케이프 시퀀스 를 피하는 방법이 있습니다 .
확장이 지연된 변수를 사용할 수 있습니다. 아래는 작은 배치 스크립트 데모입니다.
@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 .
그러나 배치 파서가 괄호를 사용할 때 끝에 추가 (아마도 원치 않는) 공간을 도입하기 때문에 공짜 점심이 아니라고 생각합니다.
배치 스크립팅 재미 없음 ;-)