2017-01-07 1 views
2

기본적으로이 코드를 사용하여 var의 문자열을 대체하지만 중첩 지연 확장을 올바르게 수행 할 수 없습니다. 이것은 가능한가?일괄 지연 확장 문자열을 지연 확장 매개 변수로 바꾸십시오.

set replace=!replace:!search!=!replaceVal!! 

나는 그것이 언제 실행되는지 알고있다. 그것은 set replace=!replace:!이 될 첫 번째 완성 된 세트에서 멈추고 마지막 파트를 실행하려고 시도하지만, 결과를 제대로 얻을 수 있도록 이스케이프 방법이 있습니까?

답변

1

이만큼 searchreplace 값이없는 공백 가지고 작동

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 

SET "search=aaa" 
SET "replace=jjj" 
IF DEFINED search (
SET "replace=xxxbbbyyybbbhhh" 
SET "search=bbb" 
SET "replaceval=kkk" 
SET REPLACE 
ECHO after... 
CALL SET "replace=%%replace:!search!=!replaceval!%%" 
SET replace 
) 

GOTO :EOF 
+0

문제는 내 검색 및 바꾸기 값이 스크립트 실행에서 가져올 값을 기반으로합니다. 설정 명령은 블록에 있습니다. – Matthew

+0

그래서? 이 예제는'search','replaceval','replace'에 대한 값이 블록 내에 설정되어 있음을 보여줍니다. 첫 번째'set replace' ('replace'를 시작하는 각 변수의 값을 보여줍니다)에서 값은'aaa'도 아니고'jjj'도 아닙니다. 블록 내에서 할당 된 값으로 대체되었습니다. 'after' 상황은 교체 후 여전히'aaa' 나'jjj'가 보이지 않고'xxxbbbyyybbbhhh' 블록 내에 할당 된 값은'bbb' 블록 내에 할당 된 문자열을 대체 된 대체 블록으로 대체했습니다 블록'kkk '안에서. – Magoo

1

[실시 예]

for /F "tokens=1,2" %%a in ("!search! !replaceVal!") do set replace=!replace:%%a=%%b! 

이 경우 이러한 변수 공간은 단지 적절한 분리 삽입 가지고

for /F "tokens=1,2 delims==" %%a in ("!search!=!replaceVal!") do set replace=!replace:%%a=%%b! 
1

가장 안전한 방법은 fo라고 생각합니다. llowing :

for /F "delims=" %%S in (^""!search!"^") do (
    for /F "delims=" %%R in (^""!replaceVal!"^") do (
     set "replace=!replace:%%~S=%%~R!" 
    ) 
) 

따라서 나머지 제한 사항은 하위 문자열 대체 구문에 적용되는 제한 사항입니다.