들어가며
혼동하기 쉬운 여러 가지를 말하고자 합니다.
명령줄과 명령 프롬프트가 같은 뜻일까요? 아니면 다른 뜻일까요? 배치파일에서는 어떻게 윈도용 프로그램을 실행시킬 수 있을까요? 이와 같은 질문을 생각해 본 적이 있는 사람은 궁금하겠지요.
하나씩 차근차근 알아보기로 하죠.
명령줄? 명령 프롬프트?
명령줄과 명령 프롬프트는 자주 섞어쓰거나 헷갈리지만 분명히 다릅니다.
커맨드 라인(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 고급 옵션
그때 윈도의 창모드 명령어를 사용할 수 있다. 그 말은 이미 CMD.EXE 안에 창모드 프로그램을 실행할 수 있게 구성되어 있다는 뜻이다.
그리고 그것을 이용하여 윈도용 프로그램 가운데 창모드 프로그램까지 배치파일에서 불러와서 실행할 수 있게 된다.
쉽게 말해, 윈도에서 CMD.EXE를 통해 모든 프로그램을 실행할 수 있게 만들었다고 생각하면 된다.
도스에서 작성한 배치파일
도스에서 작성한 배치파일을 윈도에서 실행할 수 있을까?
먼저 그것이 윈도에서도 정상 작동하지 않을 수도 있음을 충분히 이해해야 합니다. 아니, 심지어 심각한 문제가 발생할 수도 있다. 각각의 명령어가 가지고 있는 뜻을 잘 이해해야 하며, 또한 각각의 배치파일 팁이 가진 진정한 의미를 숙지하고 있어야 합니다.
다음과 같은 배치파일 팁은 도스 6.2x 이하에서는 정상 작동하지만 윈도95부터는 정상 작동을 보장하지 않습니다.
- @ECHO OFF
- REM 파일명 : UPPER.BAT
- REM 매개 변수를 입력 받아 대문자로 바꾸어 _UPPER 환경 변수에 넣어서 돌려준다.
- REM 도스에서는 실행 경로 환경 변수인 PATH는 항상 대문자만을 저장한다는 점을
- REM 이용하여 입력 받은 매개 변수를 대문자로 바꾼다.
-
- REM 실행 경로를 _TEMP 환경 변수에 저장한다.
- SET _TEMP=%PATH%
-
- REM 매개 변수를 PATH 환경 변수에 저장한다.
- SET PATH=%1 %2 %3 %4 %5 %6 %7 %8 %9
-
- REM PATH 환경 변수에 저장된 문자열을 _UPPER 환경 변수에 복사, 저장한다.
- SET _UPPER=%PATH%
-
- REM PATH 환경 변수를 복원한 뒤 _TEMP 환경 변수를 지운다.
- SET PATH=%_TEMP%
- 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 도스는 명령줄 기반이고, 윈도 그래픽 환경 기반이라는 점과 같은 차이가 아니라 배치파일을 운용할 때 주의해야 할 차이점을 나열하였다.
- 도스에서는 파일이름이 파일명.확장자 형태로 8자, 3자였다. 윈도에서는 파일명과 확장자를 합해서 255자까지 만들 수 있다.
- 도스, 즉 MS도스에서는 배치 파일 확장자가 .BAT였으나, 윈도에서는 .BAT는 물론이고 .CMD도 있다.
- 도스에서는 디렉터리를 7단계까지 만들 수 있다. 윈도에서는 255자 한계 안에서 얼마든지 만들 수 있다. 예컨대 C:\A11\B22\C33\D44\E55\F66\G77\H88\FILE.EXT 파일은 도스에서는 읽지 못할 수도 있다. 그러나 윈도에서는 문제 없이 읽을 수 있다.
- 도스에서는 파일이름을 포함한 경로가 66자이거나 그보다 짧아야 한다.
- 도스에서는 파일이름에 공백을 포함할 수 없다. 윈도에서는 공백을 포함할 수 있다.
- 도스에서는 NUL, PRN 등의 이름을 가진 파일을 만들 수 없다. 윈도에서는 그러한 이름도 허용된다. 다만 약간 다른 방법이 써야 한다. QAOS : LPT1과 같은 다른 예약된 이름을 삭제할 수 없는 경우 참조.
- 도스에 환경 변수 이름은 항상 대문자로 나타나지만, 윈도에서 소문자 환경 변수도 있다. 예컨대 윈도에서 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를 만들어 이야기하겠다.
이 글은 스프링노트에서 작성되었습니다.