2012-08-13 6 views
0

이것을 파악하려고하는 지루함이 있습니다. 창에CMD는 파이프 입력에서 특정 라인을 반환합니다.

은 명령 프롬프트 : 나는 ipconfig /all | find /n "Internal"을 실행하면

ipconfig /all 반환 모든 루프백, 터널 등

그것은 [11] 이더넷 어댑터 내부를 반환합니다. 내가하고 싶은 일은 처음부터 11을 부분 문자열로 처리 한 다음 11-19 줄이나 다른 줄을 반환 할 다른 곳으로이 파이프를 연결하는 것입니다. 당신은 jquery와 연결과 비슷한 한 줄로 이것을 할 수 있습니까?

+0

코드 예제에서 '/ N'옵션을 잊어 버렸습니다. – dbenham

+0

'/ N'인수가 올바른 경우 특정 행을 반환합니다. 그것의 나머지에 관한 어떤 도움? – hokeyplyr48

답변

0

FOR/F 루프를 사용하여 11을 구문 분석하는 것은 간단합니다. 그러나 명령 행에서 하나의 라이너에서이 값을 사용하는 것은 어렵습니다.

다음은 명령 줄에서 실행할 수있는 하나의 라이너와 함께 할 수있는 최선의 방법입니다.

set "stop="&for /f "delims=[]" %N in ('ipconfig /all^|find /n "Internal"') do @for /f "tokens=1* delims=:" %A in ('ipconfig /all^|findstr /n "^"') do @if %A geq %N if not defined stop echo(%B&>nul 2>nul set /a 1/(%A-%N-8)||set stop=1 

내가 생각할 수있는 가장 짧은 라이너는 다른 전략을 사용합니다.

set n=&for /f "delims=" %A in ('ipconfig/all') do @if defined n (set/a"1/n,n-=1">nul 2>&1&&echo %A) else echo %A|find "Internal"&&set n=8 

그러나 위의 해결 방법은 빈 줄을 무시합니다.

당신이 다음 작품을 빈 줄을 유지하려면

: 나는 단축과 2 층과 3 솔루션 약간의 논리를 단순화

set n=&for /f "tokens=1* delims=:" %A in ('ipconfig/all^|findstr/n "^"') do @if defined n (set/a"1/n,n-=1">nul 2>&1&&echo(%B) else echo %B|find "Internal"&&set n=8 

편집 할 수 있습니다. IPCONFIG/ALL Section 명령의 출력을 읽을 사용 후

은 내가 먼저 명시 적으로 정의를 해제 카운터를하고 :

나는 2 옵션을 설명하려고합니다. 이제 DO 절 내에서 재미있는 부분을 시작합니다.

처음에는 카운터가 정의되어 있지 않으므로 ELSE 절이 실행됩니다. 나는 "Internal"을 찾기 위해 현재 줄을 찾는다. 문자열이 발견되지 않으면 아무 일도 일어나지 않고 다음 줄로 진행합니다. 그러나 발견되면 라인이 인쇄됩니다. 문자열이 발견 된 이후 && 이후의 코드가 실행됩니다. 우리는 다음 8 줄을 인쇄하기를 원하기 때문에 카운터를 8로 설정했습니다.

카운터는 나머지 줄에 대해 정의되어 있으므로 이제 IF 문의 첫 번째 부분으로 전환합니다. 나는 SET/A를 사용하여 수학을한다. 먼저 카운터의 현재 값으로 1을 나눕니다. 카운터가 0이면 오류가 발생하고 명령문의 나머지는 무시됩니다. 카운터가 0이 아니면 카운터를 1 씩 감소시킵니다. SET/A 명령의 메시지를보고 싶지 않기 때문에 stdout과 stderr를 모두 nul로 리디렉션합니다. SET 명령이 성공하면 회선을 표시합니다. 문자열을 찾았을 때 처음에 카운터를 8로 설정 했으므로 카운터가 0에 도달하기 전에 최대 8 줄이 인쇄됩니다.

+0

강렬한 신의 어머니. 너는 두 번째 것을 무너 뜨릴 수있는 여하튼? – hokeyplyr48

+0

@ hokeyplyr48 - 업데이트 된 답변보기 – dbenham

관련 문제