delayed expansion이 활성화되어있는 동안 substring replacement 구문을 사용하여 특정 하위 문자열을 느낌표로 바꾸려는 경우 파서는 확장을 위해 !
을 구별 할 수 없으므로 즉시 (일반) 확장을 사용해야합니다.대체 문자열에는 느낌표를 사용하지만 검색 문자열에는 느낌표를 표시하지 마십시오 (지연 확장을 사용하여 부분 문자열을 대체).
그러나 대체 문자열에서 느낌표를 벗어나는 이유는 무엇입니까? 그리고 검색 문자열의 느낌표가 이스케이프 될 때 왜 필요하지 않고 파괴적일까요?
는다음 스크립트 `
에 의해, 그 후 역순으로 문자열 !
의 대체, 그래서 결과는 (물론 그 자체에 어떤 백 진드기를 포함 할 수 없습니다) 초기 문자열과 동일 할 것으로 예상 :
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem This is the test string:
set "STRING=string!with!exclamation!marks!"
set "DELOFF=%STRING%"
set "DELOFF=%DELOFF:!=`%"
set "DELOFF=%DELOFF:`=!%"
setlocal EnableDelayedExpansion
set "DELEXP=!STRING!"
set "DELEXP=%DELEXP:!=`%"
set "DELEXP=%DELEXP:`=!%"
echo(original string: !STRING!
echo(normal expansion: !DELOFF!
echo(delayed expansion: !DELEXP!
endlocal
endlocal
exit /B
는 마지막 문자열은 다릅니다
original string: string!with!exclamation!marks! normal expansion: string!with!exclamation!marks! delayed expansion: stringexclamation
수 있도록 로하는 ... 라인을 가지고 : ....
set "DELEXP=%DELEXP:`=!%"
을 따라서 대체 문자열에 느낌표를 탈출, 거기 !
^!
에 의해 교체, 결과는 내가 예상 정확히 :
original string: string!with!exclamation!marks! normal expansion: string!with!exclamation!marks! delayed expansion: string!with!exclamation!marks!
나는 (느낌표 탈출에 모두 교체하고 검색 문자열, 또는 단지 후자에)하지만 다른 탈출 조합을 시도, 결과는 다시 상기 원치 않는 것입니다. 때
나는 게시물 How does the Windows Command Interpreter (CMD.EXE) parse scripts?을 통해 걸어 왔지만 지연된 확장이 발생하고 느낌표가 인식되기 훨씬 전에 정상적인 (즉각적인, 퍼센트) 확장이 이루어 졌다는 것을 알았 기 때문에 그 행동에 대한 설명을 찾을 수 없었습니다. 또한 나중에 캐럿 인식 및 이스케이프가 발생하는 것으로 보입니다. 또한, 문자열 주위에는 큰 따옴표가있어 파서에서 일반적으로 숨기기를 숨 깁니다.