배치 파일의 문자열 대체


102

다음 명령을 사용하여 배치 파일의 문자열을 바꿀 수 있습니다.

set str="jump over the chair"
set str=%str:chair=table%

이 선은 잘 작동하며 문자열 "의자 위로 점프"를 "테이블 위로 점프"로 변경합니다. 이제 문자열에서 "chair"라는 단어를 변수로 바꾸고 싶은데 어떻게해야할지 모르겠습니다.

set word=table
set str="jump over the chair"
??

어떤 아이디어?


bat 파일 내부의 문자열 을 훨씬 더 비공식적 인 대답을 가진 명령 줄 매개 변수 문자열로 대체하는 방법의 중복 가능성 (여기서 답변과 동일한 솔루션이 있음)
Fr0sT

1
이제 누가 첫 번째인지는 중요하지 않지만 동일한 질문을 연결하고 가장 깨지기 어려운 답변을 가리키는 것이 좋습니다
Fr0sT

답변:


79

!를 사용할 수 있지만 ENABLEDELAYEDEXPANSION 스위치가 설정되어 있어야합니다.

setlocal ENABLEDELAYEDEXPANSION
set word=table
set str="jump over the chair"
set str=%str:chair=!word!%

4
그러나 str그 자체가 지연된 확장에서 나온 다면 어떨까요? set str=!str:chair=!word!!제대로 작동하지 않습니다.
ImaginaryHuman072889

나는 "jump over the !word!".
BER들

88

다음과 같은 작은 트릭을 사용할 수 있습니다.

set word=table
set str="jump over the chair"
call set str=%%str:chair=%word%%%
echo %str%

call이, 변수 확장의 또 다른 레이어를 일으키는 것이 필요 원본 인용 할 수있게 %표시를하지만 모두가 결국 밖으로 작동합니다.


이 솔루션이 마음에 들었습니다. 이스케이프 문자열은 배치 파일에서 항상 문제가 있으며 ENABLEDELAYEDEXPANSION은 걱정할 다른 문자를 추가합니다.
Anders

9
Joey가 제공 한 답변에 관한 중요한 것 . 작동하려면 코드를 배치 파일에 넣어야합니다. 명령 줄에서 테스트 만하면 예기치 않은 %"jump over the "word%%%. 배치 파일과 명령 줄의 코드는 다른 결과를 생성 할 수 있습니다.
dadhi

2
dadhi의 즉각적인 의견을 바탕으로 명령 줄 솔루션은 다음과 같습니다. stackoverflow.com/questions/29944902/… .
Kenn Sebesta

2
: 그것은 어느 위치에 환경 변수, 두 가지 작동, 또는 둘 모두 "전에"위치 "후"에 있기 때문에이 대답을 Upvoting set word=table set str="jump over the chair" call set str=%%str:chair=%word%%% echo %str% set word1=chair set word2=desk set str="jump over the chair" call set str=%%str:%word1%=%word2%%% echo %str%'
톰 워 필드

0

Joey 's Answer를 사용하여 함수를 만들 수있었습니다.

다음과 같이 사용하십시오.

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

SET "MYTEXT=jump over the chair"
echo !MYTEXT!
call:ReplaceText "!MYTEXT!" chair table RESULT
echo !RESULT!

GOTO:EOF

그리고 이러한 기능은 배치 파일의 맨 아래에 있습니다.

:FUNCTIONS
@REM FUNCTIONS AREA
GOTO:EOF
EXIT /B

:ReplaceText
::Replace Text In String
::USE:
:: CALL:ReplaceText "!OrginalText!" OldWordToReplace NewWordToUse  Result
::Example
::SET "MYTEXT=jump over the chair"
::  echo !MYTEXT!
::  call:ReplaceText "!MYTEXT!" chair table RESULT
::  echo !RESULT!
::
:: Remember to use the "! on the input text, but NOT on the Output text.
:: The Following is Wrong: "!MYTEXT!" !chair! !table! !RESULT!
:: ^^Because it has a ! around the chair table and RESULT
:: Remember to add quotes "" around the MYTEXT Variable when calling.
:: If you don't add quotes, it won't treat it as a single string
::
set "OrginalText=%~1"
set "OldWord=%~2"
set "NewWord=%~3"
call set OrginalText=%%OrginalText:!OldWord!=!NewWord!%%
SET %4=!OrginalText!
GOTO:EOF

그리고 배치 파일 맨 위에 "SETLOCAL ENABLEDELAYEDEXPANSION"을 추가해야합니다. 그렇지 않으면이 중 어느 것도 제대로 작동하지 않습니다.

SETLOCAL ENABLEDELAYEDEXPANSION
@REM # Remember to add this to the top of your batch file.

-4

이것은 잘 작동합니다

@echo off    
set word=table    
set str=jump over the chair    
set rpl=%str:chair=%%word%    
echo %rpl%

5
미안해 보이지만 틀렸어! 단어를 제거하고 단어 chair를 추가 table하지만 두 단어를 교환하지는 않습니다. 단어를 대체하는 시도 over와 함께 under당신은 얻을jump the chairunder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.