2012-07-25 3 views
1
변수

에서 각 텍스트 파일의 라인과 루프를 추출CMD/배치이 코드를 가지고

@Echo Off 
SetLocal EnableDelayedExpansion 
SET mydir=D:\ 
SET DirCount=2 
SET T= 
For /F %%i In (qqq.txt) Do ( 
    set fg=%%i 
    FOR /L %%G IN (2, 1, %DirCount%) DO (call :subroutine "%%i") 
) 

:subroutine 
Set T=!T!../ 
start /wait %mydir%program.exe %T%%fg% 
echo %t%%fg% >>%cd%see.log 

qqq.txt가이 행

결과에서
1 
2 
3 

내가 얻을 :

../1 
../../2 
../../../3 
../../../../3 

하지만 이렇게해야합니다 :

../1 
../../1 
../2 
../../2 
../3 
../../3 

내가 잘못하고있는 것을 도와주세요. 추가


그냥 조금

내가 필요 requried

에서 처음으로 무엇을 OCUR
set "T=!T!../" 
will be without dots 
set "T=!T!/" 
result must be 
/1 
../1 
../../1 
/2 
../2 
../../2 

하는 방법과 같은 각 루프 뭔가를해야만에 대한 카운터를 추가하고 볼 수있게하는 곳

echo Now looping: %%i row of %countrow(in qqq.txt), left %countrow-%%I 
echo Now looping: Dir Nr%%G !T!%%i 

바보 같은 질문에 대해 유감스럽게 생각하지만 일괄 코딩은 어렵습니다.

+0

- 파일의 행 수를 얻기는 직관적이지, 그래서 내 대답에 그를 추가합니다. 그러나 나머지는 당신의 문제에 대해 좀 더 생각해야합니다. 당신이 요구하는 대부분은 간단한 논리로 다룹니다. 원래 코드를 작성할 수 있었다면, 새로운 질문 대부분을 스스로 해결할 수 있어야합니다. 힌트 - 허용 된 대답에 간단한 변경 만하면됩니다. DirCount 값을 수정하고'Set T =! T! ../ '행의 위치를 ​​이동하십시오. – dbenham

답변

3

당신은 3 문제가 :

1)이

2) FOR/L IN() 절은 잘못된 서브 루틴으로 통한 추락 있도록 메인 루프 후 프로그램을 종료하지 않습니다, 첫 번째 숫자는 2가 아닌 1이어야합니다.

3) 외부 루프 내에서 T를 undefined로 재설정해야합니다.

편집
난 당신이 추가 문제가있을 수 있습니다 생각합니다. 출력을 리디렉션 할 때 파일 이름 앞에 %cd%을 붙입니다. 나는 그것이 당신이 원하는 결과를주는 것이라고 생각하지 않습니다. 현재 디렉토리가 C:\test이면 >>%cd%see.log은 디렉토리의 testsee.log 파일로 출력을 보냅니다. 현재 디렉토리에 출력을 원하면 >>%cd%\see.log이어야하지만 기본값은 현재 디렉토리를 사용하므로 경로 정보는 실제로 필요하지 않습니다. 그래서 정말로 필요한 것은 >>see.log입니다. 나는 당신의 의도를 모르기 때문에, 나는 원래 작성한 그대로 리다이렉션을 떠났다. 최종 편집 이미 확장을 지연 활성화, 특히 이후 귀하의 경우 서브 루틴을 호출 할 필요가 없습니다

@echo Off 
SetLocal EnableDelayedExpansion 
SET mydir=D:\ 
SET DirCount=2 
For /F %%i In (qqq.txt) Do (
    SET T= 
    set fg=%%i 
    FOR /L %%G IN (1, 1, %DirCount%) DO (call :subroutine "%%i") 
) 
exit /b 

:subroutine 
Set T=!T!../ 
start /wait %mydir%program.exe %T%%fg% 
echo %t%%fg% >>%cd%see.log 

. 다음은 적은 코드로 동일한 결과를 제공하며 상대적으로 느린 CALL 문을 피하기 때문에 더 빠릅니다.추가 질문에 는 (성능이 아마도이 작은 예에 문제가되지 않지만 많은 반복과 루프를 사용하는 경우는 큰 차이를 만들 수 있습니다)

@echo Off 
SetLocal EnableDelayedExpansion 
SET mydir=D:\ 
SET DirCount=2 
For /F %%i In (qqq.txt) Do (
    SET "T=" 
    FOR /L %%G IN (1, 1, %DirCount%) DO (
    set "T=!T!../" 
    start /wait %mydir%program.exe !T!%%i 
    echo !T!%%i >>%cd%see.log 
) 
) 


부분 대답

당신에게 FOR/F를 사용하여 FIND/C의 결과를 캡처하여 "qqq.txt"에있는 행 수를 얻을 수 있습니다.

for /f %%N in ('find /c /v "" ^<qqq.txt') do set "rowCount=%%N" 

당신은 나머지 줄

의 수

먼저 나머지 카운트를 초기화를 추적하는 것이 당신을 수 있도록, 기본적인 수학을 할 SET/A를 사용할 수 있습니다 : 당신이 메인 루프를 입력 전에 수행되어야한다 메인 루프를 입력하기 전에 다음을 입력하십시오 :

그런 다음 메인 루프 내에서 값을 감소 시키려면 SET/A를 사용하십시오. 업데이트 된 질문에 대해서는

set /a remainingLines-=1 
+0

완벽한 !!! 고마워요 !!! –

+0

@DmitrijHolkin - 추가 문제를 발견했을 수 있습니다. 내 대답에 * EDIT * 표시된 새 섹션을 참조하십시오. – dbenham

+0

@DmitrijHolkin - 추가 질문에 부분적으로 대답했습니다. 나머지는 당신에게 달려 있습니다 :-) – dbenham

관련 문제