가령 다음과 같은 스트링에서
각 단어별로 처리를 하고 싶다면 어떻게 해야할까요
배치파일 내에서는 아래와 같은 방식으로 위의 스트링을 입력할 것입니다.
많은 사람들은 for 명령어에 여러가지 옵션을 붙여서 이 문제를 해결하려고 노력할 것입니다.
그러나 결론부터 말하면 for 명령어는 스트링을 개별적으로 처리하는 능력이 없다고 합니다.
그런 결론의 출처를 언급하고 싶지만 저도 귀찮이즘이라서... 양해를 부탁드립니다.
그러면 어떻게 하면 단어 단위로 작업을 할 수 있을까요?
웹서핑중에 아이디어를 얻었습니다.
그 아이디어는 "tokens=1*" 옵션으로 for 명령을 실행하여 첫번째 문장은 %%a에 저장하고 나머지는 %%b에 저장하는것입니다.
이렇게 한뒤 LINE_STRING을 %%b로 설정하고 필요한 만큼 반복실행하는것입니다.
"tokens=1*" 옵션으로 for를 실행했을때의 결과를 보면 다음과 같습니다.
아래의 배치파일을 실행하면
아래의 결과를 얻게됩니다.
아래와 같은 결과를 얻게됩니다.
이 방식을 발전시켜서 if 제어문을 사용하고 문자열 길이만큼 반복실행해서 단어를 분해해 내는것입니다.
아래처럼 배치파일을 작성하면
그 결과로 아래를 얻습니다.
예제를 포함한 전체 배치파일 소스는 아래와 같습니다.
@echo off
echo -- Example 1 -----------
set LINE_STRING=zero one two three four five six seven eight nine ten
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
)
echo ------------------------
echo -- Example 2 -----------
set LINE_STRING=zero one two three four five six seven eight nine ten
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo.
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo.
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo.
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. %%a
echo. %%b
set "LINE_STRING=%%b"
)
echo ------------------------
echo -- Example 3 -----------
set LINE_STRING=zero one two three four five six seven eight nine ten
:L1
if "%LINE_STRING%" neq "" (
for /f "tokens=1*" %%a in ("%LINE_STRING%") do (
echo. word : [%%a]
set "LINE_STRING=%%b"
)
goto :L1
)
echo ------------------------
댓글 없음:
댓글 쓰기