Windows 배치 파일에서 문자열의 일부를 추출하는 방법은 무엇입니까?


30

배치 (cmd) 파일의 변수에 저장된 "Abc_123"과 같은 값이 있다고 가정합니다. "123"만 포함 된 변수로 끝나고 싶습니다. 이 작업을 수행하는 기본 제공 방법이 있습니까?

일반적인 Windows (Vista / 2008) 시스템에 내장되어있는 한이 방법이나 성능에 대해서는별로 까다 롭지 않습니다.

답변:


40

부분 문자열 구문을 사용하십시오.

C:\Users\John>set string=Abc_123

C:\Users\John>echo %string%
Abc_123

C:\Users\John>echo %string:~4,3%
123

4
배치 파일에서 하위 문자열을 수행하는 가장 좋은 방법은 무엇입니까?에help set 언급 된대로 전체 구문을 볼 수 있습니다 . StackOverflow에.
5910

1
4와 3을 변수 입력으로 사용해야한다면 어떻게해야합니까? %string:~%start%,%len%%
MakPo

신경 쓰지 마. 답을 찾았습니다. ss64.com/nt/syntax-substring.html
MakPo

3
@MakPo의 링크를 요약하려면 다음 CALL과 같이 사용하십시오CALL SET _substring=%%_donor:~%_startchar%,%_length%%%
bugybunny

8

밑줄 뒤의 모든 것을 원하고 (문자열의 길이 또는 밑줄이 어디에 있는지 알 필요는 없지만 하나의 밑줄 만있을 수 있음) 다음을 시도하십시오.

for /f "tokens=2 delims=_" %%a in ("%STRING%") do (
  set AFTER_UNDERSCORE=%%a
)

기본적으로 문자열은 밑줄을 구분 기호로 사용하여 토큰으로 분할됩니다 (delims = _). 두 번째 토큰 (토큰 = 2) 만 for 루프에 전달됩니다 (변수 %% a로). 이 경우 단일 문자열을 처리하므로 루프는 한 번만 실행됩니다.

밑줄 전후에 내용을 저장하려면 다음을 시도하십시오.

for /f "tokens=1,2 delims=_" %%a in ("%STRING%") do (
  set BEFORE_UNDERSCORE=%%a
  set AFTER_UNDERSCORE=%%b
)

%% a는 스플릿의 첫 번째 토큰에 대한 변수입니다. %% b는 스플릿의 두 번째 토큰에 대한 변수입니다.


3

배치 언어가 원하는 작업을 수행하기에 충분히 강력하지 않으며 해당 시점에 도달하는 데 너무 오래 걸리지 않는 경우 Windows PowerShell을 사용할 수 있습니다 . 기본적으로 모든 Windows 버전에 설치되지는 않지만 무료로 다운로드 할 수 있습니다.

PowerShell 언어가 마음에 들지 않으면 Perl이 있습니다. 그래도 모든 시스템에 설치해야합니다. 다른 것도 있습니다.


이 질문은 Powershell 또는 Perl에 대해 묻지 않습니다
Zimba

2
set var1=Abc_123
set var2=%var1:*_=%
echo %var2%

3
이것이 구체적으로 무엇을합니까?
Pimp Juice IT

이 코드의 작동 방식을 묻는다면 밑줄이 앞에 나오는 숫자 앞에있는 모든 것을 제거합니다.
짐바

@Zimba는 이것을 단순히 "last _"(으)로 확장하는 방법이 있습니까? 또한 모든 문서에서 어디서 찾을 수 있습니까?
TWiStErRob

좋아, 문서를 찾았고 답변을 추가했습니다. 여전히 욕설 : *욕심을 어떻게 만드 나요? 나는 좋은 ol ' IF NOT ... GOTO :replace을 사용했지만 더 좋은 방법이 있다면 좋을 것입니다.
TWiStErRob

1
@TWiStErRob : 알겠습니다. 당신은 얼마나 많은 모르는 경우 _다음 마지막에있다, 다음 루프set var
Zimba
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.