노무현 대통령 배너
BLOG main image
왕미친놈의 왕미친세상입니다. 미친 소리는 써도 되지만, 근거 없는 소리는 쓰면 안 됩니다.


필터 설정 함수

[code php]2:1 reduce        설정 함수 없음.
2:1 reduce (HQ)        설정 함수 없음.
3x3 average        설정 함수 없음.
blur            설정 함수 없음.
blur more        설정 함수 없음.[/code] [code php]box blurvoid Config(int width, int power);
brightness/contrast    void Config(int brightness, int contrast);[/code] [code php]deinterlace        void Config(int mode);[/code]

0=섞음(blend), 1=복제1(dup1), 2=복제2(dup2), 3=버림1(discard1), 4=버림2(discard2), 5=겹치지 않음(unfold), 6=겹침(fold)

[code php]emboss            void Config(int direction, int height);
field swap        설정 함수 없음.[/code] [code php]fill            void Config(int x1, int y1, int x2, int y2, int color);[/code]

x1...y2: 픽셀 입력, 색상은 24비트 RGB (HTML 코드처럼 입력. 다만 # 대신 0x 사용)

[code php]flip horizontally    설정 함수 없음.
flip vertically        설정 함수 없음.
general convolution    void Config(int c0, int c1, int c2, int c3, int c4, int c5, int c6, int c7, int c8, int bias, int clip);
grayscale        설정 함수 없음.[/code] [code php]hsv            void Config(int h, int s, int v);[/code]

h: 색조(Hue) 조정, 0...65535 -> 0~360 도
s: 채도 배율, 0...131072 -> 0~200 %
v: 명도 배율, 0...131072 -> 0~200 %

[code php]invert            설정 함수 없음.[/code] [code php]levels            void Config(int inputlo, int inputhi, int gammacorr, int inputmid, int outputlo, int outputhi);
           void Config(int inputlo, int inputhi, int gammacorr, int inputmid, int outputlo, int outputhi, int lumaonly);[/code]

모든 인수는 0~255 값을 가집니다. 다만, 24비트 고정 소수점 수로 표현되는 gammacorr 인수 제외.

만약 lumaonly 인수가 0 이 아니면 필터는 RGB 대신에 luma로 작동합니다.

[code php]logo            void Config(string logoFile, int xpos, int ypos, int alphaEnable, int premultDisable, int xj, int yj, int opacity);
           void Config(string logoFile, int xpos, int ypos, string alphaFile, int premultDisable, int xj, int yj, int opacity);[/code]

logoFile:     로고 이미지의 파일명

xpos, ypos:     원점으로부터의 위치 (픽셀) (xj/yj 참조)

alphaEnable:    0 이 아니면 픽셀 단위의 투명도 켜기. 투명도는 알파 채널에 바탕을 두고 있다.

premultDisable:    0 이 아니면 미리 곱해지지 않은 알파값(non-premultiplied alpha) 이용

xj:        수평 조정

0 - 왼쪽
1 - 가운데
2 - 오른쪽

yj:        수직 조정

0 - 위
1 - 가운데
2 - 아래

opacity:    완전한 로고 위의 알파 상수, 0...65536

[code php]null transform        설정 함수 없음.[/code] [code php]resize            void Config(int w, int h, int/string mode);
           void Config(int w, int h, int/string mode, int framew, int frameh, int color);[/code]

필터 모드:

0     "가장 가까운 (nearest)" 또는 "점 (point)"
1    "이중 선형 (bilinear)"
2    "쌍삼차 (bicubic)"[각주:1]
3    (정밀한 이중 선형. 문자열 없음)
4    (정밀한 쌍삼차, 문자열 없음)

[code php]rotate            void Config(int mode);[/code]

0=좌로 90도, 1=우로 90도, 2=180도

[code php]rotate2            void Config(int angle, int filtmode, int color, int expandbounds);[/code]

angle : 24비트 소수 (16777216 = 360도)

filtmode : 0=점(point), 1=이중 선형, 2=쌍삼차

[code php]sharpen            void Config(int power);
smoother        void Config(int threshold, int use_blur_pass);
threshold        void Config(int threshold);
temporal softener    설정 함수 없음.
(motion blur)
temporal smoother    void Config(int power);[/code] [code php]TV            void Config(mode);[/code]

0=Y, 1=I, 2=Q, 3=avg3x3, 4=avg5x5, 5=5x5+tmp, 6=chromaup, 7=chromadown

다른 필터

도널드 그래프트(Donald Graft)의 스마트 디인터레이서(smart deinterlacer; 스마트한 인터레이스 제거기)의 버전이 VirtualDub 프로그램에 포함되어 있습니다.

[code php]void Config(int motion_only, int blend, int luma_threshold, int scene_threshold);[/code]

내 자막 표시기:

[code php]void Config(int enable_supersampling, string script_filename);[/code]

다른 것들은 당신이 필터 제작자에게 요청해야 합니다.

객체 : VirtualDub.audio.filters (VirtualDub 1.5 이상)

이 하위 객체는 필터 그래프를 고급 음향 모드(advanced audio mode)로 제어합니다.

[code php]void Clear();[/code]

고급 필터 그래프에서 모든 필터를 제거합니다.

[code php]int Add(string name);[/code]

그래프에서 음향 필터를 추가합니다. 필터의 이름은 UTF-8로 인코딩됩니다. 필터의 ID#를 반환합니다.

[code php]void Connect(int srcfilt, int srcpin, int dstfilt, int dstpin);[/code]

원본 필터(srcfilt/srcpin)에 있는 출력 pin으로부터 대상 필터(dstfilt/dstpin)에 있는 입력 pin까지 두 필터 사이의 연락을 짓습니다. 두 필터와 pin 번호는 0부터 시작합니다.

객체 : VirtualDub.audio.filters.instance[nFilt] (VirtualDub 1.5 이상)

nFilt 인수는 0부터 시작하는, 필터 그래프에서의 음향 필터의 색인입니다.

[code php]void SetInt(int parmidx, int value);
void SetLong(int parmidx, int valuehi, int valuelo);
void SetDouble(int parmidx, int valuehi, int valuelo);
void SetString(int parmidx, string value);
void SetRaw(int parmidx, int length, string base64value);[/code]

음향 필터를 위한 설정 매개변수를 설정합니다.

"parmidx" 인수는 설정 매개변수의 색인입니다.

long 형(64비트 정수형) 및 double 형(64비트 부동 소수점형) 매개변수를 위해, 먼저 해석된 상위 32비트를 가지고 값은 2개의 32비트 정수로 나뉩니다. (the value is broken into two 32비트 integers, with the high 32비트s being passed first.)

문자열 매개변수를 위해, 문자열 값은 UTF-8 코드와 같은 유니코드 문자열로 인코딩됩니다.

raw (binary) 매개변수를 위해, "length" 인수는 인코딩되지 않은 길이를 바이트 단위로 참조합니다. 그리고 "base64value" 인수는 MIME BASE64 인코딩을 사용하여 인코딩된 바이너리 데이터입니다.

[code php]void SetLong(int parmidx, long value);        // [VirtualDub 1.6 이상]
void SetDouble(int parmidx, double value);    // [VirtualDub 1.6 이상][/code]

이 오버로드는 1.5 버전에서 같은 이름의 raw 메소드에 해당합니다. 그 함수들이 long 형 및 double 형 변수를 직접 다루는 경우는 제외합니다.

음향 필터 매개변수

그것들은 VirtualDub 1.5.6 버전에 내장된 음향 필터를 위한 설정 매개변수입니다.

필터 Index/자료형 설 명
Gain 0 (double) 이득 계수[각주:2] (-8.0 ~ 8.0)
New rate 0 (uint32) 새로운 진동수 (단위 Hz)
Ratty pitch shift 0 (double) 음조를 일정 비율로 옮김 (0.5 to 2.0)
Lowpass/highpass 0 (uint32)
1 (uint32)
진동수 분리 (단위 Hz)
필터 탭 (대략의 품질)
Resample 0 (uint32)
1 (uint32)
새로운 진동수 (단위 Hz)
필터 탭 (대략의 품질)
Stretch 0 (double) 샘플링 속도(샘플링 레이트) 늘이기 (0.25 ~ 4.0)

VirtualDub.jobs 파일 형식

VirtualDub 프로그램에서 작업(Jobs)은 일반적인 텍스트 형식(plain text format)의 스크립트로서 저장됩니다. 그 스크립트는 추가적인 제어 매개변수를 가진, 특별한 형식을 가진 텍스트 문자열입니다. 그 작업 제어 파일을 직접 편집하기보다 VirtualDub 프로그램이 그 작업 제어 파일을 변경하도록 하는 것이 낫습니다. 하지만 텍스트 편집기 또는 외부 프로그램에서 편집하는 것이 유용합니다.

모든 제어 행은 달러 기호($)로 시작하는 토큰을 가진 주석 행이며, 그 행에는 선택적으로 행마다 오직 하나의 제어 연산(control op)을 가진 인수가 뒤따릅니다.

[code php]// $numjobs 3[/code]

이 행은 3개의 작업이 이 파일 안에 있다고 VirtualDub 프로그램에 알려줍니다. 평범한 스크립트로서 작업 파일(job file)을 실행할 수 있으며, 스크립트가 아닌 모든 명령은 주석으로서 저장됩니다. 작업 제어(job control)에서 오류 제어가 어렵더라도 각각의 부분은 분할된 스크립트로서 실행되며, 하나의 스크립트 안에서 생긴 오류는 다른 것의 실행을 막도록 오류는 그 분할된 스크립트 사이에 격리됩니다.

각각의 파일에서 추가적인 작업의 형식은 다음과 같은 형식을 가집니다.

[code php]    // $job "Job 1"
    // $input "f:\mkrtest.avi"
   // $output "f:\test.avi"
   // $state 2
   // $start_time 01c01df3 c2eb68c0
   // $end_time 01c01df3 eb3d85b0
   // $script

   <스크립트 명령>

   // $endjob[/code]

작업($job) 및 입력 파일명($input), 출력 파일명($output) 토큰은 이스케이프 문자를 포함할 수 없는 문자열임을 기억하십시오. 또한 입력 및 출력 파일명은 화면 표시용으로 쓰입니다. 그것들은 스크립트와 일치해야 하며 그것들을 변경해서는 안 됩니다(they should match the script but changing them will not change the files used.).

상태 ($state) 토큰은 작업 항목의 실행 상태를 제어합니다.:

0 WAITING 작업은 당장에라도 실행될 수 있습니다.
1 INPROGRESS 작업이 현재 실행중입니다. 작업 파일을 읽어왔을 때 VirtualDub 프로그램에서 이 태그가 보이면 작업이 중단된 것으로 봐야 합니다. 그리고 작업은 ABORTED 상태로 바뀝니다.
2 DONE 작업이 완료됐고, 실행될 필요가 없습니다.
3 POSTPONED 작업은 이미 실행되었으나 사용자가 연기시켰습니다. 따라서 생략되어야 합니다.
4 ABORTED 작업은 시작되었으나 완료되지는 않았습니다. 사용자가 WAITING 상태로 바꾸지 않는 한 VirtualDub 프로그램은 이 작업을 다시 시도하지 않습니다.
5 ERR

이 작업을 실행하는 동안 오류가 발생했습니다. 사용자가 WAITING 상태로 바꾸지 않는 한 VirtualDub 프로그램은 이 작업을 다시 시도하지 않습니다.

$start_time 및 $stop_time 토큰은 각각의 주어진 작업이 시작하고 멈추는 시간을 포함합니다. 시간은 두 개의 32비트 16진수 값으로서 저장됩니다. 첫 번째 것은 Win32 FILETIME 구조체의 dwHighDateTime 값이고, 두 번째 것은 dwLowDateTime 값입니다.두 값에서 0 (Zero)은 그 항목을 위한 어떤 시간도 가리키지 않습니다. 시작 시간 없이 멈춤 시간을 가지고 있음은 이해할 수 없습니다(It makes no sense to have a stop time without a start time.).

현재의 Sylia 스크립트는 $script 및 $endjob 표지를 하나로 몰아서 다루고 있습니다. 이것은 스크립트가 마지막―모든 작업 매개변수 명령보다 뒤에―에 와야 함을 뜻합니다. 이 스크립트에서, 다중 작업을 포함한, 어떤 명령이라도 실제로 유효합니다. 만약 다중 작업이 순서대로 나열될 필요가 있다면, 이것은 아마도 도움이 될 것입니다. 만약 처음 작업이 실패하면 다음 작업들은 실행할 수 없습니다. 호출 당시의 환경이 무엇이든 간에 스크립트는 실행합니다. 그래서 스크립트는 모든 매개변수를 알맞게 설정할 필요가 있습니다. 그리고 스크립트는 변수가 어떤 특별한 방법으로 설정된 구성인지를 추정할 수 없습니다.

이 글은 스프링노트에서 작성되었습니다.

  1. "bicubic" 은 쌍삼차 또는 겹삼차로 불리며, 3차로 부르기도 한다. 이는 보간법(interpolation)에서 자주 쓰이는 삼차 보간법(cubic interpolation)이 쌍삼차 보간법(bicubic interpolation)이기 때문이다. [본문으로]
  2. Gain factor입력에 대한 출력의 비율을 가리키는 표현으로 여겨집니다. 이와 비슷한 표현이 전기학에서 이득 계수이기에 그렇게 옮겼습니다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

스크립트 함수 레퍼런스

모든 함수는 객체의 멤버 함수입니다. 예컨대 Open() 함수는 VirtualDub 객체의 멤버 함수이고, 다음과 같이 접근합니다.:

[code php]VirtualDub.Open(...);[/code]
  • 경고 : 대부분 또는 모든 함수는 어떤 매개변수의 유효함을 알아낼 수 없다는 하에서 당신이 올바르지 않은 매개변수를 제공하면 데이터가 파괴될 수 있습니다. -10x-10 크기 변경 필터(resize filter)를 적용하는 것과 같은 어리석인 짓은 시도하지 마십시오.

객체 : Sylia

[code php]void dprint(int/string value);[/code]

이름 있는 문자열 또는 변수를 디버그 출력으로 인쇄한다.

[code php]void messagebox(string text, string caption);   // (VirtualDub 1.6.2 이상)[/code]

메시지 박스를 화면에 표시한다.

    NOTE:    메시지 박스는 VirtualDub 프로그램이 배치 또는 명령행 모드에서 실행 중이더라도 화면에 표시됩니다. 그래서 이것은 제작 스크립트에서는 사용하지 않는 것이 최선입니다.

[code php]string ToString(int);            // (VirtualDub 1.6.2 이상)
string ToString(long);            // (VirtualDub 1.6.2 이상)
string ToString(double);        // (VirtualDub 1.6.2 이상)
string ToString(string);        // (VirtualDub 1.6.2 이상)[/code]

수치 변수를 십진수 형식의 문자열로 변환합니다.

문자열-문자열 변환 버전은 아무것도 하지 않습니다. 그리고 문자열-문자열 변환 버전은 편의상 디버깅을 위해 임의 형식의 식을 화면에 표현하는 방식으로 존재합니다.

[code php]int Atoi(string s);            // (VirtualDub 1.6.5 이상)
long Atol(string s);            // (VirtualDub 1.6.5 이상)
double Atod(string s);            // (VirtualDub 1.6.5 이상)[/code]

문자열을 정수(int), 긴 정수(long int), 배정도 실수(double)로 변환합니다. 문자열은 숫자 표현이 유효하지 않기 때문에 변환에 실패하면 알 수 없는 오류가 나타납니다. 이러한 함수는 명령행 매개변수 문자열을 수치 형식으로 변환하는 데 유용합니다.

객체 : VirtualDub

[code php]void SetStatus(string text);[/code]

VirtualDub 창 아래쪽에 있는 상태 표시줄에 나타낼 텍스트를 설정합니다.

[code php]void Open(string filename, int type, int xopts);
void Open(string filename, int type, int xopts, string xoptstring);[/code]

동영상 파일을 연다. 형식은 다음 가운데 하나입니다.

[code php]   0   자동
  1   AVI
  2   MPEG-1
  4   스트립 AVI
  5   AVI through AVIFile (Avisynth)[/code]

xopts 값이 0 이 아니면, VirtualDub 프로그램은 파일을 확장된 열기 옵션으로 연다. xoptstring 값이 없으면, 대화상자가 열리고, 그게 아니면 xoptstring 문자열이 바이너리 옵션 구조의 MIME BASE64 방식으로 인코딩된 문자열로 처리됩니다.

[code php]void Open(string filename, string type, int xopts);
void Open(string filename, string type, int xopts, string xoptstring);    // (VirtualDub 1.5.5 이상)[/code]

이것은 우선권을 가진, 1.5.5 버전 이상에서 나타나는 Open() 함수의 형식입니다. 번호를 다루는 대신에, 그것은 형 이름을 다룹니다. 다음과 같은 형 이름이 있습니다.

[code php]   "Audio/video interleave input driver (internal)"
  "AVIFile/Avisynth input driver (internal)"
  "Image sequence input driver (internal)"
  "MPEG-1 input driver (internal)"[/code] [code php]void Open(string filename);        // (VirtualDub 1.6.5 이상)[/code]

그것은 파일 형식을 결정하는 자동 검출 모드를 항상 이용하는 Open() 명령의 더 간단한 형식입니다.

[code php]void Append(string filename);[/code]

추가적인 동영상 세그먼트(칸살)를 현재 파일에 덧붙입니다.

[code php]void Close();[/code]

현재 입력 파일을 닫습니다.

[code php]void Preview();[/code]

현재 설정 값으로 현재 파일의 미리보기를 실행합니다. 이것은 File > Preview 메뉴에 해당합니다.

[code php]void SaveAVI(string filename);[/code]

AVI2 형식으로 출력 파일을 만드는 처리 엔진을 실행합니다.

[code php]void SaveCompatibleAVI(string filename);[/code]

AVI1 형식으로 출력 파일을 만드는 처리 엔진을 실행합니다.

[code php]void SaveSegmentedAVI(string filename, int spacethresh, int framethresh);[/code]

다중 AVI 파일로 출력 파일을 만드는 처리 엔진을 실행합니다. spacethresh 값은 메가바이트 값으로 나타낸 파일의 최대 크기이고, framethresh 값은 최대 프레임 수입니다. framethresh 값이 0 이면 무시됩니다.

[code php]void SaveImageSequence(string prefix, string suffix, int mindigits, int format);
void SaveImageSequence(string prefix, string suffix, int mindigits, int format, int quality);    // (VirtualDub 1.6.0 이상)[/code]

"prefix#suffix" 형식을 가진 파일명으로 이미지 시퀀스[각주:1]를 저장합니다. # 기호는 시퀀스 번호인데, 중간의 수치 값에 0을 덧붙인 형태입니다. format 값은 만들어지는 파일의 형식을 기술합니다.[각주:2]

[code php]   0 - Windows BMP
  1 - TARGA
  2 - JPEG      (VirtualDub 1.6.0 이상)[/code] [code php]void SaveWAV(string filename);        // (VirtualDub 1.4d 이상)[/code]

WAV 형식으로 출력 파일을 만드는 처리 엔진을 실행합니다.

[code php]void RunNullVideoPass();        // (VirtualDub 1.6.5 이상)[/code]

동영상 전용 모드(video-only mode) 처리 엔진을 실행합니다. 그러나 출력은 버립니다(사용하지 않습니다). 이것은 사용 가능한 출력을 만들지 않는 과정(pass)을 분석하는 데 동영상 필터 또는 코덱을 사용할 때 유용합니다.

[code php]void Log(string output);        // (VirtualDub 1.6.5 이상)[/code]

로그에서 정보 우선순위에 따라 항목을 출력합니다. VirtualDub 프로그램이 명령행에서 실행될 때, 텍스트는 또한 표준 출력으로 출력됩니다.

객 체 : VirtualDub.video

[code php]int GetDepth(int var);
void SetDepth(int var, int value);[/code]

var 변수가 0 이면, 이 함수들은 입력 색상에 영향을 주고, 그게 아니면 출력 색상을 다룹니다. GetDepth() 함수는 0 또는 1, 2 값을 반환합니다. SetDepth() 함수는 색상의 비트 값과 같은 16 또는 24, 32를 돌려줍니다. 나는 그것들이 왜 일치하지 않는지를 알지 못합니다.

당신에게 SetInputFormat() 및 SetOutputFormat() 함수 대신에 그것을 사용하라고 권고했습니다. 16/24/32비트 설정은 XRGB1555/RGB888/XRGB8888 형식에 각각 해당합니다.

[code php]void SetInputFormat(int format);    // (VirtualDub 1.6.0 이상)
void SetOutputFormat(int format);    // (VirtualDub 1.6.0 이상)[/code]

비디오 작업에 쓰일 입력 및 출력 형식의 우선권을 설정합니다.

[code php]0    자동 검출 / 입력과 같음
5    XRGB1555    16비트 555 RGB
6    RGB565        16비트 565 RGB
7    RGB888        24비트 888 RGB
8    XRGB8888    32비트 888 RGB + 투명도 (dummy alpha)
9    Y8        휘도만 적용 [16, 235]
10    YUV422_UYVY    4:2:2 YCbCr 인터리브, UYVY순
11    YUV422_YUY2    4:2:2 YCbCr 인터리브, YUY2순
14    YUV422_Planar    4:2:2 YCbCr 2차 평면 (YV16)
15    YUV420_Planar    4:2:0 YCbCr 2차 평면 (YV12/I420)
17    YUV410_Planar    4:1:0 YCbCr 2차 평면 (YVU9)[/code] [code php]int GetMode();
void SetMode(int mode);[/code]

동영상 작업 모드 설정:

[code php]      0   직접 스트림 복사 (direct stream copy)
     1   빠른 재압축 (fast recompress)
     2   느리 재압축 (slow recompress)
     3   전체 작업 모드 (full processing mode)[/code] [code php]int GetFrameRate(int var);
void SetFrameRate(int var, int value);[/code]

value 값을 조절하여 특별한 프레임 레이트를 설정하거나 얻습니다.:

[code php]   var=0    프레임 레이트 요소 골라내기. 1=모든 프레임
  var=1    새로운 프레임 레이트 (마이크로초 / 프레임); 0=변화 없음, -1=기간이 일치함을 뜻함
  var=2    0 이 아니면, TV 역화면이 가능[/code]

시 간이 같으면 TV 역화면(inverse telecine)으로서 골라내기를 하는 프레임 레이트 설정을 하지 않습니다. 그것은 작동하지 않습니다.

[code php]void SetTargetFrameRate(int hi, int lo);    // (VirtualDub 1.5.2 이상)[/code]

64비트 유리수(rational fraction. hi 나누기 lo)로서 프레임 레이트 변환을 위한 대상 프레임 레이트를 설정합니다. hi 및 lo는 모두 *부호 없는* 수입니다. 21억 4748만 3648 부터 42억 9496만 7295까지인 값은 32비트 음수 값에 해당하므로 그냥 지나칩니다.

1.6.7 버전에서는, long 형으로 해석되는 큰 값으로서 모든 값을 양수로서 지정할 수 있습니다. 그리고 함수에 알맞은 int 값으로 자동으로 변환합니다.

[code php]int GetRange(int var);
void SetRange(int startMS, int endMS);[/code]

특별한 범위 값을 얻거나 설정합니다. var=0 이면 시작 오프셋으로 사용되며, var=1 이면 종료 오프셋으로 사용됩니다. 시작 오프셋은 앞에서부터 밀리초 단위로 측정되고, 종료 오프셋은 끝에서부터 밀리초 단위로 측정됩니다. 그래요, 이것이 어리석인 짓임을 나도 알아요.

종료 오프셋이 단지 오프셋이기 때문에 이 함수들에서 사용하는 동영상 스트림의 길이를 결정하는 것이 가능하지 않습니다.

[code php]void SetRangeEmpty();                // (VirtualDub 1.6.5 이상)[/code]

현재 선택한 부분을 청소하지만, 작업 영역의 시작/끝 지점에 영향을 주지 않는다. 이것은 UI에서 Edit > Clear Selection (Ctrl+D) 메뉴에 해당하며, 스크립트를 실행한 뒤 화면에 보여주는 그럴듯한 선택 영역 제거하는 데 유용합니다.

[code php]int GetCompression(int var);[/code]

현재 선택된 압축기(compressor)를 위한 변수를 검색합니다.:

[code php]      var=0   압축기(compressor)를 위한 fccHandler ID를 반환합니다.
     var=1   최대 키프레임 간격을 반환합니다.
     var=2   품질 인수(quality factor)를 반환합니다. (0~10000).
     var=3   데이터 전송률(data rate)을 반환합니다. (0=데이터 전송률 없음).[/code] [code php]void SetCompression();
void SetCompression(string fccHandler, int keyrate, int quality, int datarate);
void SetCompression(int fccHandler, int keyrate, int quality, int datarate);[/code]

인수 없는 구문은 동영상 압축(video compression)을 꺼버립니다. 다른 두 구문은 동영상 압축기를 선택합니다. fccHandler가 정수 또는 문자열로 지정될 수 있음을 기억하십시오. 문자열이 4바이트보다 짧으면, 공백이 덧붙습니다.

[code php]void SetCompData(int length, string data);[/code]

동영상 압축기를 위한 개인 코덱 데이터를 설정한다. 동영상 압축(Video Compression) 대화상자에서 당신이 설정(Configure)을 클릭할 때 동영상 압축기는 변경됩니다. 이 데이터는 VirtualDub에서 분명치 않습니다. 그리고 단지 동영상 코덱에서 쓰이기도 합니다. length는 바이트로 나타낸 데이터 블록의 길이이고, data는 MIME BASE64 형식으로 인코딩된 데이터 블록입니다.

[code php]void EnableIndeoQC(int enableQC);[/code]

 

Ligos (이전에는 Intel) Indeo v4.x/5.x 동영상 코덱에서 빠른 압축(Quick Compress) 사용 가능 또는 사용 불가

[code php]void SetIVTC(int enableIVTC, int ivtcmode, int offset, int polarity);[/code]

TV 역화면(inverse telecine) 매개변수 설정.

[code php]   enableIVTC:   0 이 아니면 IVTC 사용 가능
  ivtcmode:   0=필드 기반, 1=프레임 기반
  offset:      IVTC 패턴을 위한 프레임 오프셋, -1=적합한 값
  polarity:   0=필드 A 우선, 1=필드 B 우선. offset=-1 때는 무시한다.[/code]

VirtualDub 1.4c 버전에 버그가 있습니다. 그 버전에서 오프셋 값이 불린 자료형(0 또는 1)으로 캐스트되는 일이 발생했습니다. 이것을 불행하게도 IVTC에 알맞은 설정을 만드는 일을 불가능하게 만들었습니다. 그 문제는 1.4d 버전에서 고쳐졌습니다.

[code php]int width;        // [VirtualDub 1.4d (12667) 이상]
int height;[/code]

읽기 전용 변수로 주어진 원본 동영상의 너비/가로(width) 및 높이/세로(height). 이 변수들은 원본 동영상이 존재하지 않으면 정의되지 않습니다.

객 체 : VirtualDub.audio

[code php]void GetMode();
void SetMode(int mode);[/code]

음향 작업 모드(audio processing mode)를 얻거나 설정한다.

[code php]   0   직접 스트림 복사 (direct stream copy)
  1   전체 작업 모드 (full processing mode)[/code] [code php]int GetInterleave(int var);
void SetInterleave(int enabled, int preload, int interval, int is_ms, int offset);[/code]

음향 인터리브 매개변수를 얻거나 설정한다.

[code php]   값 얻기   설정        설명
  var=0   enabled      0 이 아니면 음향 인터리브는 사용 가능(enabled)
  var=1   preload      밀리초 단위로 미리 읽기(preload)
  var=2   interval      밀리초 또는 프레임 단위의 인터리브 간격(Interleaving interval)
  var=3   is_ms      0 이 아니면 인터리브 간격은 밀리초 단위입니다. (is in milliseconds)
  var=4   offset      오프셋(offset)을 바꿉니다. (단위: 밀리초)[/code] [code php]int GetClipMode(int var);
void SetClipMode(int begin, int end);[/code]

음향 오려내기(audio clipping) 매개변수를 얻거나 설정합니다. begin (var=0) 변수는 동영상이 나왔을 때 음향이 바뀌도록 지정합니다. 이것은 거의 언제나 0 이 아닙니다. end (var=1) 변수는 음향이 동영상보다 길지 않도록 오려내도록 지정합니다. 이것 또한 거의 언제나 0 이 아닙니다.

[code php]int GetConversion(int var);
void SetConversion(int new_rate, int new_precision, int new_channels);
void SetConversion(int new_rate, int new_precision, int new_channels, int integral_rate, int high_quality);[/code]

음향 변환 매개변수를 얻거나 설정합니다.

[code php]   var=0 (new_rate)   Hz 단위의 새로운 샘플링 레이트(샘플링 속도, sampling rate); 0=변화 없음
  var=1 (new_precision)   새로운 정밀도(precision); 0=변화 없음, 1=8비트, 2=16비트
  var=2 (new_channels)   0=변화 없음, 1=모노, 2=스테레오[/code] [code php]void SetSource(int mode);
void SetSource(string file);[/code]

음향 원본을 설정합니다. mode=0 이면 음향 없음, mode=1 은 음향 입력. 문자열 형식은 외부 WAV 파일을 읽어옵니다.

[code php]void SetCompression();
void SetCompression(int wFormatTag, int nChannels, int wBitsPerSample, int nAvgBytesPerSec, int nBlockAlign);
void SetCompression(int wFormatTag, int nChannels, int wBitsPerSample, int nAvgBytesPerSec, int nBlockAlign, int cbData, string data);[/code]

음향 압축 형식을 설정합니다. 첫 형식은 음향 압축을 깨끗이 지웁니다. 둘째 및 셋째 형식은 표준 Win32 WAVEFORMATEX 구조로부터 매개변수를 지정합니다.

[code php]   wFormatTag   음향 압축 형식 지정
  nChannels   1=모노, 2=스테레오.
  wBitsPerSample   8 / 16 PCM. 다른 것으로 바꿀 수 있음
  nAvgBytesPerSec   말 그대로 초당 평균 바이트 수
  nBlockAlign   압축된 데이터 블록의 크기[/code]

개 인 데이터에 음향 압축기(audio compressor)를 사용할 때 주어지는 이 필드는 VirtualDub를 불분명하게 만듭니다.

[code php]   cbData      데이터의 크기 (단위: 바이트)
  data      MIME BASE64 형식으로 인코딩된 데이터 스트링[/code]

일반적으로, 당신은 압축기를 조회하는 것 또는 VirtualDub 프로그램이 저장한 작업 스크립트(job script)를 찾는 것에 의해 이 필드를 유도하기를 바랍니다. 왜냐하면 음향 압축기(audio compressor)는 단지 지정된 값을 받아들이는 경향이 있기 때문입니다. 몇몇, 그러나 전부는 아닌, 개인적인 데이터 형식은 Win32 Platform SDK 안의 MMREG.H 파일로 문서화되어 있습니다.

[code php]void SetVolume();    // [VirtualDub 1.4d (12667) or later]
void SetVolume(int v);    // [VirtualDub 1.4d (12667) or later]
int GetVolume();    // [VirtualDub 1.4d (12667) or later][/code]

현재의 음량(audio volume) 증폭 값을 얻거나 설정합니다. 음량은 8비트 고정 소수점 수로 나타냅니다. 256은 증폭 없음, 128은 절반의 음량, 512는 2배의 음량입니다. 빈 인수 형식의 SetVolume() 함수는 음량 증폭을 사용할 수 없도록 만듭니다.

객체 : VirtualDub.subset

부분 집합(subset)은 동영상 스트림 작업을 위한 편집 목록(edit list)입니다. 이것은 프레임 범위의 집합으로 이루어져 있습니다. 프레임 범위는 원본 스트림 안에 있는 작업될 수 있는 프레임을 가리키는 범위입니다. 프레임 번호는 0부터 시작합니다(zero-based).

1.5.4 이전 버전에서는, 부분 집합은 부득이 원본 순서대로 정렬된 범위(range)를 포함할 수밖에 없었습니다. 그래서 범위는 추가할 때마다 다시 정렬되었습니다. 1.5.5 버전부터는, 부분 집합은 복제본이나 원본과는 다른 순서로 반복되거나 이용되는 동영상 스트림의 일부를 허용하는 범위를 벗어난 것을 포함합니다. 최고의 호환성을 위하여, 범위는 항상 오름차순으로 추가하기를 권장합니다.

[code php]void Delete();[/code]

편집이 허용되지 않을 만큼 부분 집합을 지웁니다. 전체 원본 파일에서 작업합니다. 객체는 단지 시작/끝(start/end) 오프셋만을 작업합니다.

[code php]void Clear();[/code]

존재하는 어떤 부분 집합이라도 제거하고, 프레임을 가지지 않는 새로운 하나의 부분 집합을 만듭니다. 이 작업은 부분 집합 구성을 시작하려고 AddFrame()/AddRange() 함수를 호출하기 전에 이루어집니다.

[code php]void AddFrame(int start, int length);
void AddRange(int start, int length);    // [VirtualDub 1.4.10 이상][/code]

부분 집합에서 프레임의 범위를 추가합니다. 부분 집합 프레임은 격리되어야 합니다. 그것들은 서로 겹치지도 접촉하지도 않아야 합니다. (예컨대, [0,5]와 [5,5] 등으로 하지 마십시오.) 1.5.5 버전부터는, 겹치는 범위 또는 허용 범위를 벗어난 범위가 허용됩니다. 그러나 이웃하는 범위는 여전히 피해야 합니다.

AddRange() 함수는 1.4.10 버전에서 더 나은 이름의 동의어로서 추가되었습니다. 그것은 AddFrame() 함수와 같으며, AddFrame() 구문은 지금 비난을 받습니다(deprecated).

[code php]void AddMaskedRange(int start, int length);    // [VirtualDub 1.4.8 이상][/code]

부분 집합에서 마스크된 프레임의 범위를 추가합니다. 마스크된 프레임은 이전 프레임을 반복하는 프레임입니다. 이것은 손상된 데이터를 가진 것으로서 다른 용도로는 쓰이지 않는 프레임을 위한 위치 표시기로 쓰입니다.

객체 : VirtualDub.params (VirtualDub 1.6.1 이상)

[code php]string operator[](int index);        // (VirtualDub 1.6.1 이상)[/code]

불러오기 (/i) 명령행 스위치로부터 매개변수를 검색합니다. 매개변수 색인은 0부터 시작하는데, 그래서 params[0]은 첫 매개변수가 됩니다. 매개변수가 가리키는 것이 존재하지 않으면, 오류가 발생합니다.

객체 : VirtualDub.project (VirtualDub 1.6.5 이상)

[code php]void ClearTextInfo();            // (VirtualDub 1.6.5 이상)[/code]

출력 AVI 파일과 연결된 텍스트 정보를 지웁니다. 기본적으로 주석을 입력 파일로부터 읽어와서 보존합니다.

[code php]void AddTextInfo(string fourcc, string text);[/code]

이를 테면 제작자 및 이름 문자열과 같은, 다음(subsequent) AVI 출력 파일에 사용할 텍스트 주석을 추가합니다. fourcc 값은 표준 AVI 텍스트 주석의 한 종류로서, 예컨대 "ISBJ" 및 "IART" 등과 같은 네 문자로 된 코드(FOURCC)여야 합니다. text 라고 지정된 두 번째 매개변수를 기억하십시오. 그것은 전혀 가공하지 않은(raw) 8비트 문자열인데, AVI 파일로부터 직접 복사됩니다. 그리고 두 번째 매개변수는 UTF-8 형식이 아닙니다. 그것은 AVI 형식 자체가 그러한 문자열로 코드 페이지 인코딩하여 표현할 방법을 전혀 가지고 있지 않기 때문입니다.

객체 : VirtualDub.video.filters

[code php]void Clear();[/code]

필터 목록에서 모든 필터 인스턴스(instance)를 제거합니다.

[code php]void Add(string filter);       // [VirtualDub 1.4c 이하]
int Add(string filter);            // [VirtualDub 1.4d 이상][/code]

동영상 필터 목록의 맨 아래에 지정된 필터의 새로운 인스턴스를 추가합니다.

VirtualDub 1.4d 버전부터 이 함수는 추가된 필터의 인스턴스 번호를 반환합니다.

객체 : VirtualDub.video.filters.instance[nFilt]

nFilt 값은 0 부터 시작하는, 필터 인스턴스의 변경된 색인 값입니다.

[code php]void Remove();[/code]

목록에서 선택된 필터를 제거합니다. 이것은 그 뒤에 오는 필터의 색인을 변경합니다.

[code php]int GetClipping(int var);
void SetClipping(int x1, int y1, int x2, int y2);[/code]

잘라내기 매개변수를 입력받는 필터를 얻거나 설정합니다. var 변수는 0부터 3까지의 범위를 가지며, 이것은 각각 x1 및 y1, x2, y2 변수에 해당합니다. 모든 값은 모서리(edge)로부터의 픽셀 값입니다.

[code php]... Config(...);[/code]

이것은 아마도 동영상 필터가 제공하는 함수입니다. 사용자 정의 매개변수를 가지고 있다면, 일괄처리 모드(batch mode)로 작업하기 위한 필터가 필요합니다. 그러나 이 구성원(member)을 강요할 어떤 구문도 없고, 매개변수 구문은 각각의 필터에 변화를 줍니다.

  1. 이미지 시퀀스(image sequence) 및 시퀀스(sequence) 는 영화나 동영상의 한 장면을 뜻합니다. [본문으로]
  2. 최신 버전인 1.9.x 버전에서는 PNG 형식으로도 저장할 수 있습니다. 스크립트에서 지원하는지는 확인하지 못했습니다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

VirtualDub 스크립트 언어 레퍼런스, v0.7

들어가기에 앞서

이 글은 VirtualDub scripting language reference, v0.7(http://www.virtualdub.org/docs/vdscript.txt) 문서를 한국어로 번역한 글입니다. 당연한 말이겠지만, 번역의 신뢰도는 그다지 높지 않습니다. 그러므로 이 글로 원문을 대체하여 사용하는 일이 없기를 바라며, 어디까지나 원문의 이해를 돕는 데만 사용해야 합니다. 이 번역문을 믿음으로써 발생하는 모든 사고와 피해에 대해서는 아무런 책임을 지지 않습니다.

이 문서는 VirtualDub's scripts 부분을 번역하였습니다.

머리말

이것은 VirtualDub의 대단한 스크립트 인터페이스를 기술한 문서입니다. 나는 이것을 VirtualDub의 라이선스와 같은, GNU General Public License (GPL)로 발표합니다. 이 참조는 VirtualDub 1.6.7 (WIP) 때부터 통용되며, 그리고 아마도 그 이전 버전에는 적용되지 않을 터입니다. 나는 이 레퍼런스를 자주 다시 업데이트할는지도 모르니, http://www.virtualdub.org/ 페이지를 자주 확인하기 바랍니다.

나는 스크립트 인터페이스를 중요한 일반적인 인터페이스가 되는 것을 고려하지 않았음을, 따라서 나는 이것을 언제든지 없애버리는 것에 대해 아무렇지도 않게 생각하고 있음을 기억하십시오. 나는 작업 스크립트를 망치지 않으려고 호환성을 유지하려고 노력합니다.

그러나 나는 바보짓을 한 적 있습니다(V1.4b). 당신들에게 경고했습니다.

-- Avery Lee <phaeron@virtualdub.org>
   2005년 6월 9일

VirtualDub 스크립트

VirtualDub 일괄처리 시스템은 스트립트 언어에 바탕을 두고 있으며, 그 스크립트는 프로그램 디렉터리에 있는 VirtualDub.jobs으로 불리는 파일로 저장됩니다. 저장 대화상자에서 나중에 작업 단추(Defer button)[각주:1]를 클릭하면, 작업 처리를 시작할 정보가 이 파일에 기록됩니다. 이것은 텍스트 파일이며, 그래서 그것은 손수 편집할 수 있으며 외부 프로그램으로 만들 수도 있습니다. 당신은 어떻게 이 작업이 이루어지 익숙해질 때까지 몇 개를 만들어보기를 원할 것입니다.

도움말 파일에 기록된 명령행 옵션은 당신이 배치 파일 또는 다른 프로그램으로부터 VirtualDub을 스크립트와 함께 실행하는 것을 허용합니다. 당신이 이런 작업을 한다면 다음과 같은 사항을 주의해야 합니다.

1) VirtualDub.exe 파일을 고객의 응용 프로그램과 함께 압축 파일로 묶지 마십시오. GPL은 소스 코드 없이 바이너리만 배포하는 것을 금지합니다. (GPL을 자세히 읽고 소스코드를 다운로드하겠다고 요청하지 않은 최종 사용자에게 당신이 액세스를 허용했을 때부터, 이것은 전적으로 진실이지는 않다.) 더구나 나는 문서 및 도움말 파일이 제거된 VirtualDub 프로그램을 보는 것을 좋아하지 않는다. 그런 일을 하지 말아 주십시오.

2) 당신의 응용프로그램과 VirtualDub 프로그램 사이에 매우 확실한 차별을 두십시오. 당신이 외부 응용프로그램을 실행하고 있음을 사용자가 알게 하십시오. 그리고 무슨 일이 잘못되었는지를 알게 하십시오. 나는 단지 한 사건을 겪었습니다. 그러나 나는 외부 응용프로그램이 바보짓을 할 때 내 프로그램이 결점이 있다고 생각하는 사람들로부터 지원해 달라는 이메일을 받고 싶지는 않습니다. 나는 이미 충분히 많은 이메일을 받습니다.

3) 당신의 스크립트를 VirtualDub.jobs 파일에 저장하십시오. 그러나 그것이 이미 존재하는 이전 파일을 덮어썼다면 나중에 복원하십시오. 이것은 이미 존재하는 사용자 스크립트를 보호하며, 작업 파일(job file)에서 사용자에게 오류를 보여주는 대신 VirtualDub 프로그램이 오류를 기록하게 하고, 작업을 중단합니다.

4) VirtualDub 프로그램에 내장되지 않은 필터를 당신이 사용하려면, 그것을 *반드시* VirtualDub 플러그인 디렉터리에 설치해야 합니다. 그렇게 설치된 플러그인은 VirtualDub 프로그램이 시작할 때 자동으로 읽어옵니다. VirtualDub 프로그램은 현재 외부 필터를 스크립트에서 읽어오는 일을 허용하지 않습니다.

5) 당신이 배치 파일에서 VirtualDub 프로그램을 실행하려면, 당신은 "start /wait" [각주:2]를 사용하여 실행할 필요가 있습니다. 그게 아니라면 VirtualDub 프로그램을 읽어온 뒤에도 배치 파일이 계속 실행될 것입니다. 프로그램에서 이용하려면, CreateProcess()를 이용하여 VirtualDub을 실행하고, VirtualDub 프로그램이 작업을 완료할 때까지 기다리려면 WaitForSingleObject()를 이용하십시오.

VirtualDub 스크립트 시스템은 대개 사용자 인터페이스를 통하여 같은 조작법을 제공합니다. 거기에는 어떤 숨겨진 기능도 없습니다. 그리고 몇몇 옵션은 스크립트에서 설정할 수 없습니다. 스크립트에서 캡처 모드 사용은 완전히 불가능합니다. 그러므로 캡처 기능을 위해 윈도 VCR을 설정하려고 시도하지는 마십시오.

Sylia: 세계 최악의 스크립트 언어

내가 이 스크립트 언어를 만들었을 때 내가 생각한 것을 나는 모릅니다. 그것은 매우 느슨하게 C 언어에 바탕을 두고 있습니다. 나는 이것을 만들기 전에 버블검 크라이시스(Bubblegum Crisis)[각주:3]를 보았습니다. 단지 세 가지 형의 변수(void, int, string)가 있고, 세 가지 키워드가 정의되어 있었습니다.

[code php]declare    var;    전역 변수를 지정된 형 없이 선언.
true        1
false        0[/code]

모든 문장 또는 식이 선언되지는 않으며, 모든 문장은 세미콜론( ; )으로 끝나야 한다. 어떤 흐름 제어도 없습니다. 함수도 없고, 프로시저도 없습니다. if / while / for / switch / goto 명령도 없습니다. Sylia는 클래스 객체와 배열을 지원합니다. 그러나 스크립트에서 그것들은 정의될 수 없거나 또는 사례를 들어 증명할 수는 없습니다. 객체는 변수에 할당될 수 있으며, 다음과 같은 경우에 유효합니다.

[code php]declare foo;
foo = VirtualDub.video.filters;
foo.Add("bar");[/code]

배열과 멤버 함수의 이름은 또한 변수에 할당될 수 있습니다. 후자의 경우, 변수가 역참조될 때까지 기다리는 것이 오버로드 해결책입니다.

상수는 아마도 정수 또는 문자열(string)입니다. 정수는 32비트이며 부호가 있습니다. 그리고 십진수/8진수(앞에 0을 붙임)/16진수(앞에 0x를 붙임)로 지정할 수 있습니다. -1L과 같은 형 접미사는 허용되지 않습니다. 문자열은 큰따옴표( " " )로 감싸야 하지만, 다음과 같은 C 언어 이스케이프 문자를 포함할 수 있습니다.

[code php]\a, \b, \f, \n, \r, \t, \v, \xhh, \\, \"[/code]

문자열은 아마도 널(null)을 포함하지 않습니다.

다음과 같은 C 언어의 연산자를 수식에서 지원합니다.

[code php]=    할당
+    정수 더하기, 문자열 연결 또는 양수 부호(단항 연산자)
-    정수 빼기 또는 음수 부호(단항 연산자)
*    정수 곱셈
/    정수 나눗셈
%    나머지 연산
[]    배열 색인 연산자
()    집합 표시 또는 함수 역참조 연산자
.    객체 역참조 연산자
~    비트 부정 연산잔 (bitwise not)
&    비트곱 연산자 (bitwise and)
|    비트합 연산자 (bitwise or)
^    비트 배타합 연산자 (bitwise xor)
!    논리 부정 연산자 (logical not)
==    정수 비교 (같은)
!=    정수 비교 (다른)
<    정수 비교 (작은)
<=    정수 비교 (작거나 같은)
>    정수 비교 (큰)
>=    정수 비교 (크거나 같은)
&&    논리곱 (logical and)
||    논리합 (logical or)[/code]

우선 순위는 C 언어와 같습니다. 0으로 나누기와 나머지 연산은 약간의 매스꺼움을 야기하거나, 불안정을 유발하거나, 또는 스크립트 에러를 발생시킵니다.

UTF-8 문자열 인코딩 (VirtualDub 1.5.5 이상)

VirtualDub 1.5.5 버전부터, Windows NT/2000/XP 하에서는 응용프로그램의 일부가 유니코드로 실행됩니다. 이는 8비트(ANSI)로 나타낼 수 없는 문자를 가지는 파일명이 존재함을 뜻합니다. 스크립트 명령어는 내부 필터의 예외에 따라 파일명을 받아들입니다. 지금은 ANSI보다는 UTF-8을 받아들입니다. UTF-8은, 멀티바이트 시퀀스를 사용하여 인코딩된 U+007F 위의 코드 포인트를 제외하면, Win32에서 사용하는 유니코드 인코딩인 UTF-16과 비슷합니다.

VirtualDub은 스크립트를 저장할 때 C 언어 형식의 \x 이스케이프 문자열을 사용하는  UTF-8 시퀀스를 이스케이프합니다. 그래서 심지어 파일명을 나타내는 때에도 스크립트 파일에서 상위 비트 문자는 전혀 볼 수 없습니다. 이것은 1.5.5 버전에서 스크립트가 ANSI 파일로서 읽어올 수 있음을 뜻합니다.

UTF-8 인코딩 또는 유니코드 표준에 대한 더 많은 정보는 유니코드 웹사이트 http://unicode.org/ 를 살펴보기 바랍니다.

추가적인 데이터 형 (VirtualDub 1.6.0 이상)

VirtualDub 1.6.0 버전부터, Sylia 스크립트는 64비트 긴 정수(long integer) (l) 및 배정도 실수 (d) 형, 변수, 상수를 지원합니다. 해석기(interpreter)는 메소드 원형에 어울리는 데에 필요하다면 자동으로 형 변환을 합니다. 다중 오버로드가 가능하다면, 먼저 목록에서 하나가 사용됩니다.

꾸미지 않은 문자열(VirtualDub 1.6.1 이상)

  • 옮긴이 주 : “Undecorated strings”을 “꾸미지 않은 문자열”로 옮긴 까닭은 UTF-8 문자열로 인코딩하지 않은 상태 또는 C 언어 이스케이프 문자를 쓰지 않은 상태를 가리키기 때문입니다.

이스케이프된 역슬래시를 포함하는 문자열 경로는 배치 파일에서 만들어지기 어렵고, 몇몇 언어는 UTF-8 변환을 지원하지 않습니다. Sylia 스크립트는 문자열을 위한 대체할 수 있는 구문을 지원합니다. 앞에 u 또는 U 문자가 붙은 문자열은 꾸며지지 않은, ANSI 인코딩된 문자열처럼 다루어집니다. 예컨대:

[code php]VirtualDub.Open(U"e:\test\test.avi");[/code]

문자열은 명령어 시스템에서 다루어지기 전에 스크립트 시스템 안에서 시스템 ANSI 코드페이지에서 UTF-8로 자동으로 바뀝니다. 이것은 이스케이프 또는 텍스트 변환이 필요 없이 스크립트 안에 파일 경로를 직접 삽입하는 것을 허용합니다.

참고로 위의 예제를 ANSI 문자로 나타내면 다음과 같습니다.

[code php]VirtualDub.Open("e:\\test\\test.avi");[/code]

스크립트 인수 (VirtualDub 1.6.4 이상)

불러오기 (/i) 스위치는 명령행으로부터 스크립트에 다다르는 매개변수를 허용하도록 추가되었습니다.

[code php]virtualdub /i foo.script in.avi out.avi[/code]

/i 스위치 뒤에 곧바로 나타나는 스위치가 없는 매개변수는 VirtualDub.params[] 배열에 자리 잡습니다. 위의 예제에서 VirtualDub.params[0]은 이렇게 문자열 "in.avi"를 반환합니다.

명령행 인터페이스 (VirtualDub 1.6.5 이상)

VirtualDub 1.6.5 버전부터, 명령행 모드에서 VirtualDub 프로그램의 실행이 가능합니다. 명령행 모드는 몇 종류의 배치 작업을 더 쉽게 만듭니다. 그럼으로써 vdub.exe (32비트) 또는 vdub64.exe (64비트)를 실행하십시오. 이것은 그때 프로그램의 출력 방향을 표준 출력으로 바꿉니다. 또한 이것은 오류가 발생하면 0 이 아닌 오류 코드를 반환합니다.

프 로그램을 /? 옵션과 함께 실행하면 명령행 도움말을 보여줍니다.

버전 조회 (VirtualDub 1.6.5 이상)

실행할 수 있는 빌드 번호를 VirtualDub을 종료할 때 나타내도록 하는 /queryVersion 플래그가 추가되었습니다. 이것은 프로그램의 다른 버전을 위해 더 쉽게 검출하고 조정하도록 만들어 줍니다. NT CMD 배치 파일를 실행하면 %ERRORLEVEL% 환경 변수에서 빌드 번호를 찾게 됩니다.

캐스팅 (VirtualDub 1.6.7 이상)

1.6.7 버전에서는, 수치형 자료 사이에서 C 언어 형식의 캐스트를 강제로 사용하는 것이 가능합니다.

[code php]Foo(1 + (int)4.0);[/code]

배정밀도 실수(double)로부터 롱(long) 또는 인트(int)로의 캐스팅은 0을 잘라내게 됩니다. 배정밀도 실수의 값이 대상 형식으로 표현할 수 없으면, 결과 값은 확정되지 않습니다. 롱(long)으로부터 인트(int) 결과 값으로의 캐스팅은 하위 비트를 보존합니다. 그리고 인트(int)으로부터 롱(long) 결과 값으로의 캐스팅은 부호를 확장합니다.

수치 값으로부터 문자열로, 문자열로부터 수치 값으로 캐스팅될 수 없습니다. Atoi() 및 Atol(), Atod(), ToString() 함수를 이용하십시오.

이 글은 스프링노트에서 작성되었습니다.

  1. 나중에 작업 단추(Defer button)는 VirtualDub 1.6.7 (WIP) 이후에 파일 저장 대화상자의 왼쪽 아래에 나타나는 체크 박스 및 메시지를 가리킨다고 여겨집니다. 나중에 이름이 바뀌었고, 결국 V1.9.x에서는 사라졌습니다. [본문으로]
  2. "start /wait"에 대한 자세한 사항은 명령 프롬프트에서 "start /?"를 입력하기 바랍니다. [본문으로]
  3. 버블검 크라이시스(Bubblegum Crisis)는 1987년작 일본의 애니메이션입니다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

FOR 명령을 이용하여 파일 구조 분석이나 변수를 대체하여 사용할 수 있습니다. 이것을 이용하면 직접적으로 접근하기 힘든 것을 환경 변수를 조작할 수 있습니다.

읽기에 앞서

  • 명령어 구문에서 { | }(브레이스와 바, 중괄호와 막대)로 이루어진 부분은 둘 가운데 하나를 선택해야 한다. 예컨대 {%% | %}와 같은 경우 %%와 % 가운데 하나를 선택하여 사용해야 함을 뜻한다.
  • [](대괄호)로 묶인 부분은 그 부분을 쓰지 않아도 무방함을 나타낸다. 필요할 때만 쓰면 된다.

변수 대체

변수 대체란 말 그대로 입력 받은 변수를 다른 형태로 바꾼다는 뜻이다. 이 변수 대체를 이용하면 몇 가지 조작을 할 수 있다.

변수 대체 기본 사용법

  • %~L
    따옴표("")를 제거하는 %L을 확장합니다. 경로 명 등에 쓰인 따옴표를 제거할 때도 쓸 수 있습니다.
  • %~fL
    전체 경로 이름으로 %L을 확장합니다. 아래 그림에서 집합에는 *.txt 를 넣었으며, 경로는 포함하지 않았음에도 %~fL은 그것을 전체 경로로 확장해 주고 있다.

    위 그림의 내용은 C 드라이브 루트디렉터리에 txt 확장자를 가진 파일이 존재하면 그 파일의 전체 경로를 매개변수로 삼아 dir 명령을 실행하라는 뜻이다.
  • %~dL
    드라이브 문자 전용으로 %L을 확장합니다. 다시 말해 집합에 들어 있는 *.txt를 그것이 존재하는 드라이브명과 콜론(: 쌍점)만 취해서 나타내 준다.
  • %~pL
    경로 전용으로 %L을 확장합니다. %~fL에서 %~dL를 뺀 나머지를 돌려준다. 다시 말해 %~fL에서 맨 앞의 드라이브 문자와 콜론(: 쌍점)을 뺀 나머지를 돌려준다.
  • %~nL
    파일 이름 전용으로 %L을 확장합니다. 기본적으로 집합에 입력한 값과 같은 파일이 존재할 때 그 파일명만 읽어올 때 사용합니다. 이것은 어떤 파일이 존재하는지를 알아보고, 그것과 이름이 같으나 확장자가 다른 파일이 있는지를 알고 싶을 때 사용한다.
  • %~xL
    파일 확장명 전용 %L을 확장합니다. 기본적으로 집합에 입력한 값과 같은 파일이 존재할 때 그 확장자만 읽어올 때 사용합니다. 확장자를 읽어올 때 점(. 콤마)를 함께 읽어옵니다.
  • %~sL
    짧은 이름만 포함하도록 경로를 확장합니다. 이것은 도스에서 사용하는 짧은 경로명으로 파일 이름을 나타내 줍니다.
  • %~aL
    파일의 파일 특성으로 %L을 확장합니다. 다시 말해 파일 속성만을 나타내 주며, 이때 윈도의 형식이 아닌 유닉스 형식에 따라 나타내 준다는 점이 특이합니다.
  • %~tL
    파일의 날짜/시간으로 %L을 확장합니다. 이때 날짜는 date /t 의 형식을 따르며, 시간은 time /t 의 형식을 따릅니다.
  • %~zL
    파일 크기로 %L을 확장합니다.
  • %~$PATH:L
    PATH 환경 변수 목록에 나열된 디렉터리를 검색하고 처음으로 찾은 디렉터리의 전체 이름으로 %L을 확장합니다. 환경 변수 이름이 정의되어 있지 않거나 검색으로 파일을 찾을 수 없으면 이 수정자는 빈 문자열로 확장됩니다.

    C 드라이브 루트디렉터리는 PATH 환경 변수에 지정되어 있지 않으므로 %L 환경변수에 대한 %~$PATH:L 환경변수는 공백을 돌려준다.

    C:\WINDOWS 디렉터리는 PATH 환경변수에 지정되어 있으므로 %~$PATH:L 환경변수 확장이 알맞은 값으로 대체하여 보여줍니다.

변수 대체 복합 사용법

FOR 명령 확장에서 변수 대체를 하나만 쓸 수도 있지만 여러 개를 복합하여 사용할 수도 있습니다.

  • %~dpL
    드라이브 문자 및 경로 전용으로 %L을 확장합니다.
  • %~nxL
    파일 이름 및 확장명 전용으로 %L을 확장합니다.
  • %~fsL
    이름이 짧은 전체 경로 이름 전용으로 %L을 확장합니다.
  • %~dp$PATH:L
    %L에서 PATH 환경 변수의 디렉터리 목록에 나열된 디렉터리를 검색하고 처음으로 찾은 드라이브 문자와 경로로 확장합니다.
  • %~ftzaL
    dir과 같은 출력 줄로 %L을 확장합니다.

위의 예제에서 %L과 PATH는 다른 유효한 값으로 바꿀 수 있습니다. 유효한 for 변수 이름은 %~ syntax를 종료합니다. %L 같은 대문자 변수 이름을 사용하면 코드를 더 읽기 쉽게 만들고 대소문자를 구분하지 않는 수정자와 혼동을 피할 수 있습니다.

응용 예시

Slave 님께서 질문을 하나 올려주셨습니다.

  1. for %f in (*.txt) do run %f > %f.result

위와 같이 하면 파일명은 항상 파일이름.txt.result라고 나타난다네요. 이것을 파일이름.result라고 바꾸고 싶다고 하셨습니다. 참고로 윈도에서 사용한다면 파일이름.txt.result라고 하는 쪽이 여러모로 좋지만, 파일이름.result를 더 좋게 여기는 사람도 많습니다. 이 부분은 사람마다 취향의 차이이므로 자기가 바라는 대로 출력하고자 하지요.

이 문제는 %~nL 항목을 응용하면 쉽게 바꿀 수 있습니다.

  1. FOR %F IN (*.txt) DO run %F > %~nF.result

배치파일에서 사용한다면 아래와 같이 하면 됩니다.

  1. FOR %%F IN (*.txt) DO run %%F > %%~nF.result

다음 예고

FOR 명령에서 파일 구문 분석에 대해 알아보겠습니다.

이 글은 스프링노트에서 작성되었습니다.


'스크립트 > 배치파일' 카테고리의 다른 글

FOR 명령 확장 1  (2) 2009.06.17
FOR 명령  (6) 2009.05.16
GOTO 명령  (3) 2009.05.05
IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

FOR 명령과 관련한 여러 가지 쓰임은 상당히 유용하다. 아울러 명령줄에서 직접 제공하지 않는 기능을 FOR 명령 확장을 이용하여 구현할 수도 있다.

읽기에 앞서

  • 명령어 구문에서 { | }(브레이스와 바, 중괄호와 막대)로 이루어진 부분은 둘 가운데 하나를 선택해야 한다. 예컨대 {%% | %}와 같은 경우 %%와 % 가운데 하나를 선택하여 사용해야 함을 뜻한다.
  • [](대괄호)로 묶인 부분은 그 부분을 쓰지 않아도 무방함을 나타낸다. 필요할 때만 쓰면 된다.

디렉터리 전용

집합에 와일드카드(* 및 ?)를 포함하면 지정된 명령은 지정된 디렉터리의 파일 집합 대신 집합과 일치하는 각 디렉터리에 대해 실행됩니다. 구문은 다음과 같습니다.

FOR /D {%% | %}변수 IN (집합) DO 명령 [명령-매개 변수]

예컨대 파일은 그대로 두고 디렉터리의 이름만을 바꾸고 싶다면, 이 디렉터리 전용 옵션은 상당히 유용합니다.

재귀적 사용

[드라이브:]경로를 루트로 하여 디렉터리 트리를 따라 내려가며 FOR 구문을 트리의 각 디렉터리에서 실행합니다. /R 스위치 뒤에 디렉터리가 지정되지 않으면 현재 디렉터리가 사용됩니다. 집합에 마침표(.)가 사용되면 디렉터리 트리만 나열합니다.

FOR /R [[드라이브:]경로] {%% | %}변수 IN (집합) DO 명령 [명령-매개 변수]

이 구문은 명령어가 하위 디렉터리 옵션을 지원하지 않을 경우에 상당히 유용합니다.

값의 범위 반복

반복 변수를 사용하여 시작을 설정한 다음 값이 집합의 을 초과할 때까지 값의 집합 범위를 단계적으로 검사합니다. 집합은 단계별로 증가/감소하는 시작부터 끝까지의 일련의 숫자입니다. 따라서 (1,1,5)는 1 2 3 4 5를 나타내며 (5,-1,1)은 5 4 3 2 1을 나타냅니다.

FOR /L {%% | %}변수 IN (시작,단계,끝) DO 명령 [명령-매개 변수]

이 구문은 프로그래밍 언어에서 사용하는 FOR 구문과 비슷합니다. 실제로 배치파일에서 사용하기 위해 변수와 수치를 대입하면 다음과 같습니다.

  1. @ECHO OFF
  2. SETLOCAL
  3. SET SUM=0
  4. SET SUMTEMP=0
  5. FOR /L %%i IN (1,1,10) DO CALL :COUNT
  6. GOTO :EOF
  7.  
  8. :COUNT
  9. SET /A SUMTEMP=%SUMTEMP%+1
  10. SET /A SUM=%SUM%+%SUMTEMP%
  11. ECHO %SUMTEMP% = %SUM%
  12. GOTO :EOF

참고로 C언어에서는 다음과 같은 구조를 가집니다.

  1. int i, sum;
  2. for (i=1, sum=0; i<=10; i++) {
  3. sum = sum + i;
  4. printf ("\d\n", sum);
  5. }

다음 예고

FOR 명령에서 파일 구조 분석과 변수 대체에 대해 알아보겠습니다.

이 글은 스프링노트에서 작성되었습니다.


'스크립트 > 배치파일' 카테고리의 다른 글

FOR 명령 확장 2  (3) 2009.07.16
FOR 명령  (6) 2009.05.16
GOTO 명령  (3) 2009.05.05
IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

FOR 명령은 IF 명령과 함께 배치파일에서 지원하는 제어 명령이다. 또한 윈도XP는 도스의 그것보다 훨씬 강력한 기능을 제공하고 있다.

말뜻

FOR 명령에 쓰이는 for가 어떤 뜻에서 나왔는지를 알 수 없었다.

FOR 기본 문법

명령줄에서 FOR 사용

if 명령과 마찬가지로 FOR 명령도 명령줄에서 바로 쓸 수 있다.

  1. FOR %I IN (CD PATH VER) DO %I

아주 짧지만 분명히 잘 동작하며, FOR 명령의 기본 사용법을 잘 나타내고 있다.

FOR 명령의 기본 사용법은 다음과 같다.

FOR %변수 IN (집합) DO 명령어 [명령어 매개변수]

그런데 앞서 보인 코드에서는 명령어 부분이 생략되어 있는 특이한 경우이다. 물론 변수를 명령어 대신 사용하고 있기 때문이다.

모든 형식을 갖추어 FOR 명령을 사용한다면 다음과 같은 방법도 가능하다.

  1. FOR %I IN (%PATH%) DO ECHO %I

위의 코드는 PATH를 한 줄에 하나씩 보여준다.

  1. FOR %I IN (CD PATH VER) DO ECHO %I

위의 코드는 집합에 있는 3개 인자(CD PATH VER)을 ECHO 명령으로 출력하는 구문이다.

기본 문법

명령줄에서 다음과 같이 입력하면 기본 사용법을 알 수 있다.

  1. FOR /?

명령줄에서 사용하는 것과 배치파일에서 사용하는 방법에서 조금 차이가 있다.

FOR %변수 IN (집합) DO 명령어 [명령어 매개변수]

위의 사용법은 명령줄에서 사용하는 방법이다. 그런데 배치파일에서는 아래와 같이 사용해야 한다.

FOR %%변수 IN (집합) DO 명령어 [명령어 매개변수]

% 기호가 하나이냐 둘이냐에 따라 사용하는 곳이 달라진다. 이때 %변수는 주로 %I (퍼센트-대문자 아이)로 나타내는 때가 많으며, %I의 경우 대문자와 소문자를 구별하므로 주의해야 한다. 또한 1문자로 된 변수라면 0부터 9까지를 제외하면 모든 영문자를 사용할 수 있다. 대문자와 소문자를 구분하므로 총 52개를 사용할 수 있습니다.

예제

FOR문은 단순한 구조로 반복되는 작업에 자주 쓰인다.
윈도XP 업데이트 파일(핫픽스 파일)을 윈도XP에 통합하려고 할 때에는 그 파일명이 WindowsXP-KB*.exe와 같은 꼴을 이루게 된다. 이럴 때 FOR 구문을 이용하면 쉽게 할 수 있다.

  1. @echo off
  2. SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
  3. ECHO 윈도XP 복사본의 I386이 있는 디렉터리는?
  4. SET /P WORK=
  5. FOR %%I IN (WindowsXP-KB*.exe) DO %%I /integrate:%WORK% /nobackup /overwriteoem

위의 내용대로라면 중간에 한 차례 사용자 입력이 필요하지만, 처음부터 다음과 같이 지정해도 된다.

  1. @echo off
  2. FOR %%I IN (WindowsXP-KB*.exe) DO %%I /integrate:C:\WXP\i386 /nobackup /overwriteoem

이렇게 해도 몇몇 파일은 여전히 통합되지 않고 있으나, 하나하나 작업할 때에 비한다면 작업량이 매우 줄어든다. 더구나 이 배치파일은 나중에 재활용할 수 있다.

만약에 설치본에 통합하는 것이 아니라, 윈도XP를 설치한 뒤에 핫픽스만 따로 설치한다고 가정하면 위의 배치파일을 다음과 같이 고치면 된다.

  1. @echo off
  2. FOR %%I IN (WindowsXP-KB*.exe) DO %%I /nobackup /overwriteoem /quite /norestart

다음 예고

FOR 명령을 대해 좀 더 자세히 알아보자.
FOR 명령은 도스의 경우와 판이하게 달라져서 알면 아주 유용할 수도 있기 때문에 자세히 알아볼 필요가 있다.

이 글은 스프링노트에서 작성되었습니다.


'스크립트 > 배치파일' 카테고리의 다른 글

FOR 명령 확장 2  (3) 2009.07.16
FOR 명령 확장 1  (2) 2009.06.17
GOTO 명령  (3) 2009.05.05
IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

GOTO 명령은 여러 프로그래밍 언어에서 실행 순서를 바꾸어주는 역할을 한다. 그러나 구조적 프로그래밍과 관련하여 지탄을 받는 대상이기도 하다. 한편 도스용 배치파일에서는 배치파일에서 루프(loop) 구현 등 여러 가지 상황과 맞물려 반드시 필요한 기능 가운데 하나였다.

윈도XP의 배치파일에서는 GOTO 명령의 쓰임이 예전보다 줄었으나 아직까지도 여전히 자주 쓰이고 있다. 특히 하위 버전과의 호환성이라는 측면에서 매우 중요한 역할을 하고 있다.

말뜻

GOTO는 배치파일 내부에서 지정하는 대상(레이블)이 있는 곳으로 가라는 뜻을 가지고 있다. 그러므로 이 명령어를 발견하면 뒤따르는 레이블이 위치하는 곳으로 옮겨가면 된다.

GOTO 기본 문법

GOTO 명령의 기본 문법은 매우 간단하다.

GOTO Label

레이블은 여러 가지가 있으며, GOTO 명령과 함께 쓰이는 것을 GOTO레이블이라고 부른다.

GOTO 명령을 GOTO레이블과 함께 표현하면 아래와 같다.

Command_1
Goto :Label_1
Command_2
:Label_1
Command_3
Goto Label_2
Command_4
:Label_2
Command_5

이때 2행에 있는 Goto :Label_1 에서는 레이블 앞에 쌍점(콜론)이 붙었으나, 6행에 있는 Goto Label_2 에서는 레이블 앞에 쌍점이 붙지 않았다. 이처럼 GOTO Label의 형태에서 레이블 앞에는 쌍점을 붙여도 되고, 붙이지 않아도 된다. 명령어와 혼동되지 않도록 쌍점을 붙이는 편이 낫다고 생각한다. 그러나 일반적으로 위와 같이 쓰이는 일은 거의 없고, 대부분 IF 문과 함께 쓰이게 된다.

이때 GOTO 레이블은 8글자를 넘기면, 그 넘어가는 부분은 무시하게 된다. 다시 말해 아래의 레이블은 모두 같은 의미―:a1234567―를 갖게 된다.

  1. :a1234567
  2. :a12345678
  3. :a12345679
  4. :a1234567a
  5. :a1234567b

한편 GOTO문에서 지정한 레이블이 존재하지 않으면, 레이블을 찾을 수 없다는 메시지를 내보내고 배치파일을 종료하게 된다.

다만 윈도XP 명령확장에서 사용하는 :EOF 레이블은 배치파일 내부에서 정의하지 않아도 동작하며, 그 경우 곧바로 오류 메시지를 보이지 않고 배치파일을 종료한다. 이 :EOF 레이블을 사용하려면 반드시 goto :EOF라고 써야 하며, goto EOF라고 콜론을 빠뜨리고 쓰면 동작하지 않는다.

참고 자료

다음 예고

FOR 명령

이 글은 스프링노트에서 작성되었습니다.


'스크립트 > 배치파일' 카테고리의 다른 글

FOR 명령 확장 1  (2) 2009.06.17
FOR 명령  (6) 2009.05.16
IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
IF EXIST  (0) 2009.04.15
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

알리는 말

11월 18일 수정

본문의 내용이 저작권을 침해할 우려가 있다는 모꼬모지 님의 의견이 있었습니다. 처음에는 본문에 해당하는 한국어 번역이 없다고 여겼으나, 모꼬모지 님이 이미 번역한 부분이 있었고, 저는 그것을 모르는 상태에서 본문을 작성하였습니다. 그에 따라 번역문이 낱말은 물론 토씨까지 일치하는 곳을 상당 부분 발견하였고, 그러한 부분을 대부분 삭제하였으며, 꼭 필요한 일부는 남겼습니다(예컨대 PROCESSOR_ 로 시작하는 환경변수).

그로 말미암아 설명이 삭제된 부분이 생겼는데, 일부는 영어 위키백과Environment variable에서 내용을 복사하여 붙였습니다. 제 블로그의 라이선스가 GFDL이고 위키백과도 GFDL이기 때문에 가능했습니다. 영문 그대로 둔 이유는 번역할 경우 그 결과물이 이미 번역된 다른 글과 같을 수 있다는 염려 때문입니다. 한국어 위키백과에 내용이 추가되기 전까지는 본문의 영어 부분을 한국어로 번역하지 않을 생각입니다.

그와 함께 변수 구분을 위해 하위 개요를 두어 표를 두 개로 분리하였습니다.

11월 19일 수정

모꼬모지 님께 먼저 죄송하다는 말을 드려야겠네요.

죄송합니다.

위키백과의 사랑방에서 과거에 있었던 여러 토론을 살펴본 결과 링크만 걸려 있으면 그다지 문제가 없다는 의견을 여럿 보게 되었습니다. 결국 제가 너무 까탈스럽게 굴었다는 말이네요.
너무 원칙만 고수하다 보니 본의 아니게 모꼬모지 님과 논쟁을 벌이게 되어습니다. 앞으로는 좀 더 시야를 넓혀 이번과 같은 일이 다시 일어나지 않도록 하겠습니다.

말뜻

환경 변수(環境 變數)는 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임이다.[각주:1] 이때 변수들은 명령줄 위에서, .BAT 확장자를 가지는 일괄 처리 파일, 또는 스크립트 안에서 쓰일 수 있다. 변수 이름 주변이나 앞에 특별한 기호(예 : %)를 놓아서 참조하는 것이 보통이다.

윈도 테크넷의 정의에 따르면,[각주:2] Cmd.exe 명령 셸 환경은 명령 셸 및 운영 체제의 동작을 결정하는 변수에서 정의한다. 시스템과 로컬, 이 두 가지 환경 변수를 사용하여 명령 셸 환경 또는 전체 운영 체제 환경의 동작을 정의할 수 있다. 시스템 환경 변수는 전체 운영 체제 환경의 동작을 정의하며, 로컬 환경 변수는 현재 Cmd.exe 인스턴스의 환경 동작을 정의한다.

시스템 환경 변수는 운영 체제에 미리 설정되어 Windows XP의 모든 프로세스에서 사용할 수 있다. 관리 권한이 있는 사용자만 시스템 변수를 변경할 수 있으며, 이 변수는 로그온 스크립트에서 가장 많이 사용한다. 로컬 환경 변수는 그 변수를 사용하도록 만든 사용자가 컴퓨터에 로그온한 경우에만 사용할 수 있다. 로컬 변수는 HKEY_CURRENT_USER 하이브에서 설정하고 현재 사용자인 경우에만 유효하지만 전체 운영 체제 환경의 동작을 정의합니다.

윈도 환경에서 환경 변수의 유형은 다음과 같습니다.

  1. 기본 제공 시스템 변수
  2. HKEY_LOCAL_MACHINE 하이브에 있는 시스템 변수
  3. HKEY_CURRENT_USER 하이브에 있는 로컬 변수
  4. 모든 환경 변수 및 Autoexec.bat 파일에서 설정된 경로
  5. 모든 환경 변수 및 로그온 스크립트에서 설정된 경로
  6. 스크립트 또는 배치 파일과 상호 작용하는 변수

윈도의 환경 변수

윈도의 기본 환경 변수는 다음과 같다.[각주:3] 변수명에는 퍼센트 기호(%)를 붙이지 않지만, 배치파일에서 사용한다고 가정하여 퍼센트 기호(%)를 붙인 상태로 표시하였다.

시스템 변수

여기에서 말하는 시스템 변수는 기본 제공 시스템 변수와 레지스트리에 저장된 시스템 변수를 편의상 통틀어 이르는 명칭이다.

윈도의 기본 환경 변수는 다음과 같다.[각주:4]

변수 설명
%CMDEXTVERSION%
  • 윈도9X 기본값 - 정의되지 않음
  • 윈도NT4 - 1
  • 윈도2000 및 윈도XP - 2
%COMPUTERNAME% 컴퓨터 이름을 반환합니다. 정확하게는 현재 컴퓨터의 NetBOIS 이름을 반환한다.
  • 윈도9X 및 NT4 기본값 - 정의되지 않음
  • 윈도2000 이후 기본값 - 현재 컴퓨터의 컴퓨터 이름
%ComSpec% This variable contains the full path to the command processor; on Windows NT based operating systems this is cmd.exe, while on Windows 9x and ME it is the DOS command processor, COMMAND.COM.
  • 윈도9X 기본값 - C:\WINDOWS\COMMAND.COM
  • 윈도NT 기본값 - %SystemRoot%\system32\cmd.exe
  • 윈도NT 표시값 -
    • NT4 - C:\WINNT\system32\cmd.exe
    • 윈도2000 이후 - C:\WINDOWS\system32\cmd.exe
%DATE%

This variable expands to the current date. The date is displayed according to the current user's date format preferences.

The following is a way of reformatting the date and time for use in file copies. The example assumes UK format of day month year and the time is set for a 24 hour clock.

  • 기본값 - 시스템의 날짜. 한글 윈도에서는 YYYY-MM-DD(윈도ME/2000 이후) 또는 YY-MM-DD(윈도95/98)의 형태로 나타내 준다.
  • 표시값 - (한글 윈도XP) 2009-05-03
%ERRORLEVEL%

This variable points to the current error level. If there was an error in the previous command, this is what you need to check against to find out about that.
이 환경변수는 SET 명령으로는 볼 수 없습니다.

%HOMEDRIVE%
  • 윈도9X 기본값 - 정의되지 않음
  • 윈도NT 기본값 - C:
%HOMEPATH%
  • 윈도9X 기본값 - 정의되지 않음
  • 윈도NT 기본값 - \Documents and Settings\{USERNAME}
  • 비스타 기본값 - \Users\{USERNAME}
%HOMESHARE% 사용자 공유 홈 디렉터리의 네트워크 경로를 반환합니다. 홈 디렉터리의 값에 따라 설정합니다. 사용자 홈 디렉터리는 로컬 사용자와 그룹에서 지정하며, 홈 디렉터리가 로컬 경로에 위치하면, 이 환경변수의 값은 공백(NULL)을 반환합니다. 윈도XP에서만 정의하고 있습니다.
%NUMBER_OF_PROCESSORS% 컴퓨터에 설치된 프로세서의 수를 지정합니다. 이것은 컴퓨터 하드웨어인 CPU 모듈의 갯수 또는 CPU 모듈과 CPU 코어의 곱의 계산값으로 나타납니다. 예컨대 단일 코어의 CPU 모듈이 1개라면 1 x 1 = 1을 반환합니다. 그러나 듀얼 코어 CPU가 4개라면 2 x 4 = 8을 반환합니다.
  • 윈도9X 기본값 - 정의되지 않음
%OS%
  • 윈도9X 기본값 - 정의되지 않음
  • 윈도NT 기본값 - Windows_NT
%Os2LibPath% OS/2 라이브러리의 경로를 반환한다. 윈도NT4 및 윈도2000 에서만 정의되어 있다.
%PATH% This variable contains a semicolon-delimited (do not put spaces in between) list of directories in which the command interpreter will search for an executable file that matches the given command. Equivalent to the Unix $PATH variable.
  • 윈도9X 기본값 - C:\WINDOWS;C:\WINDOWS\COMMAND
  • 윈도NT 기본값 - %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
  • 윈도NT 표시값 - C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
%PATHEXT% 운영 체제에서 실행 가능하다고 간주되는 파일 확장명 목록을 반환합니다.
  • 윈도9X 기본값 - 정의되지 않음
  • 윈도XP 기본값 - .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
  • 비스타 기본값 - .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH;.MSC
%PROCESSOR_ARCHITECTURE% 프로세서의 칩 아키텍처를 반환합니다. 값은 다음과 같습니다. x86, IA64 등.
  • 윈도9X 기본값 - 정의되지 않음
%PROCESSOR_IDENTIFIER% 프로세서의 설명을 반환합니다.
  • 윈도9X 기본값 - 정의되지 않음
%PROCESSOR_LEVEL% 컴퓨터에 설치된 프로세서의 모델 번호를 반환합니다.
  • 윈도9X 기본값 - 정의되지 않음
%PROCESSOR_REVISION% 프로세서의 수정 버전 번호를 반환합니다.
  • 윈도9X 기본값 - 정의되지 않음
%Public%
  • 비스타 기본값 - C:\Users\Public
%RANDOM% This variable returns a random number between 0 and 32767. Cmd.exe에서 생성합니다.
  • 윈도9X 및 윈도NT4 기본값 - 정의되지 않음.
%SystemDrive% The %SystemDrive% variable is a special system-wide environment variable found on Microsoft Windows NT and its derivatives. Its value is the drive upon which the system folder was placed. Also see next item.

The value of %SystemDrive% is in most cases C:.

  • 윈도9X 계열 - 정의되지 않음
  • 윈도NT 기본값 - C:
%SystemRoot%

The %SystemRoot% variable is a special system-wide environment variable found on Microsoft Windows NT and its derivatives. Its value is the location of the system folder, including the drive and path.

The drive is the same as %SystemDrive% and the default path on a clean installation depends upon the version of the operating system. By default, on a clean installation:

  • 윈도9X 계열 - 정의되지 않음
  • 윈도NT 계열 기본값 -
    • Windows NT 5.1 (Windows XP) and newer versions use \WINDOWS
    • Windows NT 5.0 (Windows 2000), Windows NT 4.0 and Windows NT 3.1 use \WINNT
    • Windows NT 3.5x uses \WINNT35
%TEMP%
%TMP%
시스템 프로그램이 사용하는 기본 임시 디렉터리를 반환합니다. 어떤 프로그램에는 TEMP가 필요하고 어떤 프로그램은 TMP가 필요합니다.
  • 윈도9X 계열 기본값 - C:\WINDOWS\TEMP
  • 윈도NT 계열 시스템 기본값 - %SystemRoot%\TEMP
  • 윈도NT 계열 시스템 표시값 -
    • NT4 및 윈도2000 - C:\WINNT\TEMP
    • 윈도XP 이후 - C:\WINDOWS\TEMP
%TIME% This variable points to the current time. The time is displayed according to the current user's time format preferences.
  • 기본값 - 시스템의 날짜. 한글 윈도에서는 오전/오후 hh-mm의 형태로 나타내 준다.
  • 표시값 - (한글 윈도XP) 오후 03:36
%windir% This variable points to the Windows directory (on Windows NT-based operating systems it is identical to the %SystemRoot% variable, above). If the System is on drive C: then the default values are:
  • 윈도9X 계열 기본값 - C:\WINDOWS
  • 윈도NT 계열 기본값 - %SystemRoot%
  • 윈도NT 계열 표시값
    • NT4 및 윈도2000 - C:\WINNT
    • NT4 Terminal Server Edition - C:\WTSRV
    • 윈도XP 이후 - C:\WINDOWS
%winbootdir% 윈도9X 계열 운영체제가 설치된 위치를 반환합니다.
  • 윈도9X 및 윈도2000 기본값 - C:\WINDOWS

로컬 변수

변수 설명
%ALLUSERSPROFILE% The %AllUsersProfile% variable expands to the full path to the All Users profile directory. This profile contains resources and settings that are used by all system accounts. Shortcut links copied to the All Users' Start menu or Desktop folders will appear in every user's Start menu or Desktop, respectively.
  • 윈도9X 및 NT4 기본값 - 정의되지 않음
  • 윈도 2000 이후 기본값 - C:\Documents and Settings\All Users
  • 비스타 기본값 - C:\ProgramData
%APPDATA% Contains the full path to the Application Data folder of the logged-in user. Does not work on Windows NT 4.0 SP6 UK.
  • 윈도9X 및 NT4 기본값 - 정의되지 않음
  • 윈도 2000 이후 기본값 - %USERSPROFILE%\Application Data
  • 윈도 2000 이후 표시값 - C:\Documents and Settings\{USERNAME}\Application Data
  • 비스타 기본값 - C:\Users\{USERNAME}\AppData\Roaming
%CD% This variable points to the current directory. Equivalent to the output of the command cd when called without arguments.
  • 윈도9X 및 NT4 기본값 - 정의되지 않음
%CLIENTNAME% 로그인 환경이 로컬인지 원격인지에 따른 문자열을 반환합니다.
  • 윈도2000 이전 기본값 - 정의되지 않음
  • 윈도XP 이후 기본값 - 로컬이면 Console을 반환
%CMDCMDLINE% 현재 Cmd.exe를 시작하는 데 사용되는 정확한 명령줄을 반환합니다.
  • 윈도9X 기본값 - 정의되지 않음
  • 윈도NT 기본값 - 일반적으로 %ComSpec% 환경변수의 값을 반환한다.
%LOCALAPPDATA%

로컬 사용자만을 위해 설치된 응용 프로그램이 기본적으로 데이터를 저장하는 위치를 반환합니다.

  • 비스타 기본값 - C:\Users\{USERNAME}\AppData\Local
%LOGONSERVER%
  • 윈도9X 기본값 - 정의되지 않음
  • 윈도NT 기본값 - \\%COMPUTERNAME%
  • 윈도NT 표시값 - \\{사용자가 쓰고 있는 컴퓨터 이름}
%ProgramData%
  • 비스타 기본값 - C:\ProgramData
%PROMPT%
  • 기본값 - $P$G
%TEMP%
%TMP%
현재 로그온한 사용자가 사용할 수 있는 응용 프로그램이 사용하는 기본 임시 디렉터리를 반환합니다. 어떤 프로그램에는 TEMP가 필요하고 어떤 프로그램은 TMP가 필요합니다.
  • 윈도9X 계열 기본값 - C:\WINDOWS\TEMP
  • 윈도NT 계열 로컬 기본값 - %USERPROFILE%\Local Settings\Temp
  • 윈도NT 계열 로컬 표시값 - C:\DOCUME~1\{USERNAME}\LOCALS~1\Temp
  • 비스타 기본값 - C:\Users\{USERNAME}\AppData\Local\Temp (%LOCALAPPDATA%\Temp 라고 추정)
%USERDOMAIN%

사용자 계정을 포함한 도메인 이름을 반환합니다.

The variable holds the name of the Workgroup or Windows Domain to which the current user belongs. The related variable, %LOGONSERVER%, holds the hostname of the server that authenticated the current user's logon credentials (name and password). For Home PCs, and PCs in a Workgroup, the authenticating server is usually the PC itself. For PCs in a Windows Domain, the authenticating server is a domain controller (a primary domain controller, or PDC, in Windows NT 4-based domains).

  • 윈도9X 계열 기본값 - 정의되지 않음
  • 윈도NT 계열 기본값 - %COMPUTERNAME%
  • 윈도NT 계열 표시값 - 현재 사용하는 컴퓨터 이름을 나타내 준다.
%USERNAME% 현재 로그온한 사용자 이름을 반환합니다.
  • 윈도9X 계열 기본값 - 정의되지 않음
  • 윈도NT 계열 기본값 - {USERNAME} (로그인한 사용자 이름)
%USERPROFILE%

The %UserProfile% variable is a special system-wide environment variable found on Microsoft Windows NT and its derivatives. Its value is the location of the current user's profile directory, in which is found that user's HKCU registry hive (NTUSER).

Users can also use the %USERNAME% variable to determine the active users login identification.

  • 윈도9X 계열 기본값 - 정의되지 않음
  • 윈도NT 계열 기본값 - C:\Documents and Settings\{USERNAME}
  • 비스타 기본값 - C:\Users\{USERNAME}
변수 설명

%ProgramFiles%

%ProgramFiles(x86)%

%ProgramW6432%

This variable points to Program Files directory, which stores all the installed program of Windows and others. The default on English-language systems is C:\Program Files. In 64-bit editions of Windows (XP, 2003, Vista), there are also %ProgramFiles(x86)% which defaults to C:\Program Files (x86) and %ProgramW6432% which defaults to C:\Program Files. The %ProgramFiles% itself depends on whether the process requesting the environment variable is itself 32-bit or 64-bit (this is caused by Windows-on-Windows 64-bit redirection).

  • 윈도9X 계열 - 정의되지 않음.
  • 윈도NT 계열 기본값 - C:\Program Files
%CommonProgramFiles%

This variable points to Common Files directory. The default is C:\Program Files\Common Files.

  • 윈도9X 계열 및 NT4 - 정의되지 않음.
  • 윈도2000 이후 기본값 - C:\Program Files\Common Files
%SessionName% 윈도2000 이후 버전에서 터미널 서비스 시스템 구성요소(Terminal Services system component)가 설치된 경우에만 정의된다. 로컬에서 로그인했을 때는 Console을 기본값으로 반환한다.

위의 표 세 가지를 읽을 때 다음과 같은 점에 주의하십시오.

  • 혹시라도 명령줄에서 set 명령으로 찾을 수 없는 환경 변수는 윈도 레지스트리 키(Windows Registry key)인 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 에서 찾을 수 있다. 몇몇 로컬 변수는 HKEY_CURRENT_USER\Environment 에서 찾을 수 있다.
  • 기본값과 표시값은 서로 같지 않다. 기본값은 레지스트리 등에서 정의하는 값이고, 표시값은 명령 프롬프트에서 SET 명령으로 확인할 수 있는 값이다. 윈도NT 계열(윈도NT/2000/XP 등)에서는 서로 다른 값을 가지므로 주의해야 한다(결과적으로 둘 다 같다). 위의 설명에서는 윈도XP를 기준으로 기본값과 표시값을 나누었으며, 두 값이 같다면 기본값만 표시했다.
  • 위의 환경변수 설명에서 {USERNAME}, {사용자가 쓰고 있는 컴퓨터 이름}이라는 부분은 시스템 환경에 따라 달라진다. 각자 자신의 컴퓨터에서 확인하기 바란다. 참고로 {USERNAME}의 값은 환경변수 %USERNAME%의 값에 따라 달라지며, {사용자가 쓰고 있는 컴퓨터 이름}%COMPUTERNAME%에 따라 달라진다.
  • 비스타 기본값은 표시값과 구분하지 않았다. 실제로 비스타를 설치하지 않은 이상 알 수 없기 때문이다.
  • Environment Variables 문서에서는 %SystemDirectory%라는 환경변수를 소개하고 있지만, 어디에서도 찾을 수 없었다.

도스의 환경 변수

MS-DOS v6.22를 설치했을 때의 환경 변수는 그다지 많지 않다. COMPSPEC, PROMPT, PATH, TEMP, 이렇게 네 개가 전부이다(참고 : 환경 변수 1).

참조 문서

내부 문서

외부 문서

다음 예고

GOTO 문과 레이블에 대해서 알아보기로 하자.

  1. 한국어 위키백과 : 환경 변수 [본문으로]
  2. 명령 셸 개요 :: Cmd.exe와 함께 환경 변수 사용 문서를 참조하였다. [본문으로]
  3. 명령 셸 개요 :: Cmd.exe와 함께 환경 변수 사용 문서, Environment Variables 문서, Windows Platform Comparison Environment Variable Reference 문서, Windows Vista- Environment variables 문서 등을 참조하였다. [본문으로]
  4. 변수명에는 퍼센트 기호(%)를 붙이지 않지만, 배치파일에서 사용한다고 가정하여 퍼센트 기호(%)를 붙인 상태로 표시하였다. [본문으로]

'스크립트' 카테고리의 다른 글

환경 변수 1  (0) 2009.05.02
이런저런 이야기  (6) 2009.03.30
스크립트란 무엇인가? 배치파일이란 무엇인가?  (8) 2009.03.21
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.
환경 변수가 무엇인지는 환경 변수 2에서 설명하기로 하고, 여기에서는 주의할 점을 몇 가지 설명하겠다.

도스와 윈도는 다르다.

환경 변수를 이용할 때 도스와 윈도가 다르며, 윈도9X 계열과 윈도XP의 경우가 다르다.

  • 도스에서 환경 변수의 이름은 항상 대문자이다. 윈도에서는 환경 변수의 이름에 소문자도 허용된다. 그러나 윈도에서 소문자 이름으로 된 환경변수를 대문자로 써도 똑같다. 반대로 대문자 이름으로 된 환경변수를 소문자로 써도 된다.
  • 도스에서 일부 환경변수의 값은 항상 대문자이다. 윈도에서는 모든 환경변수의 값에 소문자를 포함할 수 있다.
  • 정의되지 않은 환경 변수에 대한 처리 방법이 다르다. 도스와 윈도9X 계열에서는 정의되지 않은 환경변수는 공백으로 처리하지만, 윈도XP에서는 환경변수 이름을 돌려준다.
  • 도스에서는 환경변수가 숫자로만 이루어져도 문자열이지만, 윈도에서는 명령확장을 이용하여 수로 인식할 수 있다. 심지어 사칙연산도 가능하다.
  • 도스에서는 환경변수의 값에 ^(캐럿; 이스케이프 문자)와 &(앰프; 엔티티 부호) 등을 아무런 작업없이 바로 쓸 수 있다. 윈도XP에서는 따옴표(" ")를 사용하는 등 특별한 방법으로써 환경변수의 값에 쓸 수 있다. 다시 말해 윈도XP에서는 좀 더 복잡한 방법을 사용해야 한다. 도스에서는 환경변수의 값에 <(보다 작은; Less than), >(보다 큰; Greater than), |(bar; pipe)와 같은 세 가지 특수문자를 쓸 수 없다. 윈도XP에서는 앞서 말한 특별한 방법으로써 환경변수의 값에 쓸 수 있다.

도스의 환경변수

MS-DOS v6.22를 설치했을 때의 환경 변수는 그다지 많지 않다. COMPSPEC, PROMPT, PATH, TEMP, 이렇게 네 개가 전부이다.

COMPSPEC=C:\COMMAND.COM
PROMPT=$p$g
PATH=C:\DOS
TEMP=C:\DOS

참조 문서

내부 문서

외부 문서

이 글은 스프링노트에서 작성되었습니다.


'스크립트' 카테고리의 다른 글

환경 변수 2  (9) 2009.05.03
이런저런 이야기  (6) 2009.03.30
스크립트란 무엇인가? 배치파일이란 무엇인가?  (8) 2009.03.21
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

IF 명령 확장은 IF 명령이 가진 기능을 추가하고 넓힌다는 뜻으로, IF 명령으로 여러 가지 다른 처리를 할 수 있도록 해 준다. 앞서 나온 IF 문자열에서도 일부 소개하였지만, 윈도XP의 IF 명령은 상당히 뛰어난 기능을 제공하고 있다. 대부분 IF 문자열 기능에 포함되어 있고, 여기에서는 IF 문자열에서 설명하지 않은 부분만을 설명하겠다.

말뜻

IF 명령 확장에는 세 문자로 이루어진 비교 연산자(연산자 확장)와 IF CmdExtVersion 구문 및 IF Defined 구문이 있다.

  • 세 문자로 이루어진 비교 연산자는 IF 문자열을 참조하세요.
  • IF CmdExtVersion 수 : 윈도XP의 도움말 및 지원 센터의 설명에 따르면, Cmd.exe의 명령 확장 기능과 관련된 내부 버전 번호가 '수'보다 크거나 같은 경우에만 참인 조건을 지정합니다. 첫째 버전은 '1'이며 의미있는 향상을 명령 확장에 추가할 때 하나씩 증가합니다. 명령 확장을 사용할 수 없게 설정하면 CmdExtVersion 조건은 항상 거짓입니다. 명령 확장이 사용 가능한지를 검사할 때도 사용할 수 있습니다. CmdExtVersion의 정확한 값을 알고 싶다면 명령행에서도 "echo %CmdExtVersion%"라고 입력해 보라.
  • IF Defined 환경변수 : 지정한 환경변수가 정의되어 있으면 참값을, 그렇지 않으면 거짓값을 돌려준다.

IF CmdExtVersion 구문

명령확장을 사용할 수 있는지를 사용할 수 있다. 또한 명령확장의 버전을 검사하여 배치파일 실행 여부를 판단할 때도 쓸 수 있다.

  1. if CmdExtVersion 2 (
  2. echo 윈도XP에서 명령확장을 사용할 수 있습니다.
  3. ) else echo 윈도XP가 아니거나 명령확장을 사용할 수 없습니다.

위와 같은 형식이 가장 기본적이다. echo 문은 예시일 뿐이니, 저 부분에 자신이 실행하기를 바라는 명령을 넣으면 된다.

또한 단순히 명령확장을 사용할 수 있는지를 알려면 다음과 같이 하면 된다.

  1. if CmdExtVersion 0 (
  2. echo 명령확장을 사용할 수 있습니다.
  3. ) else echo 윈도NT 계열이 아니거나 명령확장을 사용할 수 없습니다.

명령확장을 사용할 수 있다면 "if CmdExtVersion 0"은 무조건 참이 되어야 하므로 위의 예제는 명령확장을 사용할 수 있는지를 검증해 주는 코드가 된다.

IF Defined 구문

IF Defined 구문은 IF 문자열 구문의 확장으로 볼 수 있다.

  1. if not * == %var%* echo Variable %var% is defined.
  2. if not * == %var%* echo 환경변수 %var%이(가) 정의되어 있습니다.

위 두 문장은 출력문만 다를 뿐 완전히 같다. 환경변수가 정의되어 있다면 항상 문자열 값을 가지게 되므로 위의 구문에서 참값을 가지게 된다. 결국 "환경변수 %var%이(가) 정의되어 있습니다."라고 출력한다는 뜻이다. 이때 *(별표) 대신 다른 문자를 사용해도 결과는 같으나, %, ^, & 등은 사용하지 않는 것이 좋다. 특히 %와 ^는 배치파일에서 특별한 작용을 하므로 if문에 사용했을 경우 그 효과를 정확히 알고 사용해야 한다.

위의 예제를 Defined 를 이용하여 고치면 다음과 같다.

  1. if Defined %var% echo Variable %var% is defined.
  2. if Defined %var% echo 환경변수 %var%이(가) 정의되어 있습니다.

if Defined 환경변수 구문을 이용하게 되면 세 환경변수―%errorlevel%, %cmdcmdline% 및 %cmdextversion%―를 사용할 수 있게 됩니다. %errorlevel% 환경변수는 마지막으로 실행한 프로그램이 돌려주는 종료코드를 저장하고, %cmdcmdline% 환경변수는 마지막으로 실행한 명령줄을 저장합니다. 그리고 %cmdextversion% 환경변수는 앞서 설명했듯이 명령확장의 버전을 저장하고 있습니다.

과제

지난 번 과제는 다음 구문을 옳게 고치라는 문제였습니다.

  1. rem Compare.cmd
  2. IF /i NOT %1 EQU %2 ECHO %1 is equal %2 ELSE ECHO %1 is not equal %2 .

아래와 같이 하면 된다. 빨간 색 부분을 유심히 살펴보기 바란다.

  1. rem Compare.cmd
  2. IF /i %1 EQU %2 ( ECHO %1 is equal %2 ) ELSE ECHO %1 is not equal %2 .

다음 예고

GOTO문을 설명하기에 앞서 잠시 쉬어가는(?) 시간을 갖도록 하자. 다음에는 환경변수에 대해서 알아보겠다.

이 글은 스프링노트에서 작성되었습니다.

'스크립트 > 배치파일' 카테고리의 다른 글

FOR 명령  (6) 2009.05.16
GOTO 명령  (3) 2009.05.05
IF 문자열  (4) 2009.04.18
IF EXIST  (0) 2009.04.15
IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

IF 문자열 비교 구문은 말 그대로 문자열을 비교하는 구문이다. 이것은 윈도NT 계열에서 추가된 환경 변수 등을 이용하여 여러 가지 작업을 할 수 있도록 해준다. 문자열의 내용을 분석하여 정수(십진수, 팔진수, 십육진수)로 변환하여 계산해 주기도 한다.

말뜻

IF 문자열 비교 구문에서는 일반적으로 등호를 두 개 겹쳐서 쓰게 된다.

  1. if [not] 문자열1==문자열2 명령 [else 구문]

위와 같은 형식을 이루게 된다. 이때 큰괄호( [ ] )로 묶인 부분은 반드시 쓸 필요는 없고 필요할 때 쓰면 된다. 또한 문자열에 공백을 포함하지 않았다면 따옴표를 사용하지 않아도 된다.

문자열 비교 구문의 명령 확장

확장 1

명령 확장이라고 말하기는 했으나, 사실 /i 선택자는 cmd.exe에 포함된 if 명령에서는 기본 선택자이다. 다만 도스의 if 명령과 호환성이 없기 때문에 확장이라고 칭했을 뿐이다.

문자열 비교 구문에서 /i 선택자를 쓰게 되면 그 기능을 확장할 수 있다. 이것은 대문자와 소문자를 무시하고 문자열을 비교하게 됩니다.

  1. IF STRING==string ECHO STRING is string.

위의 문자열 비교 구문은 거짓을 돌려주므로 화면에 아무것도 보여주지 않는다. 그러나 아래 문자열 비교 구문은 참을 돌려주므로 화면에 "STRING is string."이라는 문자열을 출력해 준다.

  1. IF /i STRING==string ECHO STRING is string.

확장 2

문자열 비교 구문에서는 세 문자로 이루어진 비교 연산자를 사용할 수 있다. 이것은 /i 선택자를 사용하여 융통성을 가지는데, 예컨대 숫자로만 이루어진 문자열은 수로 변환하여 비교해 준다.

세 문자로 이루어진 비교 연산자에는 다음과 같은 것이 있다.

  • EQU (같음)
  • NEQ (같지 않음)
  • LSS (보다 작음)
  • LEQ (작거나 같음)
  • GTR (보다 큼)
  • GEQ (크거나 같음)

비교 연산자는 언뜻 보아서는 숫자로 이루어진 문자열에만 쓰일 듯이 보이지만 로마자 등으로 이루어진 문자열에도 쓰일 수 있다.

예제 1

  1. IF /i 22 EQU 026 ECHO 22 is 026.

위의 코드는 10진수 22와 8진수 026을 비교하는 구문이다. 당연히 두 값은 크기가 같으므로 화면에 문자열을 출력해 준다.

  1. IF /i 026 EQU 0X16 ECHO 026 is 0X16.

위의 코드는 8진수 026과 16진수 0x16을 비교하는 구문이다. 당연히 두 값은 크기가 같으므로 화면에 문자열을 출력해 준다. 

두 예제는 /i 선택자가 문자열을 확장하여 "일반적으로 해석"하는 예시이다. 다시 말해 문자열 22는 10진수 22로 해석해 주며, 026은 8진수로, 0x16은 16진수로 해석해 준다. 10진수는 0으로 시작할 수 없으며, 0으로 시작하는 수는 8진수이거나 16진수가 된다. 또한 0으로 시작하는 문자열 가운데 0x로 시작하는 문자열은 16진수로 여기게 된다.

하지만 089 등의 문자열은 올바르지 않으므로 오류가 발생하게 된다. 이는 8진수에 8과 9와 같은 숫자는 존재하지 않기 때문이다. 마찬가지로 0x9G 등의 문자열도 올바르지 않다고 여긴다. 이럴 경우 문자열을 수로 확장해 주지 않고, 문자열 자체(리터럴 문자열)로서 비교하게 된다. 참고로 순수한 문자열을 리터럴 문자열(literal string), 수치로서 변환되는 문자열을 숫자 문자열(number string / numeric string)이라고 부른다.

한편 다음에 오는 두 비교문은 서로 다른 결과를 가진다.

  1. IF /i 22 EQU 026 ECHO 22 is 026.

위의 비교문은 수치 비교문으로 참값을 돌려주므로 "22 is 026."을 출력한다.

  1. IF /i 22 == 026 ECHO 22 is 026.

위의 비교문은 리터럴 문자열 비교문으로 거짓값을 돌려주므로 아무것도 출력하지 않는다.

다시 말해 숫자로 이루어진 문자열을 숫자 문자열로서 비교하려면 반드시 문자로 이루어진 비교 연산자를 사용해야 한다.

또한 다음과 같이 사용할 수도 있다.

  1. IF /i abc EQU ABC ECHO abc is ABC.

또는

  1. IF /i NOT abc EQU ABC ( ECHO abd is ABC ) ELSE ECHO abd is not ABC .

앞서 말했듯이 세 문자로 이루어진 비교 연산자로 숫자 문자열뿐만 아니라 리터럴 문자열까지 비교할 수 있다.

  1. IF /i abc NEQ ABC ( ECHO abd is ABC ) ELSE ECHO abd is not ABC .

위의 비교문도 정상 작동한다.

예제 2

그렇다면 작거나 같음을 비교할 때는 어떻게 동작할까? LSS (보다 작음), LEQ (작거나 같음), GTR (보다 큼), GEQ (크거나 같음)과 같은 세 문자로 이루어진 비교 연산자를 이용하여 대문자와 소문자를 비교해 보자,

  1. IF /i 22 LSS 027 ECHO 22 is less than 027.

위 예제는 10진수 22가 8진수 027보다 작으면 뒤따르는 문자열을 출력하라는 문자열 비교문입니다.

그러면 다음과 같은 두 가지 예문은 어떻게 작동할까?

  1. IF /i abc LSS ABC ECHO abc is less than ABC.
  2. IF abc LSS ABC ECHO abc is less than ABC.

우선 1행은 아무런 출력이 없다. 왜냐하면 /i 선택자 때문에 대문자와 소문자를 무시하고 비교했기 때문이다. 그러나 2행은 소문자 abc가 대문자 ABC보다 더 작은 값으로 해석되어 문자열 "abc is less than ABC."을 출력해 준다.

  1. IF ABC GTR abc ECHO ABC is greater than abc.

마찬가지로 위의 코드는 대문자 ABC가 소문자 abc보다 더 큰 값으로 해석되어 "ABC is greater than abc."라는 문자열을 출력해 준다.

위와 같이 대문자와 소문자 비교에서 대문자가 소문자보다 더 크다고 판정함을 알 수 있다.

예제 3

그 다음으로 문자간 비교를 해볼 수 있다.

  1. IF d GTR a ECHO D is greater than A.

위의 예제는 문자여을 출력해 준다. 다시 말해 문자열 d가 문자열 a보다 더 큰 값을 가진다고 판단함을 알 수 있다. 반대로 아래와 같은 비교문도 성립한다.

  1. IF a LSS d ECHO a is less than d.

로마자 알파벳을 비교할 때 순서가 빠른 문자를 더 작다고 판단함을 알 수 있다.

  1. IF 가 LSS 나 ECHO 가 is less than 나.

한글 문자열을 비교할 때도 성립한다.

  1. IF 가 LSS d ECHO 가 is less than d.

한글을 로마자보다 더 작다고 판정하고 있다.

과제

아무도 검사하지 않는 과제가 또 나왔습니다. 헤헤 ^^a

  1. rem Compare.cmd
  2. IF /i NOT %1 EQU %2 ECHO %1 is equal %2 ELSE ECHO %1 is not equal %2 .

위의 배치 파일이 정상적으로 작동하도록 고쳐 보자.

다음 예고

IF 명령을 하나씩 짚어보자. (4) : IF 명령확장

이 글은 스프링노트에서 작성되었습니다.

'스크립트 > 배치파일' 카테고리의 다른 글

GOTO 명령  (3) 2009.05.05
IF 명령 확장  (1) 2009.04.22
IF EXIST  (0) 2009.04.15
IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
IF 기본 설명  (6) 2009.04.09
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

IF EXIST 구문은 단순히 어떤 디렉터리나 파일이 존재하는지를 알려줄 뿐이다. 응용하기에 따라서는 상당히 유용한 기능을 제공한다. 또한 속성의 영향을 받지 않기 때문에 숨김 속성의 파일이나 시스템 속성의 파일도 찾아낼 수 있다. 또한 윈도 탐색기에서 접근하지 못하도록 레지스트리 등을 조작하여 감춰둔 드라이브도 접근할 수 있다.

IF EXIST 구문에는 기본 문법 외에 명령 확장이 존재하지 않는다. 정확히 말해 명령 확장을 이용할 수는 있지만, 그와 같은 명령 확장은 if 명령 전체에 적용되는 명령 확장이고, IF EXIST 구문에만 쓰이는 명령 확장이 아니다. 또다른 명령 확장으로 set 명령 확장이 있으나, 이것 역시 IF EXIST 구문에만 쓰이는 명령 확장이 아니다. 그러므로 여기에서는 설명하지 않겠다.

말뜻

EXIST는 말 그대로 "있다" 또는 "존재한다"라는 뜻을 가지고 있다. 그러므로 IF EXIST 구문은 무엇인가가 존재하는지를 묻는 구문이 된다. 존재하면 참값을, 존재하지 않으면 거짓값을 돌려준다.

예제

실제로 적용하기에는 무리가 있지만, 간단한 배치파일을 작성하였다.

  1. @echo off
  2. rem 파일명 : ExistSys.bat
  3. rem 지은이 : koc2000/SALM
  4. rem 저작권 : GPL v3
  5.  
  6. rem 예제 13.
  7. rem SYSTEM 파일로 운영체제를 가리는 배치파일
  8. rem 사용법 : ExistSys
  9.  
  10. rem c:\ 디렉터리에 존재하는 파일에 따라 시스템을 판별한다.
  11. IF EXIST c:\ntldr GOTO :WinNT
  12. IF EXIST c:\io.sys GOTO :DOS
  13.  
  14. :WinNT
  15. echo The system is Windows NT/2000/XP.
  16. goto :END
  17.  
  18. :DOS
  19. echo The system is DOS or Windows 95/98/ME.
  20. goto :END
  21.  
  22. :END

예제 13은 C 드라이브 루트디렉터리에 있는 파일을 기준으로 운영체제를 판별하는 배치파일이다. 이 배치파일은 정확한 동작을 보장하지 않지만, 대부분의 경우 올바르게 작동한다. 따라서 실제로 이용하기에는 무리가 있으나, 파일 존재 구문(IF EXIST 구문)을 시험하기에는 안성맞춤이다.

위에서 IF EXIST 구문이 두 번 나오는데, 순서를 바꾸면 오류가 난다. 왜냐하면 윈도XP를 비롯한 윈도NT 계열의 운영체제에도 C 드라이브 루트디렉터리에 io.sys와 msdos.sys, config.sys 및 autoexec.bat 파일이 존재하기 때문이다. 이것은 윈도95 계열에서도 마찬가지로 존재한다. 그러므로 윈도NT 계열에서만 존재하는 파일을 찾아야 하는데, 그것이 ntldr(NT Loader) 파일이다. 따라서 위의 배치파일은, 엄밀히 말해, 윈도NT 계열과 비윈도NT 계열을 판별하는 배치파일인 셈이다. 이때 io.sys 파일과 ntldr 파일이 숨김 속성과 시스템 속성을 함께 가지고 있지만, 문제 없이 접근하고 있다.

그러나 PC-DOS의 경우 위의 배치파일은 정상 작동하지 않는다. 왜냐하면 PC-DOS에서는 io.sys 파일 대신에 ibmio.sys 파일이 존재하기 때문이다. 그에 대한 적용은 여러분이 직접 해 보기 바란다.

감춰둔 폴더 접근

폴더 감추기는 윈도 셸인 탐색기에 적용되는 사항으로, cmd.exe 명령에는 적용되지 않는다. 또한 탐색기에서 모습을 찾을 수 없도록 감추었을 뿐 정확한 경로를 알고 있다면 얼마든지 사용할 수 있다.

오른쪽은 원래의 드라이브 구성이고, 왼쪽은 윈도 레지스트리를 조작하여 감춘 구성이다.

이 경우 주소표시줄에 직접 D:\ 와 같이 입력하면 D 드라이브의 루트 폴더에 접근할 수 있다. 앞서 말했듯이 감춰두었을 뿐 막은 게 아니기 때문이다. 그러나 사람들은 눈에 안 보이면 사용하지 못한다고 여기기 때문에 이렇게 드라이브를 감추는 작업은 유용할 때가 많다.

한편 명령 프롬프트에서는 애초에 모든 드라이브가 감춰진 상태이다.

달랑 자신의 홈디렉터리만 보여준다. 홈디렉터리는 유닉스 계열이나 명령 프롬프트에서 쓰는 개념이고, 윈도에서는 프로필폴더이다. 명령 프롬프트에서 다음과 같이 입력하면 된다.

  1. cd %USERPROFILE%

USERPROFILE 환경 변수에 자신의 홈디렉터리(프로필폴더)에 대한 정보를 가지고 있다. 정확히 어디인지를 보려면 다음과 같이 입력하면 된다.

  1. echo %USERPROFILE%

그밖에 HOMEDRIVE, HOMEPATH 등의 환경변수가 지정되어 있다. 위의 경우 홈드라이브(HOMEDRIVE)는 D: 문자열이, 홈패스(HOMEPATH)는 \Usr\LCP 문자열이 지정되어 있으며, 명령 프롬프트에서 set 명령을 입력하면 확인할 수 있다.

보통의 경우 USERPROFILE 환경 변수는 C:\Documents and Settings\USERNAME 문자열을 가지게 된다. 이때 이탤릭체로 표시한 USERNAME은 사용자마다 다르다.

아무튼 위의 두 "내 컴퓨터" 화면처럼 존재하는 폴더를 감추더라도 명령 프롬프트에서는 무리 없이 접근할 수 있다. 이것을 이용하는 것은 여러분의 몫이다.

다음 예고

이 글은 스프링노트에서 작성되었습니다.

'스크립트 > 배치파일' 카테고리의 다른 글

IF 명령 확장  (1) 2009.04.22
IF 문자열  (4) 2009.04.18
IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
IF 기본 설명  (6) 2009.04.09
배치파일에 매개변수 전달하기 2  (5) 2009.04.04
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

IF ERRORLEVEL문은 방금 실행을 마친 프로그램의 종료코드(마침코드)를 비교하여 프로그램 수행을 결정하는 구문이다. 이를 위해 몇 가지 프로그램의 종료코드를 소개하고자 한다. 또한 이러한 종료코드는 ERRORLEVEL 환경변수(%ERRORLEVEL%)에 저장하여 이용할 수도 있다.

말뜻

종료코드(마침코드)는 프로그램이 수행 과정에서 어떻게 처리하였는지를 알려주는 정수를 가리킨다. 주로 정수 0은 정상 종료되었음을 뜻하면 1보다 크거나 같은 값은 오류가 발생했음을 뜻한다. 프로그램이 종료하면서 운영체제에 넘겨주기 때문에 종료코드라는 이름이 붙었다.

여러 프로그램의 종료코드

윈도XP의 도움말 및 지원 센터의 내용에 따르면 다음과 같은 종료코드를 가지고 있다고 한다.

  • diskcomp : 두 플로피디스크를 비교하는 명령어

    • 0 : 두 플로피디스크가 같다. (정상 종료)
    • 1 : 차이를 발견했다.
    • 2 : 하드웨어 오류 발생.
    • 3 : 초기화 오류 발생.
  • xcopy : 하위 디렉터리와 파일을 복사하는 명령어

    • 0 : 파일이 오류 없이 복사됨. (정상 종료)
    • 1 : 복사할 파일을 찾지 못하다.
    • 2 : 사용자가 Ctrl+C를 눌러 강제 종료.
    • 4 : 초기화 오류가 발생. 메모리나 디스크 공간 부족, 명령줄에 잘못된 드라이브 이름이나 잘못된 구문을 입력했을 때 생긴다.
    • 5 : 디스크 쓰기 오류가 발생했습니다.
  • color : 전경색(글자색)과 배경색을 지정하고 복원하는 명령어

    • 0 : 전경색과 배경색이 다르다.
    • 1 : 전경색과 배경색이 같다.
  • diskcopy : 플로피디스크에서 다른 플로피디스크로 복사하는 명령어

    • 0 : 복사 성공. (정상 종료)
    • 1 : 치명적이지 않은 읽기/쓰기 오류가 발생
    • 3 : 치명적인 하드웨어 오류가 발생
    • 4 : 초기화 오류가 발생
  • format : 디스크를 초기화하는 명령어

    • 0 : 포맷을 성공했습니다.  (정상 종료)
    • 1 : 잘못된 매개 변수를 입력
    • 4 : 치명적인 오류가 발생 (0, 1 또는 5를 제외한 오류).
    • 5 : "포맷을 실행하시겠습니까(Y/N)?" 메시지에서 N 키를 눌러 실행이 중단됨.
  • graftabl : 그래픽 모드에서 확장 문자 집합을 표시하는 기능을 사용 가능하게 설정합니다.

    • 0 : 문자 집합을 기억장치에 읽어들이는 데 성공. 이전 코드 페이지는 로드되지 않는다. (정상 종료)
    • 1 : 잘못된 매개 변수. 작업이 수행되지 않는다.
    • 2 : 파일 오류가 발생
  • replace : 대상 디렉터리의 파일을 이름이 같은 원본 디렉터리의 파일로 바꾼다. replace를 사용하여 대상 디렉터리에 고유 파일 이름을 추가할 수도 있다.

    • 0 : replace 명령이 성공적으로 파일을 바꾸거나 추가했습니다. (정상 종료)
    • 1 : replace 명령이 맞지 않는 MS-DOS 버전을 발견했습니다.
    • 2 : replace 명령이 원본 파일을 찾을 수 없습니다.
    • 3 : replace 명령이 원본이나 대상 경로를 찾을 수 없습니다.
    • 5 : 사용자는 바꾸고자 하는 파일을 액세스할 수 없습니다.
    • 8 : 명령을 실행할 시스템 메모리가 부족합니다.
    • 11 : 명령줄에 잘못된 구문을 사용했습니다.
  • 그밖에 마이크로소프트 제품의 setup.exe 프로그램 : 윈도용 애플리케이션의 설치 프로그램

    • 0 : 프로그램 설치를 성공 또는 사용자가 취소한 경우. (정상 종료)
    • 0 이외의 값 : 프로그램 설치 도중에 프로그램 오류 발생
  • 고스트 등의 시만텍 사의 프로그램

    • 0 : 오류가 발생하지 않고 정상 종료
    • 0 이외의 값 : 오류가 발생

예제 1

IF ERRORLEVEL문과 ELSE를 함께 사용한 예제는 GBackup1H2P.cmd 파일이다. 지난번에 작성한 GBackup1H2P.cmd을

GBackup1H2P-1.cmd로 이름을 바꾸어 저장하고, GBackup1H2P.cmd을 편집해 보자.

  1. GHOST.exe -CLONE,MODE=PDUMP,SRC=1:1,DST=1:2\GHOST.GHO -Z9 -AUTO -SURE -RB
  2.  
  3. REM IF-ELSE 구문 : 오류가 발생하면 오류 발생을 알려준다.
  4. IF ERRORLEVEL 1 (
  5.     ECHO ##############################################
  6.     ECHO ##      백업 도중 오류가 발생했습니다.      ##
  7.     ECHO ##############################################
  8. ) ELSE (
  9.     ECHO ##############################################
  10.     ECHO ##    백업 작업을 정상적으로 마쳤습니다.    ##
  11.     ECHO ##############################################
  12. )

바뀐 부분만 나타내면 위와 같다. 이때 IF는 '('와 같은 명령줄에 있어야 하며, ')'와 ELSE가 같은 명령줄에 있어야 한다. 또한 ELSE는 뒤따르는 '('와 같은 명령줄에 있어야 한다.

  • 참고 : 앞서 말했듯이 위 코드는 정상 작동하지 않는다. 다만 ERRORLEVEL 검사는 잘 된다.

예제 2

XCOPY를 이용한 백업 유틸리티를 제작해 보았다.

  1. @echo off
  2. rem 파일명 : Xback.bat
  3. rem 지은이 : koc2000/SALM
  4. rem 저작권 : GPL v3
  5.  
  6. rem 예제 12.
  7. rem XCOPY를 이용한 백업
  8. rem 사용법 : Xback  원본디렉터리  대상디렉터리
  9.  
  10. rem 작업 1 : 매개변수가 있는가? 없으면 도움말을 보여준다.
  11. IF NOT * == %2* (
  12.     REM 매개변수가 모두 있으면 작업을 시작한다.
  13.     REM XCOPY 명령을 이용해 백업합니다.
  14.     XCOPY %1 %2 /i /S /E /H /M
  15.  
  16.     REM 종료코드가 4 또는 그보다 크면
  17.     IF ERRORLEVEL 4 (
  18.         echo 파일을 백업하기에는 메모리가 부족하거나
  19.         echo 드라이브가 잘못 지정되었거나 명령줄 구문이 틀립니다.
  20.     ) ELSE IF ERRORLEVEL 2 (
  21.         echo 사용자가 CTRL+C를 눌러 백업 작업을 강제 종료했습니다.
  22.     ) ELSE IF ERRORLEVEL 0 (
  23.         echo 백업을 정상적으로 성공했습니다.
  24.     )
  25. ) ELSE (
  26.     REM 매개변수가 없으면 메시지를 보인 뒤 사용법을 보여준다.
  27.  
  28.     ECHO 매개변수가 없거나 모자랍니다.
  29.     ECHO 구문 : Xback  source_dir  backup_dir
  30. )
  31.  
  32. :END

위 구문에서 11행의 " IF NOT * == %2* ( " 부분은 문자열 비교문에서 다시 설명하기로 한다.

또한 위의 코드에서 ERRORLEVEL 값이 큰 값부터 차례대로 낮아지게 만드는 것이 배치파일에서는 묵시적 원칙입니다. 이는 실수로 일어날 수 있는 오류를 막기 위한 방법이지요. 왜냐하면 IF ERRORLEVEL 구문은 "같은 값"을 구하는 구문이 아니기 때문입니다.

  1. IF [NOT] ERRORLEVEL 정수 명령어

위와 같은 경우 정수보다 크거나 같으면 뒤따르는 명령어를 실행하게 되어 있습니다.

  1. IF ERRORLEVEL 1 command01
  2. IF ERRORLEVEL 2 command02
  3. IF ERRORLEVEL 3 command03
  4. IF ERRORLEVEL 4 command04
  5. IF ERRORLEVEL 15 command15

만약에 command01을 실행하고, command02부터는 실행하지 않을 생각이었다면 위와 같은 코드는 작성해서는 안됩니다. 위의 코드는 ERRORLEVEL이 1일 때만 정상 작동하고, 나머지 경우는 항상 사용자가 원하지 않는 작동을 하게 됩니다.

반드시 command01 명령만 실행하겠다면 다음과 같은 두 가지 방법이 있습니다.

  1. rem 방법1
  2. IF ERRORLEVEL 15 command15
  3. IF ERRORLEVEL 4 command04
  4. IF ERRORLEVEL 3 command03
  5. IF ERRORLEVEL 2 command02
  6. IF ERRORLEVEL 1 command05

우선 첫 방법으로는 위와 같이 큰 수부터 비교합니다. 2행에서는 종료코드가 15보다 크거나 같으면 command15 명령을 실행하게 되지요. 그러나 다음 행에 나오는 구문이 실행될 여지는 여전히 남습니다.

그럴 경우 다른 방법으로는 아래와 같이 정확한 수를 비교하게 만듭니다. 2행에서는 종료코드가 15보다 크거나 같고, 16보다 크거나 같지 않으면(작으면), 실행한다는 뜻입니다. 이러한 경우는 종료코드가 정확히 15인 경우뿐입니다.

  1. rem 방법2
  2. IF ERRORLEVEL 15 IF NOT ERRORLEVEL 16 command15
  3. IF ERRORLEVEL 4 IF NOT ERRORLEVEL 5 command04
  4. IF ERRORLEVEL 3 IF NOT ERRORLEVEL 4 command03
  5. IF ERRORLEVEL 2 IF NOT ERRORLEVEL 3 command02
  6. IF ERRORLEVEL 1 IF NOT ERRORLEVEL 2 command05

방법1에서는 goto 명령을 사용할 경우 오류가 생기지 않지만, 일반 명령을 사용할 경우에는 오류가 생길 수 있습니다.

방법2에서는 애초에 정확한 값을 비교하게 되므로 오류가 상당히 줄어들게 됩니다.

이와 비슷한 방법으로는 아래처럼 %ERRORLEVEL%을 쓰는 명령 확장이 있습니다.

  1. if /i %ERRORLEVEL% EQU 15 command15

위 문장은 문자열을 비교해 주는 if 구문입니다. 그런데 /i 선택사항이 들어감으로써 융통성을 지니게 되어 일반적인 비교를 하게 됩니다.

  1. IF ERRORLEVEL 4 (
  2.         echo 파일을 백업하기에는 메모리가 부족하거나
  3.         echo 드라이브가 잘못 지정되었거나 명령줄 구문이 틀립니다.
  4. ) ELSE IF ERRORLEVEL 2 (
  5.         echo 사용자가 CTRL+C를 눌러 백업 작업을 강제 종료했습니다.
  6. )

위의 부분은 if 구문에 뒤따르는 명령이 하나가 아닐 때 쓰는 방법입니다. 명령이 하나가 아니라는 말은 같은 명령을 두 번 이상 쓸 경우에도 해당합니다. 위의 문장은 echo 명령을 두 번 썼기 때문에 ( ) (괄호)로 묶어야 합니다. 이러한 구문은 도스의 if와는 호환성이 없는 명령 확장 가운데 하나입니다.

또한 위에서 나타난 else 명령은 반드시 if 문의 끝에만 쓰일 수 있습니다. 또한 else 앞에는 반드시 ) (닫는 괄호)가 와야 합니다. 이때 else의 뜻은 "~이지 않고"라는 뜻이고, 위의 상황에서는 "종료코드가 4보다 크거나 같지 않고"라는 뜻이 됩니다. 뒤따르는 if 구문까지 합해서 해석하면 "종료코드가 4보다 작고, 2보다 크거나 같으면"이라는 뜻이 되지요. 종료코드가 3일 수도 있지만, XCOPY 명령은 종료코드 3을 가지지 않으므로 위의 구문은 정확히 실행됩니다.

또한 위의 방식은 구조적 프로그래밍 또는 절차적 프로그래밍에 근접한 방식입니다. GOTO 명령은 최대한 억제하여 꼭 필요한 경우에만 써야 읽기 좋고, 알아보기 좋고, 고치기 쉬운 코드가 됩니다.

관련 문서

다음 예고

이 글은 스프링노트에서 작성되었습니다.

'스크립트 > 배치파일' 카테고리의 다른 글

IF 문자열  (4) 2009.04.18
IF EXIST  (0) 2009.04.15
IF 기본 설명  (6) 2009.04.09
배치파일에 매개변수 전달하기 2  (5) 2009.04.04
배치파일에 매개변수 전달하기  (0) 2009.04.01
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

IF 명령은 FOR 명령과 함께 배치파일에서 지원하는 제어 명령이다. 또한 윈도XP는 도스의 그것보다 훨씬 강력한 기능을 제공하고 있다. 이때 if 명령은 가정문을 만들고, for 명령은 반복문을 만드는 데 쓰인다.

말뜻

IF는 말 그대로 "만약"이라는 뜻을 가지고 있다. 그러므로 이 명령어를 발견하면 영어를 읽듯이 읽어가면 된다.

  • 참고 : 프로그래을 짜다 보면 프로그래밍 언어의 어순은 영어의 그것과 아주 비슷함을 알 수 있다. 또한 수학의 수식이 배열되는 순서도 영어의 어순과 많이 닮아 있다.

if 기본 문법

명령줄에서 if 사용

if를 명령줄에서 쓸 수도 있지만, 주로 배치파일 안에서 쓰인다.

위 그림을 보면 분명히 명령줄에서 if 명령을 사용하고 있다. 처음 명령은 현재 디렉터리 아래에 aa 디렉터리가 존재하지 않는다면 Not found를 출력하는 명령이며, 둘째 명령은 c:\2 디렉터리가 존재하면 Found를 출력하는 명령이다.

기본 문법

명령줄에서 다음과 같이 입력하면 기본 사용법을 알 수 있다.

if /?

일단 if 명령은 조건문에서 나타나는 결과에 따라 명령어를 수행하게 됩니다. 이때 조건문은 다음과 같은 세 가지입니다.

  • 에러레벨문 : IF [NOT] ERRORLEVEL 숫자 명령어
  • 문자열 비교문 : IF [NOT] 문자열1==문자열2 명령어
  • 파일 존재 검사문 : IF [NOT] EXIST 파일이름 명령어

if 문은 위 세 가지 경우에 각 조건문이 참값을 가지면 뒤따르는 명령어를 실행시킵니다. 또한 세 가지 모두 "NOT"을 사용하여 조건문이 거짓인 경우에 명령어를 실행시킬 수도 있습니다. if, not, errorlevel, exist 등은 대/소문자를 가립니다. 대문자와 소문자를 구별하지 않으려면 /i 선택사항을 이용하면 됩니다. 다만 이 /i 선택사항은 명령 확장을 이용해야 한다. 다시 말해 도스의 if 명령과 호환성이 없다.

이 기본 문법에서는 명령 확장을 제외한 사항만 다룹니다.

말뜻

  • NOT은 영어 뜻 그대로 풀이하면 됩니다. 다시 말해 "~이 아니면"이라고 해석하면 됩니다.
  • ERRORLEVEL은 마지막으로 실행된 프로그램이 실행 결과로서 사용자에게 반환하는 마침 코드를 가리킵니다. 흔히 반환값이라고 부르며, 0부터 255 사이의 값을 가집니다. 일반적으로 "error level"이라고 띄어 쓰지만, 배치파일에서는 "errorlevel"이라고 자주 붙여 씁니다. 또한 ERRORLEVEL과 %ERRORLEVEL%은 서로 다르므로 주의해야 합니다. 마침코드가 뒤따르는 수보다 크거나 같으면 조건을 참으로 지정합니다.
  • 문자열은 "문자의 배열"이라는 뜻입니다. 쉽게 말하자면 화면에 보이는 글자의 모임 또는 묶음이거나, 기억장치에 저장된 문자의 모임 또는 묶음입니다. 명령줄에서 문자열은 <Enter>가 입력될 때까지 명령줄에 나타난 문자의 모임입니다. 또한 환경변수에 저장된 값은 기본적으로 문자열입니다. 이렇듯이 가리키는 대상에 따라 문자열은 조금씩 다르지만, 문자의 모임 또는 문자의 묶음이라는 점에서는 항상 같습니다.
  • 문자열의 비교 : 문자열을 비교할 때는 등호를 두 번 써서 비교합니다. 다시 말해 "문자열1==문자열2"와 같은 꼴로 비교하게 됩니다.
  • EXIST는 "존재한다"라는 뜻입니다. 이것은 항상 뒤따르는 파일이나 디렉터리가 존재하는지를 묻고, 존재하면 조건을 참으로 지정합니다.
  • ELSE는 "~이 아니면"이라는 뜻입니다. 이것은 앞서 나온 IF 명령이 조건을 거짓으로 지정할 경우에 실행하게 됩니다. IF 기본 명령에서는 다루지 않습니다.

예제

ERRORLEVEL문

마침 코드를 검사하여 알맞은 문장을 보여줍니다.

  1. @echo off
  2. rem 파일명 : GBackup1H2P.cmd
  3. rem 지은이 : koc2000/SALM
  4. rem 저작권 : GPL v3
  5.  
  6. rem 예제 11-1.
  7. rem 고스트 작업이 정상적으로 끝났는지를 알려준다.
  8.  
  9. rem 첫 번째 하드디스크 첫 번째 파티션에서
  10. rem 첫 번째 하드디스크 두 번째 파티션으로 백업한다.
  11. GHOST.exe -CLONE,MODE=PDUMP,SRC=1:1,DST=1:2\GHOST.GHO -Z9 -AUTO -SURE -RB
  12.  
  13. REM ERRORLEVEL 값이 1보다 작으면 NOERROR로 이동한다.
  14. IF NOT ERRORLEVEL 1 GOTO NOERROR
  15.     ECHO ##############################################
  16.     ECHO ##      백업 도중 오류가 발생했습니다.      ##
  17.     ECHO ##############################################
  18.     GOTO END
  19.  
  20. :NOERROR
  21.     ECHO ##############################################
  22.     ECHO ##    백업 작업을 정상적으로 마쳤습니다.    ##
  23.     ECHO ##############################################
  24.  
  25. :END
  26. REM 배치파일을 종료할 때 마침 코드를 되돌려준다.
  27. REM 이때 %ERRORLEVEL% 환경변수는 일종의 SET 명령 확장에 해당한다.
  28. EXIT /B %ERRORLEVEL%

시만텍 사의 프로그램은 오류가 발생하지 않으면 마침 코드로 0을 돌려주고, 오류가 발생하면 1 또는 1보다 큰 값을 돌려준다. 그것을 이용하여 고스트가 제대로 작업을 마쳤는지를 사용자에게 알려줄 수 있다.

  • 참고 : 위 GBackup1H2P.cmd 배치파일은 실패작이다. 배치파일을 실행할 환경을 고려하지 않고 작성한 탓에 도스에서도 윈도에서도 디스크를 백업한다는 본래 목적대로 실행이 되지 않는다. 물론 ERRORLEVEL문을 시험하는 예제라는 의미에서는 잘 작동한다.

문자열 비교문

if 명령을 이용하여 문자열을 비교할 수 있다. 도스에서는 문자열에 공백이 들어가는 경우가 없으나, 윈도에서는 공백이 들어갈 수도 있다.

앞서 만든 HelloWho2.cmd 파일을 참조하여 매개변수를 출력하는 배치파일을 만들었다.

  1. @ECHO OFF
  2. REM 파일명 : ViewPara.bat
  3. REM 지은이 : koc2000/SALM
  4. REM 저작권 : GPL v3
  5.  
  6. REM 예제 11-2.
  7. REM 매개변수를 한 줄에 하나씩 보여준다.
  8.  
  9. REM 가장 먼저 %0을 보여준다.
  10. ECHO %0
  11.  
  12. REM for 명령을 쓰지 않고 순환문을 만든다.
  13. :LOOP_START
  14.     REM %1 매개변수가 없으면 순환문을 끝낸다.
  15.     IF * == %1* GOTO :LOOP_END
  16.  
  17.     REM %1 매개변수를 출력한다.
  18.     ECHO %1
  19.  
  20.     REM %(N) 매개변수를 %(N-1) 매개변수로 자리 이동한다.
  21.     SHIFT
  22.  
  23.     GOTO :LOOP_START
  24. :LOOP_END
  25.  
  26. :END

GOTO 명령은 배치파일 내부에서 레이블이 있는 곳으로 CMD.EXE 명령줄을 옮기는 역할을 한다. 레이블은 앞에 콜론( : )을 붙여 구분하고 있다.

또한 SHIFT 명령은 %0부터 %9까지의 매개변수의 순서를 바꾸어 주는 역할을 한다. 다시 말해 %9는 %8이 되고, %8은 %7이 된다. 그렇게 하나씩 이동하며 %1은 %0이 된다. 또한 %9 바깥에 있던, 지금까지 표현하지 못했던, %10의 위치에 있던 값을 %9로 옮겨 준다.

ViewPara.bat 배치 파일은 윈도와 도스에서 모두 실행할 수 있으나, 실행 결과는 항상 같지 않다.


위는 윈도XP의 명령 프롬프트이며, 아래는 버추얼박스에서 도스 v6.22를 실행한 화면이다. 다른 경우는 모두 같지만, 따옴표로 묶인 부분을 처리하는 방법이 다르다. 다시 말해 윈도XP에서는 따옴표로 묶인 부분은 하나의 문자열로 보았지만, 도스에서는 따옴표는 무시하고 화이트스페이스(공백문자)로 나뉜 부분을 문자열로 보았다.

또한 이 문자열 비교문은 운영체제의 환경변수를 비교할 때도 쓸 수 있다.

파일 존재 검사문

배치파일은 작업에 앞서 파일이나 디렉터리가 존재하는지를 알아볼 수 있는 방법을 제공한다. 바로 "if exist"라는 구문이다.

  1. @ECHO OFF
  2. REM 파일명 : FindFile.cmd
  3. REM 지은이 : koc2000/SALM
  4. REM 저작권 : GPL v3
  5.  
  6. REM 예제 11-3.
  7. REM 명령줄에서 지정한 파일이 현재 경로에 있는지를 알려준다.
  8.  
  9. REM 판별 : %1이 없으면 도움말을 보여준다.
  10. IF * == %1* GOTO :ViewHelp
  11.  
  12. REM 판별 : %1이 있으면 그 파일이 있는지를 보여준다.
  13. IF EXIST %1 GOTO :Found
  14. ECHO File %1 was Not Found.
  15. ECHO.
  16. GOTO :END
  17.  
  18. :Found
  19. ECHO File %1 was Found.
  20. ECHO.
  21. GOTO :END
  22.  
  23. REM 도움말
  24. :ViewHelp
  25. ECHO FindFile v0.0.1
  26. ECHO Syntax : FindFile FileName
  27. ECHO.
  28.  
  29. :END

명령줄에서 매개변수로 파일명을 입력받아, 그 파일명에 해당하는 파일이 존재하는지를 알려준다.

 

다음 예고

IF 명령을 하나씩 짚어보자. (1)

이 글은 스프링노트에서 작성되었습니다.

'스크립트 > 배치파일' 카테고리의 다른 글

IF EXIST  (0) 2009.04.15
IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
배치파일에 매개변수 전달하기 2  (5) 2009.04.04
배치파일에 매개변수 전달하기  (0) 2009.04.01
배치파일 멈추기  (1) 2009.03.29
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가기에 앞서 자꾸 예고에 없는 내용이 끼어들어 죄송하다는 말을 먼저 하겠다.

들어가며

매개변수가 배치파일에 전달되는 모습을 그림으로 알아보는 자리를 마련했습니다. 뭐든 그림이 더 알기 쉽다고 생각하기 때문입니다.

말뜻

매개변수(parameter)는 도스와 윈도의 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다고 했습니다. 그런데 좀 더 보편적으로 설명한다면 운영체제와 명령어가 관ㄹ계를 가지고 있는데, 이때 명령어에 어떤 작용을 지시하는 변수를 매개변수라고 부릅니다.

매개변수와 응용프로그램

매개변수는 명령줄에서 입력받는 값이 된다. 이때 도스와 윈도에서 첫번째 매개변수를 %0이라 부르며, 이것은 운영체제에서 처리하게 된다. 다시 말해 %0을 처리하여 이것을 실행할 수 있는지, 실행할 수 없으면 그 파일과 연결된 프로그램을 호출하여 처리합니다. 다시 말해 명령 프롬프트에서 문서 파일 이름을 입력하고 <Enter>를 입력하면 바로 그 문서와 연결된 문서 편집기를 호출하여 실행시켜 준다.

우선 목록은 다음과 같다.

이때 명령줄에서 exam.txt 라고 입력하면 저 파일에 맞는 프로그램을 호출하면서 %0 매개변수로 입력 받은 exam.txt 파일을 읽어온다.

위와 같이 파일이 연결된 프로그램을 가지고 있다면 바로 읽어올 수 있다. 이것은 .txt 파일에 대한 정보를 윈도XP가 레지스트리에 가지고 있기 때문에 가능한 일이다.

이것은 다음과 같이 나타낼 수 있다.

명령줄에 입력된 매개변수는 %0과 %*로 나뉜다. 이때 매개변수 %1부터는 윈도에서 직접 구분하여 매개변수 %0으로 넘겨주는 때도 있고, 그게 아니면 %*과 같은 문자열의 형태로 넘겨줄 수도 있다.

위와 같이 윈도에서 %0 매개변수에 해당하는 ExecFile.exe를 불러들여 실행하면서 %1 매개변수부터는 문자열의 형태 또는 이미 분류된 형태로 %0 매개변수로 넘겨줘서 처리하라고 시키게 된다.

배치파일의 경우는 배치파일 안에 명령어가 하나일 때와 여럿일 때로 구분하여 생각할 수 있다.

위와 같이 배치파일 내부에서 입력 받은 매개변수를 모두 이용할 수도 있고, 그게 아니라 매개 변수 가운데 일부만을 이용할 수도 있다. 그것은 배치파일 제작자가 하기 나름이다. 일부러 더미 변수(쓰레기값)를 입력 받게 할 수도 있다.

배치파일 내부에서 사용한 명령어가 여럿이라면 위와 같이 복잡한 구성을 지닐 수도 있다. 그러나 대개는 %1, %2, %3, %4, %5, %6, %7, %8, %9, %*과 같은 매개변수는 배치파일 첫머리에서 해석하여 프로그래머가 지정한 환경변수로 치환하여 저장하는 것이 일반적이며, 위와 같은 형태는 예시를 들기 위해 나타낸 상황일 뿐임에 유의하자.

실제로 위와 같이 프로그램을 작성했다면, 그다지 좋은 프로그래밍 습관이 아니라고 해야겠다.

과제

지난 시간에 냈던 과제의 결과는 다음과 같다.

  • ECHO 명령을 이용하여 화면에 OFF라는 세 글자를 출력하시오. 
  1. @ECHO.OFF

위의 코드는 아래와 같은 결과를 보인다. 위의 코드에서 ECHO와 OFF 사이에 빨간 점(.)을 잘 보자.

OFF

다음 코드는 OFF 앞에 공백을 한 칸 추가할 수 있다. 공백에는 색깔을 넣었다.

  1. @ECHO. OFF

다음 코드는 OFF 앞에 공백을 두 칸 추가할 수 있다. 공백에는 서로 다른 색깔을 넣었다.

  1. @ECHO.  OFF

다음 코드는 OFF 앞에 공백을 두 칸 추가한 것과 같은 효과를 줄 수 있다. <Alt+255>는 아스키문자 255번을 가리킨다. 위의 코드들과는 달리 빨간 점(.)이 없다.

  1. @ECHO <Alt+255>OFF
 
  • DIR 명령을 이용하여 원하는 폴더(디렉터리)의 내용을 폴더(디렉터리)만 보여주도록 한다. /A /P 선택사항을 반드시 사용할 것.


  1. DIR /A:D /P %1
  2. DIR /AD /P %1

위의 두 코드 가운데 하나가 자신의 배치 파일에 있고, 그것이 실제로 작동하면 정답이다.

다음 예고

if 명령 이해하기.

이 글은 스프링노트에서 작성되었습니다.

'스크립트 > 배치파일' 카테고리의 다른 글

IF ERRORLEVEL에 쓰이는 종료코드  (12) 2009.04.14
IF 기본 설명  (6) 2009.04.09
배치파일에 매개변수 전달하기  (0) 2009.04.01
배치파일 멈추기  (1) 2009.03.29
그밖에 출력  (2) 2009.03.26
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

앞서 매개변수의 의미와 자기자신(?)을 출력하는 배치파일을 소개했다.

이 글에서는 매개변수를 활용하여 프로그램을 작성해 보자.

말뜻

매개변수, 곧 파라미터(parameter)는 도스와 윈도의 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다. 자주 언급되었던 ECHO OFF 명령에서 실제 명령어는 ECHO뿐이고, OFF는 매개 변수이다. 명령줄에서 명령어 뒤에 죽 나열하는 문자열은 대개 매개변수이다.

또한 매개변수 전달이란 명령줄에 입력한 명령과 매개변수를 프로그램에서 사용할 수 있는 형태로 알려주는 일을 가리킨다. 이를 위해 배치파일은 %n의 꼴을 사용한다.

  1. @echo Hello %0!

앞서 사용했던 저 한 줄짜리 코드 마지막에 붙은 %0와 같은 꼴로 쓰인다는 뜻이다.

매개변수를 정확히 알기

매개변수 %0과 %*

지금까지 말한 매개변수는 정확하지 않다. 물론 그와 같은 설명이 틀렸다는 말이 아니다. 그러나 엄밀히 말하면 옳지는 않다.

  1. @rem HelloWho.cmd
  2. @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을 제외한 모든 매개변수를 불러오는 기능을 사용해서 처리했을 뿐이다.

  1. @rem HelloWho2.cmd
  2. @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 와 같은 의미이다.

  1. @echo off
  2. rem 예제 10 : 사용자가 지정하는 폴더를 보여주는 배치파일
  3. rem 파일명 : exam10.cmd
  4. rem 지은이 : koc2000/SALM
  5. rem 저작권 : GPL v3
  6. echo 예제 10.
  7. echo 사용자가 지정하는 폴더를 보여준다.
  8. echo 보다가 종료하려면 Ctrl+Pause 키나 Ctrl+C를 누르시오.
  9. PAUSE
  10. echo.
  11. 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
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

혼동하기 쉬운 여러 가지를 말하고자 합니다.

명령줄과 명령 프롬프트가 같은 뜻일까요? 아니면 다른 뜻일까요? 배치파일에서는 어떻게 윈도용 프로그램을 실행시킬 수 있을까요? 이와 같은 질문을 생각해 본 적이 있는 사람은 궁금하겠지요.

하나씩 차근차근 알아보기로 하죠.

명령줄? 명령 프롬프트?

명령줄과 명령 프롬프트는 자주 섞어쓰거나 헷갈리지만 분명히 다릅니다.

커맨드 라인(Command Line), 곧 명령줄은 모니터 화면에서 사용자가 명령을 입력하도록 되어 있는 행을 뜻합니다. 덧붙여 그러한 명령이 기억되는 기억장치의 영역도 명령줄이라고 한다네요. 흔히 '명령행'이라고 부릅니다. 한편 CLI(Command Line Interface)를 커맨드 라인이라고 부르기도 합니다.

명령 프롬프트(Command Prompt)는 명령줄에서 명령을 받을 준비가 되었음을 알리는 특별한 문자를 가리킵니다. 이를 확장하여 명령줄에서 명령을 받을 준비를 하고, 명령을 받은 뒤에 결과를 사용자에게 보여주는 일련의 환경을 명령 프롬프트라고 부르지요. 흔히 프롬프트라고 합니다.

이 때문에 컴퓨터를 운영하는 환경을 말할 때에는 한 줄짜리 명령줄은 존재하지만, 한 줄짜리 명령 프롬프트는 존재할 수 없답니다. 명령줄은 명령을 받음으로써 그 역할을 다하지만, 명령 프롬프트는 결과를 사용자에게 보여주어야 하기 때문입니다.

Windows Registry Editor Version 5.00

 

[HKEY_CLASSES_ROOT\Applications\Hwp.exe\shell\open\command]

@="D:\\Bin\\HNC\\Hwp65\\Hwp.exe \"%1\""

위의 파일은 한글과컴퓨터 사의 한/글/2005의 레지스트리 일부입니다. 그 내용은 "명령줄을 레지스트리 안에 어떻게 집어넣을 것인지"를 서술하고 있습니다.

다시 말해 HKEY_CLASSES_ROOT\Applications\Hwp.exe\shell\open\command 라는 키를 찾아서 기본값( @ )으로 문자열(따옴표로 묶인 부분을 문자열로 해석한다) "D:\\Bin\\HNC\\Hwp65\\Hwp.exe \"%1\""을 입력하라는 내용입니다. 이때 문자열의 내용은 지금까지 배치파일에서 다루었던 명령줄 방식을 그대로 따르고 있습니다.

혼동하지 않도록 그림 하나 올립니다.

명령 프롬프트와 명령줄의 차이

명령 프롬프트와 명령줄의 차이

배치파일과 윈도용 프로그램

윈도용 프로그램을 배치파일에서 실행할 수 있게 된 것은 언제인지 모른다. START.EXE 파일을 이용해서 윈도용을 실행한 것은 윈도95가 처음으로 알고 있다. 하지만 명령줄에서 바로 실행하게 된 것은 언제인지 모르고 있다. (아는 사람은 댓글 좀 달아 주세요.)

아무튼 윈도2000과 윈도XP(이하 '윈도')에서는 명령줄에서 바로 윈도용 프로그램을 실행할 수 있다.

왜?

그것은 윈도에 내장된 CMD.EXE 파일이 명령 프롬프트를 구동해 주는 파일인 동시에 윈도의 명령어 셸 가운데 하나이기 때문이다.

명령어 셸은 운영체제에서 지원하는 명령어를 처리하는 프로그램이다. 도스에서는 COMMAND.COM, 윈도 95에서는 도스 모드에서는 COMMAND.COM, 윈도 모드에서는 EXPLORER.EXE였다. 윈도2000 이후로는 주로 EXPLORER.EXE를 쓰며, CMD.EXE도 쓸 수 있다.

아무튼 이 명령어 셸에는 사용자가 쓸 수 있는 명령어가 내장되어 있다. 우리가 마우스를 움직여 파일을 복사하는 등의 명령이 이미 정의되어 있다는 뜻이다. 그런데 특이하게 명령 프롬프트용 명령어 셸인 CMD.EXE가 윈도의 메인 명령어 셸로 쓰일 수 있다. 윈도2000용 PE(사전 설치 환경)가 처음 선보였을 때 명령어 셸로 쓰인 프로그램은 EXPLORER.EXE 프로그램이 아니라 CMD.EXE 프로그램이었다.

또한 윈도의 안전모드에서 명령 프롬프트 사용을 선택하면 CMD.EXE를 셸로 선택하는 환경을 구성한다.

윈도XP 고급 옵션

윈도XP 고급 옵션

그때 윈도의 창모드 명령어를 사용할 수 있다. 그 말은 이미 CMD.EXE 안에 창모드 프로그램을 실행할 수 있게 구성되어 있다는 뜻이다.

그리고 그것을 이용하여 윈도용 프로그램 가운데 창모드 프로그램까지 배치파일에서 불러와서 실행할 수 있게 된다.

쉽게 말해, 윈도에서 CMD.EXE를 통해 모든 프로그램을 실행할 수 있게 만들었다고 생각하면 된다.

도스에서 작성한 배치파일

도스에서 작성한 배치파일을 윈도에서 실행할 수 있을까?

먼저 그것이 윈도에서도 정상 작동하지 않을 수도 있음을 충분히 이해해야 합니다. 아니, 심지어 심각한 문제가 발생할 수도 있다. 각각의 명령어가 가지고 있는 뜻을 잘 이해해야 하며, 또한 각각의 배치파일 팁이 가진 진정한 의미를 숙지하고 있어야 합니다.

다음과 같은 배치파일 팁은 도스 6.2x 이하에서는 정상 작동하지만 윈도95부터는 정상 작동을 보장하지 않습니다.

  1. @ECHO OFF
  2. REM 파일명 : UPPER.BAT
  3. REM 매개 변수를 입력 받아 대문자로 바꾸어 _UPPER 환경 변수에 넣어서 돌려준다.
  4. REM 도스에서는 실행 경로 환경 변수인 PATH는 항상 대문자만을 저장한다는 점을
  5. REM 이용하여 입력 받은 매개 변수를 대문자로 바꾼다.
  6.  
  7. REM 실행 경로를 _TEMP 환경 변수에 저장한다.
  8. SET _TEMP=%PATH%
  9.  
  10. REM 매개 변수를 PATH 환경 변수에 저장한다.
  11. SET PATH=%1 %2 %3 %4 %5 %6 %7 %8 %9
  12.  
  13. REM PATH 환경 변수에 저장된 문자열을 _UPPER 환경 변수에 복사, 저장한다.
  14. SET _UPPER=%PATH%
  15.  
  16. REM PATH 환경 변수를 복원한 뒤 _TEMP 환경 변수를 지운다.
  17. SET PATH=%_TEMP%
  18. SET _TEMP=

위 배치파일 UPPER.BAT는 단순히 환경 변수만을 다루어 피해가 거의 없다. 하지만 최종적으로 윈도 폴더 등을 다루는 배치파일이 있었다면 끔직한 결과가 발생할 수도 있다.

게다가 주요 명령줄 명령어는 윈도에도 존재하기 때문에 그것을 사용할 수 있다. 참고로 윈도에서 사용할 수 있는 명령어 목록은 다음과 같다. (명령줄에서 HELP 명령을 내리면 알 수 있다.)

특정 명령어에 대한 자세한 내용이 필요하면 HELP 명령어 이름을 입력하십시오.
ASSOC    파일 확장명 연결을 보여주거나 수정합니다.
AT       명령어와 프로그램의 실행을 스케줄합니다.
ATTRIB   파일 속성을 표시하거나 바꿉니다.
BREAK    확장된 CTRL+C 검사를 설정하거나 지웁니다.
CACLS    파일의 액세스 컨트롤 목록(ACL)을 표시하거나 수정합니다.
CALL     한 일괄 프로그램에서 다른 일괄 프로그램을 호출합니다.
CD       현재 디렉터리 이름을 보여주거나 바꿉니다.
CHCP     활성화된 코드 페이지의 번호를 표시하거나 설정합니다.
CHDIR    현재 디렉터리 이름을 보여주거나 바꿉니다.
CHKDSK   디스크를 검사하고 상태 보고서를 표시합니다.
CHKNTFS  부팅하는 동안 디스크 확인을 화면에 표시하거나 변경합니다.
CLS      화면을 지웁니다.
CMD      Windows 명령 인터프리터의 새 인스턴스를 시작합니다.
COLOR    콘솔의 기본색과 배경색을 설정합니다.
COMP     두 개 또는 여러 개의 파일을 비교합니다.
COMPACT  NTFS 분할 영역에 있는 파일의 압축을 표시하거나 변경합니다.
CONVERT  FAT 볼륨을 NTFS로 변환합니다. 현재 드라이브는
        변환할 수 없습니다.
COPY     하나 이상의 파일을 다른 위치로 복사합니다.
DATE     날짜를 보여주거나 설정합니다.
DEL      하나 이상의 파일을 지웁니다.
DIR      디렉터리에 있는 파일과 하위 디렉터리 목록을 보여줍니다.
DISKCOMP 두 플로피 디스크의 내용을 비교합니다.
DISKCOPY 플로피 디스크의 내용을 다른 플로피 디스크로 복사합니다.
DOSKEY   명령줄을 편집하고, Windows 명령을 다시 호출하고, 매크로를 만듭니다.
ECHO     메시지를 보여주거나, 명령어 반향을 켜거나 끕니다.
ENDLOCAL 일괄 파일에서 환경 변경의 지역화를 끝냅니다.
ERASE    하나 이상의 파일을 지웁니다.
EXIT     CMD.EXE 프로그램(명령 인터프리터)을 마칩니다.
FC       두 파일 또는 파일의 집합을 비교하여 다른 점을
        표시합니다.
FIND     파일에서 텍스트 문자열을 찾습니다.
FINDSTR  파일에서 문자열을 찾습니다.
FOR      파일 집합에서 각 파일에 대해 지정된 명령을 실행합니다.
FORMAT   Windows에서 사용할 디스크를 포맷합니다.
FTYPE    파일 확장 연결에 사용되는 파일 형식을 표시하거나 수정합니다.
GOTO     Windows 명령 인터프리터가 일괄 프로그램에서 이름표가 붙여진
        줄로 가게 합니다.
GRAFTABL Windows가 그래픽 모드에서 확장 문자 세트를 표시할
        수 있게 합니다.
HELP     Windows 명령어에 관한 도움말을 제공합니다.
IF       일괄 프로그램에서 조건 처리를 수행합니다.
LABEL    디스크의 볼륨 이름을 만들거나, 바꾸거나, 지웁니다.
MD       디렉터리를 만듭니다.
MKDIR    디렉터리를 만듭니다.
MODE     시스템 장치를 구성합니다.
MORE     출력을 한번에 한 화면씩 표시합니다.
MOVE     하나 이상의 파일을 한 디렉터리에서 다른 디렉터리로 옮깁니다.
PATH     실행 파일의 찾기 경로를 보여주거나 설정합니다.
PAUSE    일괄 파일의 처리를 보류하고 메시지를 보여줍니다.
POPD     PUSHD 명령으로 저장된 디렉터리로 바꿉니다.
PRINT    텍스트 파일을 인쇄합니다.
PROMPT   Windows 명령 프롬프트를 바꿉니다.
PUSHD    현재 디렉터리를 저장한 후 디렉터리를 바꿉니다.
RD       디렉터리를 지웁니다.
RECOVER  불량이거나 결함이 있는 디스크에서 읽을 수 있는 정보를 복구합니다.
REM      일괄 파일 또는 CONFIG.SYS에서 주석을 기록합니다.
REN      파일 이름을 바꿉니다.
RENAME   파일 이름을 바꿉니다.
REPLACE  파일을 대체합니다.
RMDIR    디렉터리를 지웁니다.
SET      Windows 환경 변수를 보여주거나, 설정하거나, 지웁니다.
SETLOCAL 일괄 파일에서 환경 변경의 지역화를 시작합니다.
SHIFT    일괄 파일에서 바꿀 수 있는 매개 변수의 위치를 바꿉니다.
SORT     입력을 정렬합니다.
START    지정된 프로그램이나 명령을 별도의 창에서 시작합니다.
SUBST    경로를 드라이브 문자로 지정합니다.
TIME     시스템 시간을 보여주거나 설정합니다.
TITLE    CMD.EXE 세션에 대한 창의 창 제목을 설정합니다.
TREE     드라이브 또는 경로의 디렉터리 구조를 그래픽으로 화면에 표시합니다.
TYPE     텍스트 파일의 내용을 보여줍니다.
VER      Windows 버전을 보여줍니다.
VERIFY   파일이 디스크에 올바로 쓰였는지 검증할지
        여부를 지정합니다.
VOL      디스크 볼륨 이름과 일련 번호를 보여줍니다.
XCOPY    파일과 디렉터리 트리를 복사합니다.

저 가운데 파일 형태로 존재하는 명령도 있고, CMD.EXE 셸에 내장된 명령어도 있다. 또한 도스 명령어와 명령어는 같지만, 그 내용에서 현저한 차이를 보이는 SET이나 IF, FOR 등의 명령어는 다시 공부할 필요가 있다.

도스와 윈도의 차이

도스와 윈도2000/XP의 차이는 많지만 몇 가지만 밝히겠다. 내가 아는 것만. ^^a 도스는 명령줄 기반이고, 윈도 그래픽 환경 기반이라는 점과 같은 차이가 아니라 배치파일을 운용할 때 주의해야 할 차이점을 나열하였다.

  1. 도스에서는 파일이름이 파일명.확장자 형태로 8자, 3자였다. 윈도에서는 파일명과 확장자를 합해서 255자까지 만들 수 있다.
  2. 도스, 즉 MS도스에서는 배치 파일 확장자가 .BAT였으나, 윈도에서는 .BAT는 물론이고 .CMD도 있다.
  3. 도스에서는 디렉터리를 7단계까지 만들 수 있다. 윈도에서는 255자 한계 안에서 얼마든지 만들 수 있다.[각주:1] 예컨대 C:\A11\B22\C33\D44\E55\F66\G77\H88\FILE.EXT 파일은 도스에서는 읽지 못할 수도 있다.[각주:2] 그러나 윈도에서는 문제 없이 읽을 수 있다.
  4. 도스에서는 파일이름을 포함한 경로가 66자이거나 그보다 짧아야 한다.
  5. 도스에서는 파일이름에 공백을 포함할 수 없다. 윈도에서는 공백을 포함할 수 있다.
  6. 도스에서는 NUL, PRN 등의 이름을 가진 파일을 만들 수 없다. 윈도에서는 그러한 이름도 허용된다. 다만 약간 다른 방법이 써야 한다. QAOS : LPT1과 같은 다른 예약된 이름을 삭제할 수 없는 경우 참조.
  7. 도스에 환경 변수 이름은 항상 대문자로 나타나지만, 윈도에서 소문자 환경 변수도 있다. 예컨대 윈도에서 windir 환경 변수는 소문자로 이루어져 있다. 이때 소문자 환경변수를 대문자로 입력하더라도 인식한다. 다시 말해 ECHO %WINDIR% 명령은 적법하다.

그밖에 내가 모르는 차이가 있을 수도 있다.

배치파일로 악성 코드를 만들 수 있나?

당연한 말이겠지만, 만들 수 있다고 한다.

이는 배치파일로 배치파일을 만들 수 있고, 그에 따라 복제 가능한 코드도 만들어낼 수 있다. 또한 시스템에 위해를 끼치는 코드를 만들 수 있다. 이와 같은 상황을 종합하면, 자기 자신을 복제할 수 있으며 시스템에 위해를 끼칠 수 있는 배치파일을 만들 수 있다는 뜻이 된다.

이것은 매우 예외적인 경우이다. 하지만 컴퓨터 바이러스 프로그램이 도스 2.0판에서 처음 제공된 PRINT 프로그램을 연구하여 만들었다는 사실에 비추어 보자면, 배치파일로 악성 코드를 만드는 일도 불가능하다고 볼 수는 없다.

다시 예외가 겹쳐서 사소한 실수로 그런 코드를 만들어낼 수도 있으므로 주의를 기울일 필요가 있다. 물론 윈도XP 등에서는 중요한 파일은 시스템 차원에서 보호하고 있기는 하다. 그럼에도 불구하고 boot.ini, ntldr, NTDETECT.COM 등의 파일을 삭제하거나 수정하는 실수를 내포하는 배치파일이 만들어질 수 있으므로 주의해야 한다.

특히 ntldr 파일과 NTDETECT.COM 파일이 손상되면 부팅이 되지 않을 수도 있으므로 다시 한 번 주의하자.

실행 경로란?

실행 경로란 흔히 "패스"라고 부른다. 명령어 PATH로서 알아볼 수 있으며, 정확한 명칭은 실행 파일의 검색 경로이다. PATH 환경 변수에 그 값이 문자열로 저장되어 있다.

PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\Bin\Windows Imaging\;c:\1\TC UP\PLUGINS\Library

위와 같을 때 내가 명령 프롬프트에서 명령어를 입력했을 때 가장 먼저 현재 경로에서 찾게 된다. 현재 경로는 대개 커서가 깜박이는 자리의 왼쪽으로 나타나게 된다. 위에서 말했듯이 실행 경로는 대문자와 소문자가 쓰이며, 실제 윈도에 존재하는 경로명과 문자 크기가 달라도 상관없다. 예컨대 실제 경로명이 C:\WINDOWS라고 할 때 PATH 환경 변수에는 c:\windows라고 소문자로 기록되어도 된다는 뜻이다.

아무튼 위의 예시에 나타난 순서를 보면, C:\WINDOWS\system32 디렉터리(폴더)에서 실행파일을 가장 먼저 찾고, 그 다음이 C:\WINDOWS, C:\WINDOWS\System32\Wbem, D:\Bin\Windows Imaging, c:\1\TC UP\PLUGINS\Library 와 같은 순서로 찾게 된다. 이때 주의할 점은 명령어 셸 내장 명령어를 현재 경로보다 먼저 찾게 된다는 사실이다. 지금까지 자주 사용했던 ECHO 명령도 CMD.EXE 파일에 내장된 명령어이다.

정리하면 명령어 셸 내장 명령어를 가장 먼저 찾고, 그 뒤에 현재 경로에서 실행파일을 찾고, 마지막으로 PATH 환경 변수에 저장된 경로에서 실행파일을 찾게 된다. 그래도 못 찾으면 다음과 같은 메시지를 보여준다.

'XXXXX'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는

배치 파일이 아닙니다.

실행 파일이란?

그렇다면 실행 파일은 무엇일까? 위의 예시에 나타난 "외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일"을 통틀어 실행 파일이라고 부른다. 이것은 PATHEXT 환경 변수에 저장되어 있는 값으로서 배치파일에서 이용할 수 있는 명령어에서 설명한 내용이 그것이다. 그때 좀 부정확하게 설명했었다. 배치파일에서 이용할 수 있는 명령어를 설명하면서 SCF 등의 파일도 설명했으나, 사실 그것을 명령어로 보기에는 무리가 있었다. 아무튼 PATHEXT는 특별한 확장자를 가진 파일을 실행할 수 있다는 의미를 가지고 있다.

PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH

확장자가 .COM, .EXE, .BAT, .CMD, .VBS, .VBE, .JS, .JSE, .WSF 및 .WSH일 때 실행할 수 있다는 뜻이다. 이때 실행하는 순서는 .COM 파일이 가장 먼저이고, 그 다음으로 .EXE 등의 순서를 따른다.

이때 .BAT 파일을 .CMD 파일보다 먼저 찾게 된다. 이 말은 Hello.bat 파일과 Hello.cmd 파일이 존재한다면 Hello 라고 명령을 주었다면 Hello.bat 파일이 실행된다는 뜻이다. Hello.cmd를 실행하고 싶다면 반드시 명령행에서 Hello.cmd를 입력하기 바란다.

프로그래밍에서는 왜 Hello World를 가르칠까?

대부분 처음 배우는 프로그램이 Hello World 문자열 출력이다. 왜 그것을 가르칠까? 설마 아무 생각 없이 가르치고, 또한 아무 생각 없이 배웠다면 지금 생각해 보기 바란다.

왜 그것을 가르칠까?

아주 당연한 말이지만, 컴퓨터 프로그램은 일반적으로 사용자에게 결과를 보여주어야 하기 때문이다.

Hello World 화면 출력을 가르침으로써 프로그래밍의 근본 목적(사용자에게 결과 보여주기)을 가르칠 수 있다는 뜻이다. 아울러 잊지 말아야 할 점, 곧 사용자는 항상 자신이 프로그램을 통해서 한 일을 알고 싶어한다는 점을 기억하게 만들 목적에서 그것을 가르치게 된다.

혹시 자신이 만든 프로그램이 사용자에게 아무런 정보도 주지 않는다면, 지금이라고 고치기 바란다. 정보를 주지 않는 프로그램은 외면받기 쉽상이기 때문이다.

다음 예고

매개 변수를 배치파일에 전달하는 방법에 대해서 알아보겠다.

위에서 다루지 못한 사항은 질문을 하기 바란다. 나중에 다시 이런저런 이야기2를 만들어 이야기하겠다.

이 글은 스프링노트에서 작성되었습니다.

  1. 다만 이것이 디렉터리 경로 전체 길이에 대한 제한인지는 모르겠다. 너무 오래 되어 기억이 가물가물하다. [본문으로]
  2. 읽지 못하면 정상이고, 읽을 수 있다면 편법을 동원해서라도 읽을 수 있게 해 놓은 것이다. [본문으로]

'스크립트' 카테고리의 다른 글

환경 변수 2  (9) 2009.05.03
환경 변수 1  (0) 2009.05.02
스크립트란 무엇인가? 배치파일이란 무엇인가?  (8) 2009.03.21
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

배치파일에서 프로그램을 실행할 때 경우에 따라서는 잠시 멈추거나, 때에 따라서 완전히 종료해야 할 수도 있다.

그러한 경우는 주로 배치파일의 일부에서 오동작이 생겨서 배치파일 전체에 영향을 주는 때나 진행 화면을 잠시 멈춘 뒤 보고 싶을 경우 등이 이에 해당한다.

잠시 멈추기

키를 눌러 잠시 멈추기

윈도 폴더를 보여주는 배치파일을 만들어 보자.

  1. @echo off
  2. rem 예제 5 : 윈도 폴더를 보여주는 배치파일
  3. rem 파일명 : exam05.bat
  4. rem 지은이 : koc2000/SALM
  5. rem 저작권 : GPL v3
  6.  
  7. echo 예제 5.
  8. echo 윈도 폴더를 보여준다.
  9. echo 보다가 잠시 멈추려면 Pause 키나 Ctrl+S를 누르시오.
  10. echo.
  11. dir C:\WINDOWS /s /a
  12. echo 끝.

배치파일을 만들 때에는 안내문을 보여줄 수 있게 하려고 했는데, 뭔가가 번개같이 지나가 버려 전혀 알아볼 수가 없었다. 본의 아니게 번갯불에 콩 볶는 모습을 보여준 격이 되었다.

 <예제5 결과 화면>

<예제5 결과 화면>

이번에는 명령 프롬프트에서 exam05 라고 명령을 내린 뒤에 얼른 <Pause> 키를 누르도록 하자. <Pause> 키는 키보드의 왼쪽 위, 숫자 패드의 왼쪽 위에 있다.

<예제5 잠시 멈춘 화면>

<예제5 잠시 멈춘 화면>

이때 <Pause> 키는 잠시 멈추라는 기능을 가지고 있다. 물론 윈도에서는 거의 동작하지 않지만, 이렇듯이 명령 프롬프트나 도스 상태에서 잘 작동한다. 도스 상태에서도 게임 등에서는 마찬가지로 거의 동작하지 않는다.

멈춤 명령

물론 도스에서도 명령행에서 멈추게 하는 명령어가 있다.

  1. @echo off
  2. rem 예제 5-1 : 윈도 폴더를 보여주는 배치파일
  3. rem 파일명 : exam05-1.bat
  4. rem 지은이 : koc2000/SALM
  5. rem 저작권 : GPL v3
  6.  
  7. echo 예제 5-1.
  8. echo 윈도 폴더를 보여준다.
  9. echo 보다가 잠시 멈추려면 Pause 키나 Ctrl+S를 누르시오.
  10. echo 다시 재개하려면 아무 키나 누르십시오.
  11. echo.
  12. echo 윈도 폴더를 보여줍니다.
  13. pause
  14. echo.
  15. dir C:\WINDOWS /s /a
  16. echo 끝.

위에 추가된 PAUSE 명령이 그것이다.

위의 명령을 실행시키면 아래처럼 일단 한 번 멈춘다.

<예제5-1 잠시 멈춘 화면>

<예제5-1 잠시 멈춘 화면>

강제 중단

방금 만든 exam06.cmd 파일을 다음과 입력하여 저장하자.

  1. @echo off
  2. rem 예제 6 : 시간과 날짜를 보여주는 도중에 잠시 멈추고
  3. rem          강제 종료에 대해 알려준다.
  4. rem 파일명 : exam06.cmd
  5. rem 지은이 : koc2000/SALM
  6. rem 저작권 : GPL v3
  7.  
  8. echo 예제 6.
  9. echo 날짜를 보여주고 멈춥니다.
  10. echo.
  11. echo 날짜를 바꾸려면 알맞은 날짜를 형식에 맞추어 넣으시오.
  12. echo 날짜를 바꾸지 않으려면 Enter를 누르시오.
  13. echo.
  14. date
  15. echo.
  16. echo 시간을 보여주고 멈춥니다.
  17. echo 종료하려면 Ctrl+C 또는 Ctrl+Break를 누르시오.
  18. pause
  19. echo.
  20. echo 시간을 바꾸려면 알맞은 시간을 형식에 맞추어 넣으시오.
  21. echo 시간을 바꾸지 않으려면 Enter를 누르시오.
  22. echo.
  23. time
  24. echo.
  25. echo 끝.

줄 수는 많지만, 실제 코드는 얼마 되지 않는다. 굳이 실행 화면은 보이지 않겠다. 실제로 실행해 보면 몇 가지 의문이 생길 터이다. 그때 질문을 올리기를 바란다. 위에서 보이고자 하는 바는 명령줄에서 <Ctrl+C> 또는 <Ctrl+Break>를 누르면 강제 중단하는 기능이 있다는 데 있다.

매개 변수

이번에는 지난 번에 예고했던 "파라미터"를 배치파일에 전달하는 방법에 대해서는 다루지 않겠다. 차례로 보면 그것을 알려줘야 하지만, 그것이 무엇인지만 설명하고 넘어가겠다.

파 라미터(parameter)는 도스와 윈도에서 매개 변수로 불린다. 이것은 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다. 자주 언급되었던 ECHO OFF 명령에서 실제 명령어는 ECHO뿐이고, OFF는 매개 변수이다.

  1. cls
  2. echo Hello World!
  3. pause

맨 처음 소개했던 clear.bat 파일의 내용이다.

위에서 CLS, ECHO, PAUSE는 명령어이고, ECHO 다음에 오는 Hello World! 부분은 매개 변수이다. 이때 명령어 자신도 매개 변수에 포함된다. 이것은 아주 특별한 경우이다.

  1. @echo Hello World!

위와 같이 입력하고 Hello.cmd 라고 저장하자. 단 한 줄이지만, 엄연히 배치파일이며, 프로그램이다. (색깔은 구분하기 위해 넣은 것이다. 내용만 제대로 입력하면 된다.)

실행시켜 보면 다음과 같이 나온다.

<Hello.cmd 실행 화면>

이대 내용을 약간 바꾸어 HelloMe.cmd 라고 저장하자. 끝에 %0 은 퍼센트 기호와 숫자 0 (영)이다.

  1. @echo Hello %0!

실행 결과는 직접 보고 느끼기 바란다. 그것까지 알려주면 식상할 듯 여겨져 올리지 않았다.

배치파일 이름을 바꾸어서 실행해 보기 바란다. 뒤에 확장자를 붙여 실행해 보고, 붙이지 않고 실행해 보기 바란다.

이때 명령어 자신도 매개 변수에 포함된다. 이것은 아주 특별한 경우이다.

저 말이 무슨 뜻인지 확실히 알게 되리라 생각한다.

아무튼 매개변수를 배치파일에 전달하라고 지정한 적은 없다. 그러나 명령어 해석기 안에는 이미 명령어 자신을 매개변수로 인식하도록 프로그램되어 있다는 점을 기억하자.

요약

  • 명령줄에서 잠시 멈출 때는 <Ctrl+S> 또는 <Break> 키를 누르면 된다.
  • 명령줄에서 강제 종료할 때는 <Ctrl+C> 또는 <Ctrl+Break> 키를 누르면 된다.
  • 파라미터(parameter)는 도스와 윈도에서 매개 변수로 불린다. 이것은 명령줄에서 어떤 명령어와 관계를 맺고 어떤 작용을 지시하는 변수나 인자를 가리킨다.

    • 명령어 자신도 매개변수이다.

지금까지 만들었던 배치파일을 압축하여 묶었다. 몇몇 파일은 강좌에서는 없었던 것도 있지만 시험 삼아 만든 파일이다.

  • 파일 : batch001.zip (3,877 바이트)
  • CRC32 값 : C1D834F1
  • MD5 값 : 7758c952ca718a16c65bb31793d10841

다음 예고

이번에는 지난 번에 예고했던 매개 변수를 배치파일에 전달하는 방법에 대해서는 좀 더 나중에 다루겠다.

일단 다음 강좌에서는 쉬어가는 시간을 마련했다. 기초가 끝났으므로 이것저것 잡다한 이야기를 하겠다.

이 글은 스프링노트에서 작성되었습니다.

글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

배치파일에서 좀 더 자세한 화면 출력과 배치파일의 가독성에 대해 알아보자.

화면 출력에서는 빈 줄과 ECHO와는 관계를 알게 되며, 배치파일의 가독성에서는 프로그래밍 일반에서 다루는 보기 좋은 코딩에 대해서 알게 됨을 목표로 하고 있다.

빈 줄 출력

배치파일에서 빈줄을 출력하는 일은 상당히 쉬우면서도 상당히 어렵다. 알기만 하면 아주 간단하지만, 모를 때는 갑갑하게 만드는 것이 "빈 줄 출력"이다.

첫 번째 시도

실험적인 코드를 만들어 보자.

  • 소스 코드 : 예제 4
    @echo off
    rem 예제 4 : 빈 줄 출력 예제
    rem 파일명 : exam04.bat
    rem 지은이 : koc2000/SALM
    rem 저작권 : GPL v3

    echo 예제 4.

    echo 이것은 빈 줄 출력 예제 4입니다.

    echo 끝.

메모장을 열어서 위와 같은 코드를 입력하고 실행시켜 보기 바란다. 엔터를 쳐서 빈줄을 만든 만큼 빈 줄이 화면에 출력되는가?

20090326ex4.png
<예제4 출력화면>

사실 이것은 그리 놀라운 일이 아니다.

지난 글에서 말한 ECHO 명령의 역할이 무엇인지를 생각하면 당연한 결과이다. ECHO OFF 는 "사용자에게 보이는 명령어 반향을 끈다"라는 뜻이었다. <Enter>를 쳐서 빈 줄을 만든 경우 사용자에게 보이는 명령어 반향이 공백 1줄(빈 줄)이었는데, 그 명령어 반향을 감추게 되면, <Enter>로써 만든 빈 줄이 사라지는 효과가 생긴다. 그렇다고 ECHO ON 을 하여 명령어 반향을 켜서 지난번의 그 지저분한 화면을 보기도 조금 그렇다. 빈대 잡으려고 초가 삼간을 태우는 격이다.

앞서 말했듯이 배치파일에서 빈 줄을 출력하는 일은 상당히 쉬우면서도 상당히 어렵다.

또 다른 시도

방금 만든 exam04.bat 파일을 다음과 같이 편집하고 exam04-1.bat라는 이름으로 저장하자.

  • 소스 코드 : 예제 4
    rem 예제 4-1 : 화면에 간단한 말을 출력한다.
    rem 파일명 : exam04-1.bat
    rem 지은이 : koc2000/SALM
    rem 저작권 : GPL v3
    echo 예제 4-1.
    echo _
    echo 이 프로그램은 화면 출력 예제 4-1입니다.
    echo _
    echo 끝.

실행해 보면, 아까와는 다른 결과가 나왔음을 알 수 있다. 위에서 주황색 바탕의 밑줄은 밑줄을 입력하라는 말이 아니라 스페이스 바를 한 번 눌러 빈칸을 만들라는 뜻이다. 빈칸은 하나가 아니라 훨씬 많아도 상관없다.

20090326ex4-1.png
<예제4-1 출력화면>

이때 알 수 있는 것은 빈칸의 수가 아무리 많아도 같은 결과가 나온다는 점이다.

그렇다면 빈칸이라도 출력이 되어야 옳지 않을까?

이렇게 묻는 사람이 있다면 이렇게 답해 주겠다.

방금 말했다. 빈칸의 수가 아무리 많아도 같은 결과가 나온다.

이 말은 명령어 다음에 빈칸이 하나이든 백이든, 아니면 빈칸이 없든 같은 결과가 나온다는 뜻이다. 즉 ECHO 다음에, 다른 옵션이 없다면, 빈칸이 있든 없든 같은 의미를 가지게 된다는 말이다.

ECHO 명령의 기능은 (1) 메시지를 보여주거나 (2) 명령어 반향을 켜거나 끄고(기본값은 켠다), (3) ECHO 명령만 입력했을 때 반향 설정값을 보여준다. 이렇게 세 가지였다. 이 가운데 (3)번에 해당한다.

결국 ECHO 뒤에 빈칸을 넣어서 빈 줄을 입력하게 하는 방법도 실패다.

고전적인 방법

1980년대나 1990년대 초에 나온 컴퓨터 서적에서는 대개 아스키문자 255번을 이용하라고 하고 있다. 물론 나는 이 방법을 배우지는 않았다. 내가 컴퓨터 학원에 다닐 때는 좀 더 간단한 방법을 배웠기 때문이다.

고작 1백 년도 되지 않은 컴퓨터 역사에서 "고전"이 있을까마는 따지지 말자. "좀 더 오래된"이라는 의미를 부여하기 위해 쓴 말일 뿐이다.

우선 이 작업을 위해서는 exam04-1.bat 파일을 복사하여 exam04-2.bat 파일을 만든다. (복사 방법과 이름 바꾸는 방법은 모두 알고 있으리라 생각하고 생략하겠다. 모르면 댓글 남기기 바란다.)

명령 프롬프트에서 다음과 같이 입력한다.

edit exam04-2.bat

음, 뭔가 달라져 보이지 않는가?

<도스 에디터 화면>

<도스 에디터 화면>

빈 줄을 출력하려고 만든 줄로 이동하여 ECHO 뒤에 커서를 위치시키자. (위의 화면은 이미 이동한 화면이다.)

그 자리에서 <Alt>를 누른 상태에서 오른쪽 숫자판에서 2, 5, 5를 차례대로 누른 다음 키보드에서 손을 떼며 화면을 잘 살피기 바란다. (방금 했던 작업은 키보드를 이용하여 아스키문자 255번을 입력하는 작업이다.)

<도스 에디터 화면 : 255번 문자 입력 화면>

<도스 에디터 화면 : 255번 문자 입력 화면>

화면에는 아무것도 나타나지 않고, 그저 한 칸 오른쪽으로 옮겼다고 여겨질 뿐이다. 그러나 자신이 했던 일을 믿어라. 분명히 저기에는 아스키문자 255번이 입력되어 있다.

아래쪽으로 옮겨서 방금 그 작업을 다시 하자. 이때 주의할 점은 반드시 ECHO 뒤에 한 칸 공백을 둔 뒤에 아스키문자 255번을 입력해야 한다.

작업을 마쳤으면 저장하자. <Alt>를 한 번 누르면 왼쪽 상단의 [F/파일] 부분이 검게 바뀐다. 그 화면에서 F, S를 누른다. 다시 말해, <Alt>를 눌렀다 손을 떼고, F를 눌렀다가 손을 떼고, S를 눌렀다가 손을 떼면 저장이 된다.

저장도 마쳤으니 종료하자. 종료는 <Alt>, F, X 이다.

도스 상태에서 실행시켜 보자. 기대해도 좋다.

20090326ex4-2.png
<예제4-2 출력화면>

드디어 성공했다.

그러나 아스키문자 255번을 누르기 위해서 해야 할 일이 너무 많고 번거롭다. 물론 아크로에디트를 비롯한 많은 문서 편집기가 "아스키코드"(아스키문자) 값을 지원해 주지만, 모르는 사람도 많다. 특히 윈도의 기본 문서 편집기인 메모장에서는 아스키문자 255번을 입력할 수 없다.

좀 더 새로운 방법

아스키문자 255번을 입력하여 빈줄을 나타내는 방법은 너무 번거로웠다. 그렇게 해서 알려진 방법이 바로 문서화되지 않은 방법이다. (MS 제품과 관련한 팁에는 많은 "문서화되지 않은" 방법이 존재한다. 심지어 일부 팁은 마이크로소프트 홈페이지에서도 활용하고 있다. 그러나 어디까지나 "문서화되지 않은" 방법은 해당 버전에서만 유효하며, 다음 버전에서는 언제라도 사라질 수 있음을 기억하자.)

exam04-1.bat 파일을 복사하여 exam04-3.bat 파일을 만든다.

  1. @echo off
    rem 예제 4-3 : 화면에 간단한 말을 출력한다.
    rem 파일명 : exam04-3.bat
    rem 지은이 : koc2000/SALM
    rem 저작권 : GPL v3
    echo 예제 4-3.
    echo.
    echo 이 프로그램은 화면 출력 예제 4-3입니다.
    echo.
    echo 끝.

빨간 색으로 표시된 점( . )이 추가된 부분이다. 그 부분을 잘 보기 바란다.

실행하면 다음과 같다.

20090326ex4-3.png
<예제4-3 출력화면>

  1. echo.

저 코드가 "빈 줄"을 출력하는 코드인 셈이다. 특이하게 ECHO 명령에 붙여서 써야 한다. 띄어쓰기를 하면? 직접 해보기를 바란다.

아주 간단하면서 쉬운 방법이다. 모를 때는 갑갑하게 만든 빈 줄 출력이지만, 알게 되면 어이 없을 정도로 쉽다. (물론 세상사가 대부분 그렇다. 오죽하면 "콜롬버스의 달걀"이라는 말이 생겼을까? 당시 "그냥 서쪽으로 가기만 하면 되는 쉬운 일이다."라고 주장하면서 콜럼버스의 업적을 폄하하는 사람들이 생겨나자, 콜럼버스가 자신이 신대륙을 발견한 일을 비유하기 위해 연회 자리에서 달걀 한쪽을 깨뜨려 식탁에 세운 일은 있지만, 콜럼버스가 최초로 한 일은 아니다. 그것은 당시 민간에서도 행해지던 놀이 가운데 하나였다고 한다.)

배치파일의 가독성

가독성이 왜 좋아야 할까? 그건 배치파일을 사람이 직접 눈으로 보고 해석할 수 있기 때문이다. 그래서 일부에서는 다른 사람이 내가 짠 배치파일을 고치면 엉뚱하게 동작하게 만들기도 하지만, 그것은 그다지 좋은 습관이 아니다. 그럴 경우 자신도 알아보기 힘들기 때문이다. (이럴 경우 실제 소스는 자신이 가지고, 남에게 보여도 되는 복잡한 소스를 컴퓨터에 설치해 두기도 하지만, 번거로운 방법이다.)

비단 배치파일뿐만 아니라 모든 프로그램 소스파일은 사람이 읽기 좋아야 고치기도 편하다. 물론 기계, 곧 컴퓨터에 맞추어 최적화를 시도해도 되지만, 그럴 경우 해당 부분을 모듈(흔히 함수 또는 서브함수)로 만들어 떼어낸 뒤 따로 설명을 붙이는 쪽이 낫다. 그래야 그 모듈은 신경쓰지 않고 전체 맥락에 집중할 수 있기 때문이다.

주석을 달고 가독성을 좋게 해야 하는 또 다른 이유로 배치파일은 한 번 만들어 두면 자주 고치지 않는다는 데 있다. 지금 만든 배치파일을 몇 달 뒤에 또는 몇 년 뒤에 알아볼 수 있을까? 장담할 수 없다. 나중에 고치려고 보면, 처음부터 다시 짜는 만큼 시간이 걸리기 마련이다. 주석을 달아두는 등 가독성을 좋게 해 두었다면 쉽고 빠르게 해결할 일인데 말이다.

가독성 높이기의 기본 : 주석 달기

잘 만들어졌지만, 배치파일 초보에게는 조금 파악하기 힘든 코드를 소개하겠다. 윈도98의 부팅 이미지에 있는 AutoExec.bat 파일의 일부이다.

  1. @ECHO OFF
    mshbios
    set EXPAND=YES
    SET DIRCMD=/O:N
    set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
    set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C
    cls
    call setramd.bat %LglDrv%
    set temp=c:\
    set tmp=c:\
    path=%RAMD%:\;a:\;%CDROM%:\
    copy command.com %RAMD%:\ > NUL
    set comspec=%RAMD%:\command.com
    copy extract.exe %RAMD%:\ > NUL
    copy readme.txt %RAMD%:\ > NUL

AutoExec.bat 파일의 첫 부분인 위 내용을 보고, 그것이 뜻하는 바를 곧바로 알 수 있다면 어느 정도 경지에 다다른 사람임에 틀림없다. 물론 저 뒷부분은 저렇게 붙어 있지 않다.

그런데 배치파일 초보가 위의 내용을 보고 각 행마다, 또는 여러 행이 어떤 의미를 가지는지 알 수 있을까? 그렇지 않으리라 생각한다. 

그러면 알기 힘든 이유는 무엇일까?

  • 우선 주석이 없다.

도스의 명령어를 알더라도 주석이 없어서 알기 힘들다. 전체적으로 쉬운 명령어를 쓰고 있지만, SET 환경 변수를 이용하는 부분에서, 그것이 무슨 역할을 하는지 알기 힘들다. 이는 CALL 명령어에서도 마찬가지이다.

  • 각 행간이 너무 촘촘히 붙어 있다.

사람의 눈과 두뇌는 서로 떨어져 있으면 관련이 적다고 여기게 된다. 반대로 서로 붙어 있으면 관련이 좀 더 많다고 여기게 된다. 이런 원리를 생각한다면, 위의 코드는 서로 연관이 적은 코드까지 한데 뭉쳐 있는 셈이다. 앞서 말했듯이 저 부분까지만 저렇게 다닥다닥 붙어 있어서 읽기 힘들게 되어 있고, 뒷부분은 연관이 있는 줄끼리는 붙고, 서로 연관이 적은 곳은 빈 줄을 두어 나누고 있다. 빈 줄을 두면 화면에는 출력되지 않아도 사람이 보기에는 좋다.

조금 수정해 보았다.

  1. @ECHO OFF
    rem ====================================
    rem  윈도98 설치 디스크
    rem ====================================
    rem 한글 바이오스 읽어오기
    mshbios
    rem 기본 환경 변수 설정
    set EXPAND=YES
    SET DIRCMD=/O:N
    rem LglDrv 환경 변수 설정
    rem 2행으로 설정한 이유는 한 줄에 적기보다 두 줄로 적어야 보기 좋고,
    rem 명령행의 길이 제한 때문
    set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
    set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C
    rem 화면을 지우고, 램드라이브 설정 작업
    cls
    call setramd.bat %LglDrv%
    rem 임시 디렉터리 변수 설정
    set temp=c:\
    set tmp=c:\
    rem 실행경로 변수 설정
    path=%RAMD%:\;a:\;%CDROM%:\
    rem COMSPEC 환경 변수 설정 : 파일 복사 후 설정.
    copy command.com %RAMD%:\ > NUL
    set comspec=%RAMD%:\command.com
    rem 작업을 위한 기본 파일 복사
    copy extract.exe %RAMD%:\ > NUL
    copy readme.txt %RAMD%:\ > NUL

아까보다야 낫지만 그래도 여전하다. 오히려 내용이 늘어서 보기 싫은 점도 있다.

왜? 앞서 말했듯이 코드가 너무 따닥따닥 붙어 있다. 그게 반드시 나쁘다는 말은 아니지만, 너무 붙어 있으면 배치파일 내용을 알기 힘들게 된다.

좀 더 보기 좋게 : 빈 줄 넣기

위의 경우에, 주석이 눈에 잘 들어오지 않는 이유가 코딩 속에 주석이 파묻혀 눈에 잘 띄지 않기 때문이다. 그럴 경우 몇 줄씩 관련 있는 부분을 묶고, 관련이 없는 부분과는 구별할 수 있게 줄 띄기를 하면 된다.

  1. @ECHO OFF
    rem ====================================
    rem  윈도98 설치 디스크
    rem ====================================
  2.  
  3. rem 한글 바이오스 읽어오기
    mshbios
  4.  
  5. rem 기본 환경 변수 설정
    set EXPAND=YES
    SET DIRCMD=/O:N
  6.  
  7. rem LglDrv 환경 변수 설정 : 램드라이브를 위한 환경 변수이다.
    rem 2행으로 설정한 이유
  8. rem    한 줄에 적기보다 두 줄로 적어야 보기 좋고,
    rem    명령행의 길이 제한 때문 (128 글자)
    set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
    set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C
  9.  
  10. rem 화면을 지운다.
    cls
  11.  
  12. rem 램드라이브 설정 작업
  13. rem setramd.bat : 실제로 램드라이브를 설정해 주는 배치파일
    call setramd.bat %LglDrv%
  14.  
  15. rem 임시 디렉터리 환경 변수 설정
    set temp=c:\
    set tmp=c:\
    rem 실행경로 환경 변수 설정
    path=%RAMD%:\;a:\;%CDROM%:\
  16.  
  17. rem COMSPEC 환경 변수 설정 : Command.com 파일 복사 후 설정.
    copy command.com %RAMD%:\ > NUL
    set comspec=%RAMD%:\command.com
    rem 작업을 위한 기본 파일 복사
    copy extract.exe %RAMD%:\ > NUL
    copy readme.txt %RAMD%:\ > NUL

위와 같이 바꾸는 방법은 번거롭다고 여겨질 수도 있다. 하지만 배치파일의 특성상 그 자신이 어떤 일을 할 수도 있지만, 대부분 다른 프로그램에게 일을 시키는 "통로" 역할을 하게 된다. 다시 말해 배치파일 자체에서 일을 하기보다 다른 프로그램에게 일을 시키는 프로그램이다. 그것을 위해 환경을 설정하는 것이야말로 배치파일의 역할이다. 이게 스크립트 언어의 특징이다. (물론 자신이 직접 어떤 역할을 수행하는 스크립트 언어도 존재하지만, 거기에는 대부분 전제 조건이 붙어 있다.)

코드에도 격이 있다. : 들여쓰기

배치파일을 짜다 보면 중요한 코드와 덜 중요한 코드가 있을 수 있다. 또한 한데 묶어서 관리할 부분과 따로 떼어서 관리할 부분이 생기게 된다. 위의 코드도 마찬가지이다.

  1. rem 임시 디렉터리 환경 변수 설정

특히 위의 "rem 임시 디렉터리 환경 변수 설정"에서는 더욱 그러하다. 따로 떼어 생각할 부분이 아니기 때문이다. 이럴 경우 해결할 방법은 바로 들여쓰기이다.

앞서 ECHO 명령에서 했던 설명을 또 되살리자.

명령어 다음에, 다른 옵션이 없다면, 빈칸이 있든 없든 같은 의미를 가지게 된다.

여기에 추가하자.

명령어 앞에 다른 명령이 없다면, 빈칸이 있든 없든 같은 의미를 가지게 된다.

이 말은 곧 들여쓰기를 해도 실행 결과는 같다는 뜻이다.

이 말에 맞추어 위의 배치 파일을 고쳐 보자.

 

  1. @ECHO OFF
    rem ====================================
    rem  윈도98 설치 디스크
    rem ====================================

    rem 환경 설정

    rem 한글 환경 설정
        rem 한글 바이오스 읽어오기
        mshbios

    rem 기본 환경 변수 설정 1
        set EXPAND=YES
        SET DIRCMD=/O:N

    rem 램드라이브를 위한 환경 설정

        rem LglDrv 환경 변수 설정 : 램드라이브를 위한 환경 변수이다.
            rem 2행으로 설정한 이유
                rem    한 줄에 적기보다 두 줄로 적어야 보기 좋고,
                rem    명령행의 길이 제한 때문 (128 글자)
            set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
            set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C

        rem 화면을 지운다.
            cls

        rem 램드라이브 설정 작업
        rem 이 부분은 복잡하므로 다른 배치파일을 불러서 처리.
            rem setramd.bat : 실제로 램드라이브를 설정해 주는 배치파일
            rem 넘겨주는 명령행 인자 %LglDrv%
                call setramd.bat %LglDrv%

    rem 기본 환경 변수 설정 2

        rem 임시 디렉터리 환경 변수 설정
            set temp=c:\
            set tmp=c:\
        rem 실행경로 환경 변수 설정
            path=%RAMD%:\;a:\;%CDROM%:\

        rem COMSPEC 환경 변수 설정
        rem COMSPEC 환경 변수는 명령어 해석기를 지정하는 역할을 한다.
        rem Command.com 파일 복사 후 설정.
            copy command.com %RAMD%:\ > NUL
            set comspec=%RAMD%:\command.com

    rem 작업을 위한 파일 복사

        rem 압축 파일 작업용 extract.exe : CAB 파일의 압축을 푸는 프로그램
            copy extract.exe %RAMD%:\ > NUL

        rem 안내 문서 readme.txt : 안내문이 수록되어 있다.
        copy readme.txt %RAMD%:\ > NUL

실제 실행에서는 처음에 만든 배치파일과 같게 동작한다.

요약

  • ECHO를 이용해 화면에 빈 줄을 출력하는 방법과 배치파일을 사람이 읽기 좋게 만드는 법을 설명하였다.
  • 기타

    • 명령프롬프트에서 명령어 앞의 공백과 마지막 명령행 인자 및 옵션 뒤의 공백은 무시된다.
    • 문서화되지 않은 방법은 불가피할 때만 써라.

다음 예고

배치파일을 잠시 멈추는 방법과 파라미터를 배치파일에 전달하는 방법에 대해 알아보자.

이 글은 스프링노트에서 작성되었습니다.

글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

들어가며

배치파일에 주석을 다는 법과 화면에 글을 출력하는 법에 대해서 알아보기로 하자. 이때 이때 그래픽 화면 출력은 셸에 포함된 명령어로는 불가능하며, 외부에서 프로그램의 도움을 받아야 한다. 그러므로 배치파일에서 화면 출력이라고 하면, 일반적으로 텍스트 출력만을 가리킨다.

주석 및 기본 출력

배치파일에서는 화면에 출력할 때 ECHO 명령을 사용한다.
앞서 2009/03/02 - [배치파일&스크립트] - 스크립트란 무엇인가? 배치파일이란 무엇인가? 문서에서 만든 배치파일이 바탕화면에 있는 배치파일 폴더에 있다고 가정하고 설명하겠다.

우선 메모장을 연다. 시작 단추 >> 프로그램 >> 보조프로그램 >> 메모장

메모장에 다음과 같이 입력한다.

rem 예제 1 : 화면에 간단한 말을 출력한다.
rem 파일명 : exam01.bat
echo 예제 1.
echo 이 프로그램은 화면 출력 예제 1입니다.
echo 끝.

저장이 끝났으면 메뉴에서 [파일] >> [저장]을 선택하면 아직 이름을 주지 않았으므로 [다른 이름으로 저장]이라는 창이 뜨게 된다. 이때 파일명은 exam01.bat 이라고 하자.
명령 프롬프트를 열어서 결과를 확인하자. 어라! 실행이 되지 않는다. 이것은 명령 프롬프트가 위치한 폴더에 배치파일이 없기 때문이다. 그때는 CD 를 입력한 뒤에 한 칸 띄고 나서 <Tab>을 눌러준다. 그러면 화면에 무언가 변화가 오게 된다. 계속 [Tab]을 눌러 알맞은 폴더( "바탕 화면" )가 나오면 <Enter>를 치기 바란다.

그 뒤에 다시 CD를 누르고 한 칸 띄고 <Tab>을 눌러서 반복한다. 앞서 "배치파일" 폴더에 파일을 넣는다고 했으므로 거기까지 들어가 보자. (여기까지 한/영 변환 키를 한 번도 누르지 않고 왔다. 잘 기억해 두었다가 써먹기 바란다.)

CLS 명령을 입력하고 <Enter>를 눌러 화면을 지우자.

이제 방금 만든 배치파일을 실행해 보자. 이때도 e 또는 ex를 입력하고 <Tab>을 누르면 명령어가 바뀌게 된다. 지난번에 만든 exp.cmd 파일과 이번에 만든 exam01.bat 파일이 존재하고 있으니 그 둘만 자꾸 보여주게 된다. exam01.bat 파일을 실행하면 된다.

exam01.bat 실행 화면

exam01.bat 실행 화면

보기가 좋지 않지만 어쨌든 화면 출력을 성공하였다.
하나씩 살펴보자.
첫 줄과 둘째 줄은 REM으로 시작하므로 주석이다. 셋째 줄부터 다섯째 줄까지는 echo를 이용한 화면 출력이다. 그런데 이상한 점은 주석은 자기 자신을 보여주고는 아무런 일도 하지 않았으나, echo는 자신을 보여주고, 해당 출력을 1회씩 하였다. echo는 결국 2번씩 보여준 셈이 된다.

이때 명령 프롬프트에서는 Rem 명령은 Remark (설명하다)에 온 말이며, 아무런 역할도 하지 않는다. 그렇기 때문에 배치파일 안에 주석을 넣는 명령어로 쓰이게 된다.

명령어 반향 감추기 1

앞서 만든 exam01.bat를 고쳐보자. 메모장에서 exam01.bat를 열어서 다음과 같이 고쳐보자.

echo off
rem 예제 2 : 화면에 간단한 말을 출력한다.
rem 파일명 : exam02.bat
echo 예제 2.
echo 이 프로그램은 화면 출력 예제 2입니다.
echo 끝.

[파일] >> [다른 이름으로 저장...]을 눌러 exam02.bat 라는 이름을 주어 저장하자. 명령 프롬프트에서 exam02.bat를 실행하면 아까보다는 깨끗한 결과를 볼 수 있다.

exam02.bat 실행 화면

exam02.bat 실행 화면

이때 첫 줄이 중요하다. 아까와는 달리 echo off 라고 명령을 내렸다. echo는 화면에 글자를 출력하는 명령이 아니었나? 얼른 다음과 같이 입력하자.

echo /? <Enter>

친절한 설명이 나와 있다. echo의 기능은 (1) 메시지를 보여주거나 (2) 명령어 반향을 켜거나 끄고(기본값은 켠다), (3) echo만 일력했을 때 반향 설정값을 보여준다.

ECHO 명령어 도움말

ECHO 명령어 도움말

예제 1에서 화면이 깨끗하지 못한 이유는 바로 "명령어 반향"이라는 기능이 켜져 있었기 때문이다. 이 기능은 사용자에게 명령어가 입력되었음을 알려주는 기능이다. 이는 사용자에게 작업 내용을 알린다는 측면에서는 매우 유용하다. 그러나 반대로 배치파일에서처럼 출력 결과를 원할 때에는 지저분하게 되어 좋지 않다. 이럴 경우 명령어 반향을 끄면 좋다. 그럴 때 쓰는 명령어가 ECHO OFF 이다. 반대로 ECHO ON 이라고 하면 다시 명령어 반향이 켜지게 된다.

그러나 여전히 echo off 명령 자체는 감추지 못해서 찝찝함이 남는다.

명령어 반향 감추기 2

앞서 만든 exam02.bat를 고쳐보자. 메모장에서 exam02.bat를 열어서 다음과 같이 고쳐보자.

@echo off
rem 예제 3 : 화면에 간단한 말을 출력한다.
rem 파일명 : exam03.bat
echo 예제 3.
echo 이 프로그램은 화면 출력 예제 3입니다.
echo 끝.

[파일] >> [다른 이름으로 저장...]을 눌러 exam03.bat 라는 이름을 주어 저장하자. 명령 프롬프트에서 exam03.bat를 실행하면 아까보다 조금 더 깨끗한 결과를 볼 수 있다.

exam03.bat 실행 화면

exam03.bat 실행 화면

이번에도 첫 줄이 중요하다. 아까와는 달리 @echo off 라고 명령을 내렸다. 흠 @ (commat) 표시[각주:1]에 무언가 있다는 말인데... 이것은 해당 명령어 1개만 반향을 끄라는 말이다. 다시 말해 "echo off 자체의 명령어 반향을 꺼라"라는 의미가 된다.

요약

오늘은 ECHO를 이용해 화면에 글자를 출력하는 법과 REM으로 주석을 붙이는 법에 대해 알아 보았다. REM에 대한 설명은 없지만, "나는 모르겠다."라는 사람은 글을 남기기 바란다.

  • 오늘 배운 명령어 : ECHO , REM
  • 오늘 배운 용어 : 명령어 반향
  • 기타 :
    • CD 명령어와 [Tab]을 조합하여 폴더를 이동하는 방법
    • @을 이용하여 명령어 끄는 방법

다음 예고

화면 출력에 대해 좀 더 자세히 알아보기로 하자.

  1. @은 원래 at (앳)이라는 미국의 상업부호였다. 오늘날 콤마트(commat)라는 이름이 부여되어 있고, 한국에서는 골뱅이 또는 동그람 에이 등으로 불린다. [본문으로]
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

말뜻

배치파일에서 이용할 수 있는 명령어란 배치파일에서 불러들여 실행할 수 있는 내부 명령어 또는 외부 명령어를 일컫는다. 내부 명령어는 명령어 셸에 내장된 명령어를 가리키고, 외부 명령어는 실행 파일과 같은 파일로서 존재한다.

실행 파일은 주로 .COM, .EXE, .BAT와 같은 것이 있으며, 윈도NT 계열에서는 .CMD 파일도 쓰인다. 그밖에 윈도 스크립트인 .VBS, .SCF 파일도 실행이 가능하다.

배치파일에서 이용할 수 있는 명령어는 명령 프롬프트에서 "set" 명령을 입력하고 <Enter>를 누르면 보이는 목록에서 PATHEXT를 찾으면 확인할 수 있다.

윈도용 파일 실행

도스를 수박 겉핥기 식으로 배운 사람은 배치파일에서 윈도용 프로그램을 실행할 수 없다고 생각할 수도 있다. 그럼 간단한 실험을 하자.

명령 프롬프트를 열고 다음과 같이 입력한다.

copy con note.cmd <Enter>
notepad.exe <Enter>
pause <Enter>
<Ctrl-Z>

이제 note.cmd를 입력하면 노트패드, 곧 "메모장"이 실행되어야 한다. 둘째 줄에 입력한 pause는 "잠시 멈춤"을 뜻하는 내부 명령어이다. 메모장이 실행되지 않는다면 컴퓨터에서 notepad.exe가 없거나 경로 설정이 되어 있지 않다는 뜻이다.

스크립트 파일 실행

우리가 가장 쉽게 접할 수 있는 스크립트 파일은 explorer.scf 파일이다. 이 파일은 윈도 폴더에 있다.
위의 PATHEXT에는 없지만 SCF 파일도 실행이 가능하다.

명령 프롬프트를 열고 다음과 같이 입력한다.

copy con exp.cmd <Enter>
explorer.scf <Enter>
pause <Enter>
<Ctrl-Z>

자신의 윈도XP가 정상이라면 윈도 탐색기가 실행되어야 한다.

또한 .SCF 스크립트 외에 .MSC 파일도 실행할 수 있다.

copy con df.cmd <Enter>
dfrg.msc <Enter>
pause <Enter>
<Ctrl-Z>

역시 자신의 윈도XP가 정상이라면 디스크 조각 모음이라는 애플릿이 실행되어야 한다. 이때 .MSC 파일은 스크립트 파일은 아니다. 노트패드에서 읽어 들이면, 그 파일은 XML 파일임을 알 수 있다. 윈도가 특별하게 작동시키는 파일이다.

다음 예고

주석 다는 법과 화면에 메시지 출력하는 법을 알아보기로 하자.

'스크립트 > 배치파일' 카테고리의 다른 글

배치파일에 매개변수 전달하기 2  (5) 2009.04.04
배치파일에 매개변수 전달하기  (0) 2009.04.01
배치파일 멈추기  (1) 2009.03.29
그밖에 출력  (2) 2009.03.26
주석 및 화면 출력  (3) 2009.03.23
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

말뜻

스크립트는 다른 컴퓨터 프로그램을 제어하기 위한 프로그래밍 언어이다.[각주:1]
배치파일은 도스나 그와 호환되는 환경에서 여러 프로그램을 한데 묶어 작업을 원활히 하기 위한 스크립트 파일이다. MS-DOS, OS/2, 윈도에서 쓰이는 배치 파일(batch file)은 명령 인터프리터에 의해 실행되게끔 고안된 명령어들이 나열되어 있는 텍스트 파일이다. 배치 파일이 실행될 때, COMMAND.COM 또는 cmd.exe와 같은 셸 프로그램이 파일을 읽어 명령어를 줄 단위로 실행한다. 배치 파일은 보통 실행 파일을 자동으로, 연속적으로 실행할 때 유용하며 시스템 관리자가 따분한 일들을 자동화하기 위해 자주 사용한다.[각주:2]
마이크로소프트에서 사용하는 이름은 일괄 파일이다.

이곳에서는 스크립트는 그다지 다루지 않는다. 대부분 배치 파일에 대해서만 다루게 된다.

간단한 예제

누구나 만들어 보았을 예제 하나.

  1. 명령 프롬프트를 연다. 시작 단추 >> 프로그램 >> 보조프로그램 >> 명령 프롬프트
  2. 우선은 배치파일과 관련이 없는 명령어 조합을 보자. 굳이 배치파일을 만들지 않아도 된다. 아래와 같이 입력한다. 당연한 말이겠지만 <Enter>는 그것을 입력하라는 말이 아니라 "엔터" 키를 누르라는 말이다.
    cls <Enter>
    echo Hello World! <Enter>
    pause <Enter>
  3. 어떻게 되었는지를 확인한다.
  4. 이번에는 배치파일을 만들어 보자. 우선 배치파일을 만들기 위해 메모장 등을 사용할 수도 있지만, 여기에서는 명령 프롬프트에서 바로 만들기로 하자.
    copy con clear.bat
  5. 위 명령어는 콘솔(모니터와 기보드)의 입출력을 clear.bat 파일로 저장하는 환경을 만든다는 뜻이다. 간단히 말해 키보드로 입력 받아 clear.bat로 저장한다고 보면 된다.
  6. 줄이 바뀌면서 커서 위치가 맨 왼쪽으로 간다. 여기에서 아래 문장을 차례대로 입력한다.
    cls <Enter>
    echo Hello World! <Enter>
    pause <Enter>
    <Ctrl-Z>
  7. 그림으로 확인하면 이렇게 된다.
  8. clear.bat 라고 입력하고 엔터!
    실행 화면을 그림으로 확인하면 다음과 같다.
  9. 뭔가 깔끔하지 않지만, 배치 파일 하나가 만들어졌다.

이 배치 파일은 단순히 화면에 메시지 하나, 그것도 프로그래밍 언어 책에 거의 대부분 나오는 Hello World를 이용했다.

다음 예고

배치 파일에서 이용할 수 있는 명령어를 알아보기로 하자.

  1. <a href="http://ko.wikipedia.org/wiki/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8_%EC%96%B8%EC%96%B4" target="_blank" >한국어 위키백과 : 스크립트 언어</a> [본문으로]
  2. <a href="http://ko.wikipedia.org/wiki/%EB%B0%B0%EC%B9%98_%ED%8C%8C%EC%9D%BC" target="_blank" >한국어 위키백과 : 배치 파일</a> [본문으로]

'스크립트' 카테고리의 다른 글

환경 변수 2  (9) 2009.05.03
환경 변수 1  (0) 2009.05.02
이런저런 이야기  (6) 2009.03.30
글쓴이는 koc/SALM입니다.
본문에 저작권에 대한 사항이 나타나지 않거나, 저작권이 BY-SA로 표기되어 있다면,
이 글은 GFDL로 공개한 글입니다.

카테고리

분류 전체보기 (1005)
스크립트 (22)
벌레와 팁 (126)
소프트웨어 (240)
하드웨어 (6)
이야기 (24)
말의 나무 (506)
미쳐보자 (22)
일기 (48)
아이폰 (10)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

글 보관함