2012-11-23 2 views
2

스크립트를 테스트 할 때 일괄 처리를 사용하여 문자열에서 문자를 추출하려고 할 때이 문제가 발생했습니다. 간단한 예제로 단순화했습니다. t.txt에는 단어 hello 만 있습니다.지연된 확장 제한을 사용하여 문자열 분할

@echo off 
setlocal enabledelayedexpansion 
set a=0 
set b=1 
for /f %%a in (t.txt) do (
set x=%%a 
echo !x:~!a!,!b!! 
set /a x+=1 
) 
pause >nul 

문제는 지연 확장을 사용하여 액세스 할 필요가 x 변수는, 그리고 나는 루프를 통해 ab의 값을 업데이트하고 있기 때문에이 또한 지연 확장을 사용하여 액세스 할 필요가있다.

그들은 모두 지연 확장을 필요로하는 문자열을 분할 변수 ab을 사용하려고하지만, !마르크의 순서는 내가 의도 한 방식으로 해석되지 않음을 의미 할 때!

CMD는 내부 명령을 먼저 확장하는 대신 !x:~!, !,!!!으로 명령을 확장합니다. 분명히 %도 사용할 수 없습니다.

이 문제를 해결할 수있는 유일한 방법은 루프에없는 외부 함수를 호출하는 것이므로 %을 사용할 수 있습니다.

@echo off 
setlocal enabledelayedexpansion 
set a=0 
set b=1 
set v= 
for /f %%a in (t.txt) do (
set x=%%a 
call :RETURN x 
set /a x+=1 
) 
pause >nul 

:RETURN 
set v=%1 
echo %v:~!a!,!b!% 

I가 필요하거나,이 단지 제한 I가 call을 사용해야합니다 얼마나 내 명령을 구문 분석 할 수 cmd를 가져 오는 방법이 있나요?

답변

3

가변 변수 ab을 FOR 변수로 전송하십시오.

@echo off 
setlocal enabledelayedexpansion 
set a=0 
set b=1 
for /f %%a in (t.txt) do (
    set "x=%%a" 
    for /f "tokens=1,2" %%A in ("%a% %b%") do echo !x:~%%A,%%B! 
    REM this line makes no sense if x=hello: set /a x+=1 
) 
pause >nul 
+0

나는 그것이 단순 할 것이라고 알고 있었다. 고마워! –

+0

그리고 이것은 너무 복잡합니다 – jeb

3

혼합 확장 및 정상 확장이 작동합니다.

@echo off 
setlocal EnableDelayedExpansion 
set a=0 
set b=1 
for /f %%L in (t.txt) do (
    set "x=%%L" 
    echo !x:~%A%,%B%! 
) 
+0

+1 : true. 나는 그것을 생각했지만, OP가 즉각적인 확장을 사용할 수없는 정당한 이유가 있다고 가정했습니다. 질문은 예제 코드가 단순화되었다는 것을 암시하며, 나는 단지 좋은 예가 아니라고 가정했다. – dbenham