Notice
Recent Posts
Recent Comments
03-28 14:34
관리 메뉴

Black&White

batch - 파일을 읽어들여 특정 명령을 반복 실행하기 본문

카테고리 없음

batch - 파일을 읽어들여 특정 명령을 반복 실행하기

V.E.N 2014. 2. 6. 12:05

예를들어, IP 목록에 대해 Ping 테스트를 하고 싶다. 일일이 ping 명령을 쳐서 하는건 정말 귀찮은 일이다.

물론, 이 작업을 하기 위한 nmap 등과 같은 훌륭한 프로그램들이 있다.

하지만, windows 환경에서 nmap 등과 같은 프로그램을 설치할 수 없다면?


이때, 필요한 것은 Windows 환경에서는 batch 명령, vb script, powershell 등의 스크립트를 통해 작업이 가능할 것이다.


여기서는 batch 명령을 통해 위 작업을 하려고 한다.


기본적으로 알아야 할 문법은 For ~ Do 문이다. (cmd 창에서 'for /?' 를 입력하면 자세한 설명을 볼 수 있다.)


For ~ Do 구문을 통해 파일을 읽어 들이고 명령을 반복 수행할 것이기 때문이다.


[기본형식]

FOR /F ["옵션"] %변수 IN (파일-집합) DO 명령 [명령-매개 변수]
FOR /F ["옵션"] %변수 IN ("문자열") DO 명령어 [명령-매개 변수]
FOR /F ["옵션"] %변수 IN ('명령어') DO 명령어 [명령-매개 변수]


    또는 usebackq 옵션이 있는 경우:

FOR /F ["옵션"] %변수 IN (파일-집합) DO 명령 [명령-매개 변수]
FOR /F ["옵션"] %변수 IN ('문자열') DO 명령어 [명령-매개 변수]              // '문자열' 은 따옴표 기호
FOR /F ["옵션"] %변수 IN (`명령어`) DO 명령어 [명령-매개 변수]             // `명령어` 는 숫자 1옆에 억음악센트 기호


For /f "tokens=1,2,3* delims=xx" %%i in (filename) do [명령어 %%i %%j %%k .....]


[주의] 매개변수 %%i 는 cmd 입력창에서는 %i 를 사용하고, batch 명령에서는 %%i 를 사용한다.


/f : (파일, 문자열, 명령) 을 실행후, 각각의 행을 매개변수 %%i 로 사용


tokens=1,2,3* : 파일내의 각 행에서 구분자가 delims=xx 에 지정된 xx(콤마, 마침표, 스페이스 등등) 구분자로 나뉘어 총 3개의 토큰을 만든다는 의미이며 3* 에서 별표(*)의 의미는 4번째 이후 전달할 토큰을 하나로 해서 %l 매개변수로 전달함을 의미한다.


delims=xx : token 으로 전달하기 위한 구분문자를 xx 로 지정함을 뜻함.(구분자는 콤마, 마침표, 스페이스, 탭 등등)


이렇게 설명하면 이해가 어려울 수 있으니 예를 들어보자


test.txt 파일안에 아래와 같은 내용이 들어 있다고 가정하자

111 222 333 444
111.222.333.444
111    222    333    444
111-222-333-444


명령줄로 테스트를 해볼 것이기 때문에 매개변수는 %i 로 지정한다.


for /f %i in (test.txt) do @echo %i

F:>for /f %i in (test.txt) do @echo %i
111
111.222.333.444
111
111-222-333-444


for /f "delims=" %i in (test.txt) do @echo %i

또는 for /f "tokens=1 delims=" %i in (test.txt) do @echo %i

111 222 333 444
111.222.333.444
111     222     333     444
111-222-333-444



F:>for /f "tokens=1,2,3* delims=. " %i in (test.txt) do @echo %i
111
111
111     222     333     444
111-222-333-444

F:>for /f "tokens=1,2,3* delims=. " %i in (test.txt) do @echo %i %j

111 222
111 222
111     222     333     444
111-222-333-444

F:>for /f "tokens=1,2,3* delims=. " %i in (test.txt) do @echo %i %j %k
111 222 333
111 222 333
111     222     333     444
111-222-333-444

F:>for /f "tokens=1,2,3* delims=. " %i in (test.txt) do @echo %i %j %k %l

111 222 333 444
111 222 333 444
111     222     333     444
111-222-333-444

F:>for /f "tokens=1,2,3* delims=.- " %i in (test.txt) do @echo %i %j %k %l
111 222 333 444
111 222 333 444
111     222     333     444
111 222 333 444


구분자 탭으로 2번째 토큰부터는 전달할 값이 없어 빠져있다
F:>for /f "tokens=2,3* delims=.- " %i in (test.txt) do @echo %i %j %k
222 333 444
222 333 444
222 333 444


구분자 탭과 하이픈(-) 이 2번째 토큰부터는 전달할 값이 없고 4번째 토큰도 지정되어 이지 않아 4번째 토큰이 %k 로 찍힘
F:>for /f "tokens=2,3 delims=. " %i in (test.txt) do @echo %i %j %k
222 333 %k
222 333 %k


tokens= 에서 별표(*) 의 의미를 살펴보자

for /f "tokens=* delims=.- " %i in (test.txt) do @echo %i %j


위 명령의 의미는 test.txt 파일을 읽어 각 행에서 구분자 마침표(.)와 하이픈(-), 스페이스( ) 로 구분되는 값을 하나의 토큰으로 읽어 들여서 화면에 %i %j 로 출력해라 라는 의미이다. 전달되는 값이 하나이므로 당연히 %i 에만 전달되는 값이 화면에 출력될 것이고, %j 로 전달되는 값이 없으므로 %j 가 그대로 화면에 출력될 것이다.


F:>for /f "tokens=* delims=.- " %i in (test.txt) do @echo %i %j
111 222 333 444 %j
111.222.333.444 %j
111     222     333     444 %j
111-222-333-444 %j


F:>for /f "tokens=1* delims=.- " %i in (test.txt) do @echo %i %j
111 222 333 444
111 222.333.444
111     222     333     444
111 222-333-444


위 실행예에서 보듯이 tokens=* 일때와 tokens=1* 때의 화면에 출력되는 결과가 어떤 차이를 보이는지 살펴보면, tokens 와 매개변수로 전달되는 값의 관계를 이해할 수 있을 것이다.


<참고> 파일명에 스페이스가 있을 경우, 큰따옴표로 묶어줘야 하며, 큰따옴표를 적용하려면 "usebackq" 옵션을 사용해야 함

예를들어, 파일명이 "테스트 파일.txt" 라고 했을 때,


for /f "usebackq tokens=1* delims=.- " %i in ("테스트 파일.txt") do @echo %i %j




지금까지는 지정된 파일을 읽어 들여서 결과를 화면에 출력하는 방법을 살펴 보았다.


이번엔 특정 명령을 실행한 결과를 읽어 들여, 그 결과를 구분자를 통해 출력하는 방법을 살펴보겠다.


예를 들어 현재 시스템의 환경변수가 어떡해 지정되어 있는지 알아보기 위한 방법은


환경변수 및 값을 보려면 set 명령을 이용하면 된다.

또한, 집합(괄호)내에 명령어를 실행할때 억음악센트(`) 를 사용해야 한다고 위에서 언급했다.

집합(괄호)내에 기호(억음악센트) 를 문자열로 인식되지 않게 하기 위해서 usebackq 옵션을 사용해야 함을 언급했다.


for /f "usebackq delims==" %i in (`set`) do @echo %i








Comments