들어가며
앞서 매개변수의 의미와 자기자신(?)을 출력하는 배치파일을 소개했다.
이 글에서는 매개변수를 활용하여 프로그램을 작성해 보자.
말뜻
매개변수, 곧 파라미터(parameter)는 도스와 윈도의 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다. 자주 언급되었던 ECHO OFF 명령에서 실제 명령어는 ECHO뿐이고, OFF는 매개 변수이다. 명령줄에서 명령어 뒤에 죽 나열하는 문자열은 대개 매개변수이다.
또한 매개변수 전달이란 명령줄에 입력한 명령과 매개변수를 프로그램에서 사용할 수 있는 형태로 알려주는 일을 가리킨다. 이를 위해 배치파일은 %n의 꼴을 사용한다.
- @echo Hello %0!
앞서 사용했던 저 한 줄짜리 코드 마지막에 붙은 %0와 같은 꼴로 쓰인다는 뜻이다.
매개변수를 정확히 알기
매개변수 %0과 %*
지금까지 말한 매개변수는 정확하지 않다. 물론 그와 같은 설명이 틀렸다는 말이 아니다. 그러나 엄밀히 말하면 옳지는 않다.
- @rem HelloWho.cmd
- @echo Hello %0, %*!
첫줄은 주석이므로 적든지 말든지 알아서 하기 바란다. 둘째 줄이 실제 실행 코드이다.
아무튼 아래 그림을 보고 여러 가지로 적용해 보기 바란다.
위의 그림을 보면 매개변수 %0은 배치파일 자신이 아님을 알 수 있다. 만약 매개변수 %0으로 자신을 가리키게 했다면 매번 다른 결과가 나오지 않아야 하기 때문이다. 다른 의미로 매개변수 %0은 명령줄에 입력된 첫번째 인자를 가리킨다는 뜻이다. 컴퓨터에서 첫번째 인자를 0번으로 표기하는 일이 잦으므로 그다지 놀라운 일은 아니다.
또한 위의 코드에서 %0과 %*를 나누어 썼다는 점에서 한 가지를 알 수 있다. %0은 일반적인 매개변수와는 다르게 취급된다는 점이다. %*는 "명령줄에 입력된 모든 매개변수"라는 뜻임에도 불구하고 %0을 제외하고 있음에서 그것을 알 수 있다.
다른 매개변수
매개변수는 앞서 말했듯이 %n의 꼴로 나타낸다. 이때 n은 일반적으로 숫자이고, 특별한 경우에 *(별표)가 올 수 있다. 이 말은 곧 %10과 같은 매개변수는 존재하지 않는다는 뜻이다. 숫자와 수를 구별하자. 10은 수이지만, 숫자는 아니다. 그에 따라 %n의 꼴로 나타낼 수 있는 매개변수는 %0, %1, %2, %3, %4, %5, %6, %7, %8, %9, %*, 이렇게 열한 개이다.
하지만 위에서는 분명히 "%10"에 해당하는 매개변수를 전달 받았다. 물론 그것은 사실이다. 다만 %10과 같은 매개변수가 존재하지 않을 뿐이고, 명령줄에서 입력받는 매개변수는 컴퓨터의 기억장치 어딘가에 저장되어 있다는 뜻이다. %*는 자신이 가진 특별한 기능, 곧 %0을 제외한 모든 매개변수를 불러오는 기능을 사용해서 처리했을 뿐이다.
- @rem HelloWho2.cmd
- @echo Hello %0, %*!
@echo Hello %0, %1 %2 %3 %4 %5 %6 %7 %8 %9!
두 코드의 차이를 보이기 위해 한꺼번에 작성했다.
다른 매개변수를 넣어서 시험해 보기 바란다.
%* 정확히 알기
아까 알려주고는 뭘 또 정확히 알자고 그러냐고? 아까 그것은 %0과 함께 알려준 내용이고, %*은 다른 매개변수와는 조금 다른 점이 있다는 말씀!
%*을 편의상 별 매개변수라고 부르자.
이 별 매개변수는 매개변수 자체를 다루지 않는다. 헉! 무슨 헛소리를 하느냐고? 정말이다. 이 별 매개변수 녀석이 다루는 것은 명령줄 자체이다.
윗줄은 분명히 별 매개변수를 이용하여 출력하였고, 아랫줄은 %n의 꼴로 출력하였다. 별 매개변수가 명령줄을 다룬다는 뜻은 위와 같이 매개변수 사이에 있는 공백까지 문자(공백문자)로 인식하여 전달 받았음을 뜻한다. 반면에 %1, %2 등은 공백문자로 나뉜 각각의 매개변수를 전달 받아 이용하고 있다.
매개변수 활용
예제 5에서 윈도 폴더를 보여주는 배치파일을 만들었다. 그것을 고쳐서 사용자가 지정하는 폴더(엄밀히 말하면 디렉터리)를 보여주는 배치파일을 만들자.
D:\Usr\LCP\바탕 화면\배치파일>dir /?
디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.
DIR [드라이브:][경로][파일 이름] [/A[[:]특성]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]정렬 순서]] [/P] [/Q] [/S] [/T[[:]시간 필드]] [/W] [/X] [/4]
[드라이브:][경로][파일 이름]
나타낼 드라이브, 디렉터리 및/또는 파일을 지정합니다.
/A 지정된 특성을 가진 파일을 보여줍니다.
특성 D 디렉터리 R 읽기 전용 파일
H 숨김 파일 A 기록 파일
S 시스템 파일 - 부정을 뜻하는 접두사
/B 최소 형식을 사용합니다 (머리말 정보나 요약 없음).
/C 파일 크기에 1000단위로 분리 기호를 보여줍니다. 이것은 기본값
입니다. 분리 기호를 표시하지 않으려면 /-C를 사용하십시오.
/D /W와 같으나 세로로 배열하여 보여줍니다.
/L 소문자를 사용합니다.
/N 파일 이름이 제일 오른쪽에 오도록 새로운 긴 목록 형식을
사용합니다.
/O 파일을 정렬된 순서로 보여줍니다.
정렬순서 N 이름순(문자 순서) S 크기순(작은 것 먼저)
E 확장명순(문자 순서) D 날짜/시간순(가장 이전 것 먼저)
G 그룹 디렉터리 먼저 - 순서를 반대로 하는 접두 기호
/P 정보가 한 화면에 꽉 차면 잠깐 멈춥니다.
/Q 파일 소유자를 보여 줍니다.
/S 지정한 디렉터리와 하위 디렉터리를 포함하여 보여줍니다.
/T 정렬에 사용할 시간 필드를 지정합니다.
시간필드 C 작성한 시간
A 마지막 액세스한 시간
W 마지막 기록한 시간
/W 이름만 가로로 배열하여 보여줍니다.
/X 8.3 파일 이름이 아닌 파일에 대한 짧은 이름을 보여줍니다.
이 형식은 긴 이름 앞에 짧은 이름이 추가된 것으로 /N 형식과
같습니다. 짧은 이름이 없으면 공백을 보여줍니다.
/4 4자리수 연도를 표시합니다.
스위치를 DIRCMD 환경 변수로 미리 설정할 수 있습니다. 하이픈(-)을
스위치 앞에 접두 기호로 주면 미리 설정된 스위치에 우선합니다. (예, /-W)
D:\Usr\LCP\바탕 화면\배치파일>
우선 명령줄에서 dir /? 라고 명령을 주면 위와 같은 내용을 보여준다. "/문자"의 꼴로 나타나는 것이 매개변수 가운데 선택사항(옵션)이다.
이 가운데 우리가 사용할 선택사항은 /a /p /4 이다. 더 추가하고 싶으면 스스로 선택하기 바란다. 셸 내장 명령어는 선택사항을 줄 때 대부분 대문자/소문자를 가리지 않는다. 그래서 앞의 세 선택사항은 /A /P /4 와 같은 의미이다.
- @echo off
- rem 예제 10 : 사용자가 지정하는 폴더를 보여주는 배치파일
- rem 파일명 : exam10.cmd
- rem 지은이 : koc2000/SALM
- rem 저작권 : GPL v3
- echo 예제 10.
- echo 사용자가 지정하는 폴더를 보여준다.
- echo 보다가 종료하려면 Ctrl+Pause 키나 Ctrl+C를 누르시오.
- PAUSE
- echo.
- DIR /A /P /4 %1
맨 마지막 줄이 이 배치파일의 핵심이다. 사실 저 한 줄만 있어도 실행에는 전혀 지장이 없다. 저대로 실행해 보고 나서 의문이 생긴다면 글 남기세요.
과제
다들 싫겠지만, 약간의 과제를 내겠다.
- ECHO 명령을 이용하여 화면에 OFF라는 세 글자를 출력하시오. 예시 화면은 다음과 같다.
OFF의 위치나 대/소문자 등은 자신이 좋아하는 위치와 형태를 따르면 된다. 위와 같이 세 번 나타낼 필요는 없다. 1회만 출력하면 된다. 저것을 입력하기 위해 배치파일에 Echo off 라고 하면 아무것도 출력되지 않는다. 어떻게 해야 출력할 수 있는지는 스스로 탐구해야 한다. 이 문제도 알고 나면 너무 쉽다. 다만 O F F 처럼 띄어쓰기를 하면 안 된다.
- DIR 명령을 이용하여 원하는 폴더(디렉터리)의 내용을 폴더(디렉터리)만 보여주도록 한다. /A /P 선택사항을 반드시 사용할 것. 예시 화면은 다음과 같다.
다음 예고
IF 이용하기
이 글은 스프링노트에서 작성되었습니다.
'스크립트 > 배치파일' 카테고리의 다른 글
IF 기본 설명 (6) | 2009.04.09 |
---|---|
배치파일에 매개변수 전달하기 2 (5) | 2009.04.04 |
배치파일 멈추기 (1) | 2009.03.29 |
그밖에 출력 (2) | 2009.03.26 |
주석 및 화면 출력 (3) | 2009.03.23 |