2015년 4월 19일 일요일

CMD : for command

'for'는 윈도우 상에서 배치(batch) 작업을 할 때 매우 편리한 도움을 줄 수 있는
명령어이지만 의외로 사용빈도가 극히 낮다. (아는 사람들이 안가르쳐줘서 그런가..)

나름대로 Help와 몇 가지 실험을 거쳐 그럭저럭 유용하게 쓸 수는 있는
방법을 파악했다.


예를 들어, 100 개의 MP3 파일이 있고, 이것을 mp3ogg.exe라는 가상의 변환툴로
모두 Ogg Vorbis 파일로 변환해야 하는 상황을 가정해보자.

mp3ogg.exe의 사용법은 아래와 같다고 가정을 한다.

     c:\>mp3ogg.exe   asong.mp3 asong.ogg


모든 파일을 변한하려면 command prompt에서 다음과 같이 입력하면 된다.


    c:\>for %i in (*.mp3) do mp3ogg.exe %~ni.mp3 %~ni.ogg


괄호 안의 (*.mp3)는 파일 이름이고 wildcard를 지원한다.
즉, 확장자 .mp3를 갖는 모든 파일에 대해 do 이후의 명령을 실행한다는 의미이다.

여기서 %i는 변수로서 ()에서 지정된 파일이 하나하나 지정된다.
%~ni는 %i에서 지정된 파일에서 확장자가 빠진 문자열에 해당한다.

예를 들어 %i가 'asong.mp3'였다면 %~ni는 'asong'이 된다.

이것을 이용하여 파일 이름과 확장자를 분리할 수가 있고
더 많은 옵션은 'c:\>for /?'로 찾아보면 된다.

참고로 변수는 긴 문자 지원이 안되고 오직 알파벳 한 글자만 된다.



만약 위의 예에서 변환을 한 다음 원래의 MP3 파일을 삭제하고 싶다면,
한 줄로는 구현이 어렵고 cmd 파일을 만들면 된다.

convdel1.cmd
@mp3ogg.exe    %1.mp3   %1.ogg
@del %1.mp3


그리고 프롬프트에서 다음과 같이 위 cmd 파일을 부른다.

     c:\>for %i in (*.mp3) do @call convdel1.cmd %~ni

cmd 파일에서 파라미터는 그 순서에 따라 %1, %2 등에 저장이 된다.



마지막으로, 매번 복잡한 명령을 타이핑 하기 귀챦으므로 위의 명령도 cmd 파일로 만들면
더욱 편리해진다.


aaa.cmd
@for %%i in (*.mp3) do @call convdel1.cmd %%~ni


    c:\>aaa


한가지 달라진 점이 있는데, for를 cmd 파일 안에서 수행하려면 변수를 '%%i' 처럼
%를 두 번 써야 한다.

이런 식으로 배치 파일을 만들면 다른 여러 가지 명령과 조합으로 쓸 수 있기 때문에
더욱 편리하며 작업 시간을 단축시킬 수 있다.




개발을 하면 대량의 데이터를 처리해야 하는 경우가 많은데
이런 경우 배치 파일은 필수라고 할 수 있다.
아무리 화려하고 편리해보이는 GUI가 있다고 해도 특정한 목적을 가진 일괄 작업을
하게 만들 수는 없기 때문이다.

그래도 윈도우의 cmd는 Unix 계열의 Shell 처럼 강력하지는 않기 때문에
이것보다 더 복잡한 컨트롤이 필요하다면 Perl을 쓰면 될 것 같다.



* Sample )



SET KWD=*.fmb
SET MOD=FORM
if /i "%1"=="f" (
SET KWD=*.fmb
SET MOD=FORM
)

if /i "%1"=="m" (
SET KWD=*.mmb
SET MOD=MENU
)
if /i "%1"=="l" (
SET KWD=*.pll
SET MOD=LIBRARY
)
for %%i in (%KWD%) do (
echo  ^- %%i  ^> 컴파일 합니다. 
ifcmp60 %%i CAPO/CAPO@capowms batch=yes compile_all=yes window_state=minimize module_type=%MOD%
)




댓글 없음:

댓글 쓰기