배치 파일
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
배치 파일은 텍스트 기반의 스크립트 파일로, MS-DOS 운영체제에서 시작되어 Windows NT 계열 운영체제까지 널리 사용되었다. 파일 확장자로는 .bat와 .cmd가 있으며, 각 확장자에 따라 실행되는 명령 인터프리터가 다르다. 배치 파일은 텍스트 파일 형태로 각 줄에 명령어를 입력하며, 주석, 환경 변수, 조건 분기, 반복문 등의 문법을 지원한다. 다양한 명령어를 통해 시스템 설정 변경, 프로그램 실행 자동화 등 작업을 수행할 수 있으며, 다른 스크립팅 언어와 함께 사용되기도 한다. 하지만 악성 코드에 악용될 수 있으며, 변수 처리 및 문자열 처리 시 주의가 필요하다.
더 읽어볼만한 페이지
- 도스 - 디스크 파티션
디스크 파티션은 물리적인 하드 디스크를 독립적인 영역으로 나누어 여러 파일 시스템을 구성하고 접근 제어 및 장애 격리를 통해 시스템 안정성과 관리 효율성을 높이는 과정 또는 결과이다. - 윈도우 관리 - 블루스크린
블루스크린은 윈도우 운영체제에서 발생하는 치명적인 오류로, 컴퓨터 작동을 멈추고 파란색 화면에 오류 메시지를 표시하며, 하드웨어 또는 소프트웨어 문제로 인해 발생하고, 시스템 복원, 안전 모드 부팅 등의 방법으로 대처한다. - 윈도우 관리 - 파워셸
파워셸은 마이크로소프트에서 개발한 작업 자동화 솔루션으로, 명령줄 셸과 스크립트 언어의 기능을 결합하여 윈도우 시스템 관리를 위해 설계되었으며, .NET 프레임워크 기반의 객체 지향적 특징을 갖고 다양한 플랫폼에서 자동화 스크립트 작성 및 실행, 시스템 구성 관리 등에 활용된다. - 스크립트 언어 - Tcl
Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다. - 스크립트 언어 - PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
배치 파일 - [IT 관련 정보]에 관한 문서 | |
---|---|
일반 정보 | |
![]() | |
파일 확장자 | .bat, .cmd, .btm |
마임 유형 | application/bat application/x-bat application/x-msdos-program text/plain |
장르 | 스크립팅 |
포함 대상 | 스크립트 |
상세 정보 | |
종류 | 스크립트 언어 |
용도 | MS-DOS 스크립트 |
2. 역사
배치 파일의 역사는 마이크로소프트의 MS-DOS 운영 체제와 함께 시작되었다. 초기 DOS 시절에는 `.bat` 확장자가 사용되었으며, 간단한 명령어들을 순차적으로 실행하는 기능을 제공했다.[32] MS-DOS 환경에서 배치 파일은 파일 이름을 입력하고 필요한 매개변수를 입력한 다음 키를 누르면 명령 줄 인터페이스에서 실행되었다. DOS가 로드되면 AUTOEXEC.BAT 파일이 존재할 경우 자동으로 실행되어, DOS 환경을 설정하기 위한 명령을 이 파일에 넣을 수 있었다. 예를 들어, 시스템 날짜와 시간을 설정하고, DOS 환경을 초기화하며, 상주 프로그램이나 장치 드라이버를 로드하고, 네트워크 연결 및 할당을 초기화하는 데 사용되었다.
배치 파일은 일반적으로 다음과 같은 확장자를 사용한다.
`.bat` 파일은 COMMAND.COM에 의해 한 줄씩 실행되는 명령을 포함하며, 마치 수동으로 입력한 명령 목록과 같았다. 또한, `GOTO` 명령을 포함한 기본 프로그래밍 기능을 위한 몇 가지 추가 배치 파일 특정 명령도 있었다.
1985년, 마이크로소프트 윈도우는 텍스트 기반 운영 체제 위에 그래픽 사용자 인터페이스(GUI)를 얹는 방식으로 도입되었으며, MS-DOS에서 실행되도록 설계되었다. 윈도우를 시작하려면 `WIN` 명령을 사용했는데, AUTOEXEC.BAT 파일 끝에 추가하여 윈도우를 자동으로 로드할 수 있었다. 초기 버전에서는 MS-DOS 프롬프트에서 .bat 형식의 파일을 윈도우에서 실행할 수 있었다. Windows 3.1x 및 이전 버전과 Windows 9x는 배치 파일을 실행하기 위해 COMMAND.COM을 호출했다.
윈도우 NT 계열 운영 체제가 등장하면서 `.cmd` 확장자가 도입되었고, `cmd.exe`라는 새로운 명령 인터프리터가 사용되었다.[32] `cmd.exe`는 `COMMAND.COM`에 비해 향상된 기능과 호환성을 제공한다. 윈도우 NT는 .CMD 또는 .BAT 확장자를 가진 스크립트를 실행할 수 있는 향상된 32비트 명령 인터프리터 (cmd.exe)를 도입했다. Cmd.exe는 추가 명령을 추가하고 기존 명령을 약간 다른 방식으로 구현하여 동일한 배치 파일(다른 확장자 포함)이 cmd.exe 및 COMMAND.COM에서 다르게 작동할 수 있도록 했다. 대부분의 경우 지원되지 않는 몇 가지 명령을 사용하지 않으면 작동 방식이 동일했다. Cmd.exe의 COMMAND.COM 확장은 호환성을 위해 비활성화할 수 있다.
윈도우 98 및 이전 버전과 달리 윈도우 NT 운영 체제 제품군은 MS-DOS에 의존하지 않는다. Windows 9x 계열 (Windows 95, 98, Me)에서는 여전히 `COMMAND.COM`이 사용되었지만, 윈도우 NT 계열과의 호환성을 위해 `cmd.exe`도 함께 제공되었다. 마이크로소프트는 이전 버전의 윈도우 사용자가 특정 cmd.exe 스타일의 배치 파일을 사용할 수 있도록 WIN95CMD라는 cmd.exe 버전을 윈도우 9x 및 ME에 출시했다.
, cmd.exe는 배치 파일의 일반적인 명령 인터프리터이다. 이전 COMMAND.COM은 16비트 프로그램을 실행할 수 있는 32비트 버전의 윈도우에서도 실행할 수 있다.
현재는 윈도우 10, 윈도우 11을 포함한 모든 최신 윈도우 버전에서 `.bat`와 `.cmd` 파일 모두 지원되며, `cmd.exe`가 기본 명령 인터프리터로 사용되고 있다.[1] .cmd 파일을 해석하는 cmd.exe 명령 처리기는 Windows 10까지의 모든 32비트 버전의 Windows와 Windows 11까지의 64비트 버전의 Windows에서 지원된다. .BAT 파일을 해석하는 COMMAND.EXE는 최소한 Windows 10까지의 모든 16비트 및 32비트 버전에서 지원되었다.
2006년에는 .NET Framework 기반의 PowerShell이 출시되어 더욱 강력한 스크립팅 기능을 제공하고 있다. PowerShell은 기존 Windows 명령에 대한 별칭을 제공하여 어느 정도 호환성을 유지한다.
3. 파일 확장자
MS-DOS 환경에서 배치 파일은 파일 이름을 입력하고 필요한 매개변수를 입력한 다음 키를 누르면 명령 줄 인터페이스에서 실행할 수 있다. DOS가 로드되면 `AUTOEXEC.BAT` 파일이 존재할 경우 자동으로 실행되어, DOS 환경을 설정하는 데 필요한 명령을 이 파일에 넣을 수 있다. 예를 들어 시스템 날짜와 시간을 설정하고, DOS 환경을 초기화하고, 상주 프로그램 또는 장치 드라이버를 로드하거나, 네트워크 연결 및 할당을 초기화하는 데 사용된다.
`.bat` 확장자는 마치 수동으로 입력한 명령 목록처럼 COMMAND.COM에 의해 한 줄씩 실행되는 명령을 포함하는 파일을 식별한다. 여기에는 `GOTO` 명령을 포함한 기본 프로그래밍 기능을 위한 몇 가지 추가적인 배치 파일 특정 명령이 있다.
윈도우 98 및 이전 버전과 달리 윈도우 NT 운영 체제 제품군은 MS-DOS에 의존하지 않는다. 윈도우 NT는 `.CMD` 또는 `.BAT` 확장자를 가진 스크립트를 실행할 수 있는 향상된 32비트 명령 인터프리터 (cmd.exe)를 도입했다. `Cmd.exe`는 추가 명령을 추가하고 기존 명령을 약간 다른 방식으로 구현하여 동일한 배치 파일이 `cmd.exe` 및 `COMMAND.COM`에서 다르게 작동할 수 있도록 했다. 대부분의 경우 지원되지 않는 몇 가지 명령을 사용하지 않으면 작동 방식이 동일하다. `Cmd.exe`의 `COMMAND.COM` 확장은 호환성을 위해 비활성화할 수 있다.
마이크로소프트는 이전 버전의 윈도우 사용자가 특정 `cmd.exe` 스타일의 배치 파일을 사용할 수 있도록 `WIN95CMD`라는 `cmd.exe` 버전을 윈도우 9x 및 ME에 출시했다.
`cmd.exe`는 배치 파일의 일반적인 명령 인터프리터이다. 이전 `COMMAND.COM`은 16비트 프로그램을 실행할 수 있는 32비트 버전의 윈도우에서도 실행할 수 있다.
`.cmd` 확장자 파일은 `COMMAND.COM`에서 인식되지 않으므로, `cmd.exe` 스크립트가 실수로 잘못된 윈도우 환경에서 실행되지 않도록 방지하는 효과가 있다. 또한, `append`, `dpath`, `ftype`, `set`, `path`, `assoc` 및 `prompt` 명령은 `.bat` 파일에서 실행될 때 오류가 발생했을 때만 `errorlevel` 변수의 값을 변경하는 반면, `.cmd` 파일 내에서는 오류 없이 반환될 때에도 `errorlevel`에 영향을 미친다.
3. 1. .bat와 .cmd의 차이점
윈도우 NT 계열 운영 체제에서 배치 파일의 확장자는 `.cmd`를 사용하며, 이는 `cmd.exe`로 해석되어 실행된다. `.cmd` 파일은 `COMMAND.COM`에서는 인식되지 않아, 잘못된 윈도우 환경에서 실행되는 것을 방지한다.
`.cmd`와 `.bat` 파일은 `cmd.exe`에서 실행될 때 몇 가지 차이점이 있다. 대표적인 예로, `set` 명령어의 동작 방식이 다르다. `.cmd` 파일에서 `set` 명령어는 성공 여부에 관계없이 항상 `ERRORLEVEL`을 변경한다. 성공하면 `ERRORLEVEL`이 `0`으로 재설정되지만, `.bat` 파일에서는 `set` 명령어가 실패한 경우에만 `ERRORLEVEL`을 변경한다.[31]
`set` 명령어 동작 예시
@echo off
setlocal
echo ErrorLevel is %ERRORLEVEL%
color 00
echo ErrorLevel is %ERRORLEVEL%
set my_variable=100
echo ErrorLevel is %ERRORLEVEL%
endlocal
ErrorLevel is 0
ErrorLevel is 1
ErrorLevel is 0
ErrorLevel is 0
ErrorLevel is 1
ErrorLevel is 1
위 예시에서 볼 수 있듯이, `.cmd`에서는 `set` 명령이 성공했을 때 `ERRORLEVEL`이 0으로 재설정되지만, `.bat`에서는 이전의 `ERRORLEVEL` 값(1)을 유지한다. 이러한 `.cmd`의 동작 방식은 더 안전하다고 평가받으며, `.bat`의 동작은 직관적이지 않고 최소 놀람의 원칙에 어긋난다는 의견도 있다.[31]
하지만, `echo`나 `rem`과 같은 일부 명령어는 배치 파일의 확장자에 관계없이 항상 `ERRORLEVEL`을 변경하지 않는 등 예외도 존재한다.
4. 문법
배치 파일은 텍스트 파일로, 각 줄에 실행할 명령어를 입력한다. 주석은 `rem` 명령어를 사용하여 작성한다. `@echo off` 명령어를 사용하면 명령어 자체의 출력을 숨길 수 있다.[1] `echo` 명령어는 표준 출력에 메시지를 표시한다. 메시지 문자열을 큰따옴표나 작은따옴표 등으로 묶을 필요는 없다. `echo on` 및 `echo off`로 명령 에코의 ON/OFF를 전환할 수 있다. 명령 에코는 기본적으로 ON으로 설정되어 있으며, 각 명령줄을 실행하기 전에 표준 출력에 그 내용을 표시한다[8]。`@` 기호를 명령줄의 맨 앞에 놓으면, 그 행은 표시되지 않으므로, 많은 배치 파일에는 `@echo off` 라는 행이 처음에 있다.
변수는 `%변수이름%` 형태로 사용하며, `set` 명령어를 사용하여 값을 할당하거나 변경할 수 있다. 조건문은 `if` 명령어를 사용하여 작성하며, `errorlevel` 변수를 통해 이전 명령어의 실행 결과를 확인할 수 있다.
`if`문의 기본 구문은 다음과 같다.
if [not] ERRORLEVEL
if [not]
if [not] exist
확장 구문은 다음과 같다.
if [/i]
if CMDEXTVERSION
if defined
반복문은 `for` 명령어를 사용하여 작성하며, 파일 목록이나 숫자 범위에 대해 반복 작업을 수행할 수 있다. `for` 명령어는 foreach문에 해당한다. `goto` 명령어를 사용하여 특정 레이블로 이동할 수 있다. `call` 명령어를 사용하여 다른 배치 파일을 호출하거나, 현재 배치 파일 내의 특정 레이블로 이동할 수 있다. `pause` 명령어를 사용하여 사용자 입력을 기다릴 수 있다.
`shift` 명령어는 배치 파일에 전달된 인수의 위치를 변경한다.[18] 배치 파일 실행 시 10개 이상의 인수를 지정할 수도 있지만, 배치 파일에서는 `%0` - `%9` 범위의 인수만 처리할 수 있다(`%0`은 배치 파일의 이름을 나타내므로, 실질적으로는 9개의 인수를 사용할 수 있다). `shift` 명령어를 사용하면 인수의 값이 이전 인수로 복사된다. 즉, `%1`의 값은 `%0`에 복사되고, `%2`의 값은 `%1`에 복사되는 식이다.
다음은 `Hello World!`를 표시하고, 사용자에게 키를 누르라는 메시지를 표시한 후 종료하는 배치 파일 예시이다.
@ECHO OFF
ECHO Hello World!
PAUSE
4. 1. 환경 변수
배치 파일에서는 환경 변수를 사용하여 시스템 정보나 사용자 설정에 접근할 수 있다. 환경 변수는 프로그램 실행에 필요한 정보를 담고 있는 일종의 저장 공간이다.몇 가지 유용한 환경 변수는 다음과 같다.
환경 변수 | 설명 |
---|---|
`%%CD%%` | 현재 작업 중인 디렉터리(폴더)를 나타낸다. |
`%%DATE%%` | 현재 날짜를 표시한다. 시스템 설정에 따라 형식이 달라질 수 있다. |
`%%TIME%%` | 현재 시간을 표시한다. 시간(hour)이 한 자리 수일 때는 앞에 0 대신 공백이 표시된다. |
`%%RANDOM%%` | 0에서 32767 사이의 임의의 숫자를 생성한다. (이는 의사 난수이다)[20][21] |
`%%ERRORLEVEL%%` | 바로 직전에 실행된 명령어의 종료 상태를 나타낸다. 보통 0은 정상 종료, 그 외의 값은 오류를 의미한다.[22][23] |
`%ERRORLEVEL%`은 주로 `if` 명령어와 함께 사용되어, 이전 명령어의 성공/실패 여부에 따라 다른 작업을 수행하는 데 활용된다.
`setlocal` 및 `endlocal` 명령어를 사용하면 환경 변수의 범위를 제한할 수 있다. `setlocal`은 특정 범위(예: 배치 파일 내의 특정 부분)에서만 유효한 지역 변수를 생성하고, `endlocal`은 이러한 지역 변수의 범위를 종료하고 이전 환경 변수 설정을 복원한다.[28][29]
4. 2. 확장 기능
`cmd.exe`는 명령 확장 기능을 통해 추가적인 기능을 제공한다. 명령 확장은 기본적으로 활성화되어 있으며, `/E:ON` 또는 `/E:OFF` 스위치를 사용하여 제어할 수 있다.[30] 확장 기능을 사용하면 `for` 명령어의 추가 옵션, 지연된 환경 변수 확장 등 고급 기능을 사용할 수 있다.예를 들어, 환경 변수를 `if` 명령 내에서 변경하는 경우를 생각해 보자.
```dos
set my_variable=100
echo [1] my_variable is %my_variable%
if %my_variable%==100 (
set /a my_variable+=1
echo [2] my_variable is %my_variable%
)
echo [3] my_variable is %my_variable%
```
실행 결과는 다음과 같다.
```text
[1] my_variable is 100
[2] my_variable is 100
[3] my_variable is 101
```
`my_variable`의 값은 `if` 명령 실행 후에는 변경되었지만, `if` 명령 실행 중에는 변경 전의 값이 출력된다. 이는 환경 변수의 전개가 기본적으로 각 명령줄의 구문 분석 시에 한 번만 실행되기 때문이다.[30]
`setlocal enabledelayedexpansion` 명령을 실행하고, `%` 대신 `!`를 사용하여 환경 변수를 묶으면 환경 변수를 실행 시에 지연 전개할 수 있다.
```dos
set my_variable=100
echo [1] my_variable is %my_variable%
if %my_variable%==100 (
set /a my_variable+=1
@rem 환경 변수의 지연 전개를 활성화한다.
setlocal enabledelayedexpansion
echo [2] my_variable is !my_variable!
endlocal
)
echo [3] my_variable is %my_variable%
```
실행 결과는 다음과 같다.
```text
[1] my_variable is 100
[2] my_variable is 101
[3] my_variable is 101
5. 명령어
MS-DOS 및 윈도우의 배치 파일에서 사용되는 주요 명령어는 다음과 같다.
명령어 | 설명 |
---|---|
`echo` | 텍스트를 화면에 출력한다.[8] |
`rem` | 주석을 추가한다.[9] |
`cls` | 화면을 지운다.[11] |
`color` | 텍스트와 배경색을 변경한다.[12] |
`cd` | 현재 디렉터리를 변경한다. |
`dir` | 파일 및 디렉터리 목록을 표시한다.[17] |
`if` | 조건문을 실행한다.[14] |
`for` | 반복문을 실행한다.[16] |
`goto` | 특정 레이블로 이동한다.[13] |
`call` | 다른 배치 파일 또는 레이블을 호출한다.[13] |
`pause` | 사용자 입력을 기다린다. |
`shift` | 배치 파일 매개변수를 이동한다.[18] |
`set` | 환경 변수를 설정하거나 표시한다.[19] |
`setlocal` / `endlocal` | 환경 변경의 범위를 제한한다. |
`pushd` / `popd` | 현재 디렉터리를 스택에 저장하거나 복원한다. UNC 경로를 사용할 때 유용하다. |
이 명령어들은 배치 파일을 통해 다양한 작업을 자동화하고 시스템을 관리하는 데 사용된다. 각 명령어는 특정 기능을 수행하며, 조합하여 복잡한 작업을 처리할 수 있다. 예를 들어, `if`와 `goto`를 함께 사용하여 조건부 점프를 구현하거나, `for`를 사용하여 파일 목록을 처리할 수 있다. `set`은 환경 변수를 조작하여 프로그램 실행 환경을 동적으로 변경하는 데 사용된다.
6. 한계 및 예외
배치 파일은 변수 처리, 문자열 처리, 유니코드 지원 등 여러 측면에서 한계와 예외 사항을 가지고 있어 사용에 주의가 필요하다.
- 변수 처리: 변수가 비어 있거나 공백을 포함하는 경우, 따옴표를 사용하거나 지연된 환경 변수 확장을 통해 오류를 방지할 수 있다.[1] 윈도우 2000 이후 버전에서는 빈 변수가 빈 문자열로 대체되지 않고 변수 이름 자체로 표시된다.
- 문자열 처리: 특수 문자는 이스케이프 문자(`^`)를 사용하고, 문자열 내 따옴표는 세 개의 따옴표(`"""`)를 사용하여 표현할 수 있다.[1]
- 유니코드 지원: 기본적으로 코드 페이지 437과 같은 OEM 문자 집합을 사용하므로, 유니코드 문자를 올바르게 처리하지 못할 수 있다. `cmd /U` 명령을 통해 유니코드 환경에서 실행할 수 있지만, 코드 페이지 변경(chcp 65001)은 일부 환경에서 문제를 일으킬 수 있어 권장되지 않는다.
6. 1. 변수 처리
배치 파일에서 변수를 처리할 때는 주의해야 할 점이 있다. 변수가 비어 있거나 공백을 포함하는 경우, 예상치 못한 구문 오류가 발생할 수 있다.예를 들어, `%foo%`가 비어 있다면 `IF %foo%==bar ECHO Equal` 문은 `IF ==bar ECHO Equal`로 해석되어 오류가 발생한다. `%foo%`에 `abc def`가 포함된 경우에도 `IF abc def==bar ECHO Equal`와 같이 해석되어 오류가 발생한다.
이러한 문제를 방지하기 위해 변수를 따옴표로 묶는 것이 일반적이다. `IF "%foo%"=="bar" ECHO Equal`와 같이 작성하면 `%foo%`가 비어 있더라도 `IF ""=="bar" ECHO Equal`로 해석되어 정상적으로 동작한다.
```dosbatch
IF "%foo%"=="bar" ECHO Equal
```
윈도우 2000 이상에서는 지연된 환경 변수 확장 기능을 사용할 수 있다. `!foo!`와 같이 변수 이름 앞뒤에 느낌표를 붙이면, 변수 값이 명령이 실행될 때 결정된다. 따라서 `IF !foo!==bar ECHO Equal` 문은 `%foo%`의 값에 관계없이 정상적으로 동작한다.[1]
```dosbatch
IF !foo!==bar ECHO Equal
```
윈도우 2000 이상에서는 빈 변수가 빈 문자열로 대체되지 않고 `%MyVar%`와 같이 변수 이름 자체로 표시된다는 점도 유의해야 한다. 이전 버전의 배치 파일에서는 빈 문자열로 대체되었다.
```doscon
C:\>set MyVar=
C:\>echo %MyVar%
%MyVar%
C:\>if "%MyVar%"=="" (echo MyVar is not defined) else (echo MyVar is %MyVar%)
MyVar is %MyVar%
```
Windows 2000 이전의 배치 인터프리터는 `MyVar is not defined` 결과를 표시했을 것이다.
환경 변수를 변경하고 즉시 반영하려면 `setlocal enabledelayedexpansion` 명령을 사용하여 지연된 환경 변수 확장을 활성화해야 한다. 그렇지 않으면 변경 전의 값이 사용될 수 있다.[30]
6. 2. 문자열 처리
배치 파일에서는 따옴표나 공백이 포함된 문자열을 처리하기가 까다로울 수 있다. 특수 문자를 처리하기 위해 이스케이프 문자(`^`)를 사용한다. 예를 들어, 파이프(`|`) 문자를 출력하려면 `^|`와 같이 사용한다.[1]```doscon
C:\>echo foo ^| bar
foo | bar
```
`echo`와 같은 일부 내장 명령의 경우, 공백은 구분자로 처리되지 않으므로 따옴표가 필요하지 않다. 따옴표가 포함되면 문자열의 일부가 된다.[1]
윈도우 2000 이상에서는 따옴표를 세 개(`"""`) 사용하여 문자열 내의 따옴표를 표현할 수 있다.[1]
```doscon
C:\>set foo="this string is enclosed in quotes"
C:\>set foo=%foo:"="""%
C:\>echo "test 1 %foo%"
"test 1 """this string is enclosed in quotes""""
```
환경 변수에 특수 문자를 삽입할 때는 캐럿 자체와 이스케이프된 문자 모두를 이스케이프해야 한다.[1]
```doscon
C:\>set foo=bar ^^^| baz
C:\>echo %foo%
bar | baz
```
Windows 2000 이상에서는 지연된 확장을 사용하여 환경 변수에 저장된 특수 문자를 표시할 수 있다. 변수 값은 명령 구문 분석 후에 확장되기 때문이다.[1]
```doscon
C:\>cmd /V:ON
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\>set foo=bar ^| baz
C:\>echo !foo!
bar | baz
6. 3. 유니코드 지원
배치 파일은 기본적으로 코드 페이지 437과 같은 OEM 문자 집합을 사용한다. 이러한 문자 집합은 유니코드와 호환되지 않는 비 ASCII 문자를 포함하므로 주의해야 한다. 따라서 유니코드 문자를 올바르게 처리하지 못할 수 있다.`cmd /U` 명령을 사용하면 유니코드 환경에서 배치 파일을 실행할 수 있다. 예를 들어 `cmd /U /C dir > files.txt` 명령은 디렉터리 목록이 포함된 파일을 UTF-16LE 인코딩으로 생성하며, 이 파일은 올바른 Windows 문자를 포함한다.
유니코드 파일 이름을 사용하려면 `chcp 65001` 명령을 실행하여 코드 페이지를 UTF-8로 변경해야 할 수도 있지만, 일부 환경에서 문제를 일으킬 수 있어 권장되지 않는다.
7. 기타 스크립팅 언어
윈도우에서는 배치 파일 외에도 더 강력한 스크립팅 언어들을 사용할 수 있다. 하지만 이러한 언어들을 사용하려면 스크립팅 언어 인터프리터를 별도로 설치해야 한다.
- 확장 배치 언어(EBL) ('''\.bat'''): 1982년 IBM에서 근무하던 프랭크 카노바가 개인 프로젝트로 개발했다. 이후 Seaware Corp에서 주로 도스용, 나중에는 윈도우용 인터프리터 및 컴파일러로 판매했다.
- KiXtart ('''\.kix'''): 1991년 마이크로소프트 직원이 개발했으며, .cmd 파일의 단순한 구조를 유지하면서 네트워크 로그온 스크립트에서 유용한 명령에 대한 요구를 충족시키기 위해 특별히 개발되었다.
- Windows Script Host ('''\.vbs''', '''\.js''', '''\.wsf'''): 1998년 마이크로소프트에서 출시되었으며, cscript.exe 및 wscript.exe로 구성되어 VBScript 또는 JScript로 작성된 스크립트를 실행한다. 창 모드(wscript.exe 호스트 사용) 또는 콘솔 기반 모드(cscript.exe 호스트 사용)로 실행할 수 있으며, 윈도우 98부터 윈도우의 일부가 되었다.
- PowerShell ('''\.ps1'''): 2006년 마이크로소프트에서 출시되었으며 윈도우 XP (SP2/SP3) 이상 버전에서 작동할 수 있다. PowerShell은 대화형으로(명령줄 인터페이스에서) 그리고 저장된 스크립트를 통해 작동할 수 있으며 유닉스 셸과 매우 유사하다.
- 유닉스 스타일 셸 스크립팅 언어는 Cygwin과 같은 유닉스 호환성 도구가 설치되어 있거나 윈도우 서브시스템 포 리눅스(WSL)를 사용하는 경우 사용할 수 있다.
- Perl, Python, Ruby, Rexx, Node.js, PHP를 포함한 크로스 플랫폼 스크립팅 도구도 윈도우에서 사용할 수 있다.
확장자를 제외한 파일 이름이 입력되면 스크립트 파일이 실행된다. 예를 들어, `DoThis.com`, `DoThis.exe`, `DoThis.bat`, `DoThis.cmd` 등이 존재하는 경우, `DoThis`의 해석을 제어하는 우선 순위 규칙이 있다. 기본적으로 `DoThis.com`이 가장 높은 우선 순위를 가지며, 이 순서는 사용자가 설정 가능한 PATHEXT 환경 변수를 통해 최신 운영 체제에서 변경할 수 있다.
8. 배치 파일 바이러스 및 악성코드
다른 프로그래밍 언어와 마찬가지로 배치 파일도 악의적으로 사용될 수 있다. 간단한 트로이 목마와 포크 폭탄을 쉽게 만들 수 있으며, 배치 파일은 호스트 파일을 수정하여 일종의 DNS 스푸핑을 수행할 수 있다. 배치 바이러스도 가능하며, Windows의 자동 실행 기능을 사용하여 USB 플래시 드라이브를 통해 자체적으로 전파될 수도 있다.
다음은 배치 파일의 명령으로, 현재 디렉터리(폴더)의 모든 데이터를 확인 없이 삭제한다.
```text
del /Q *.*
```
다음 세 명령은 사용 가능한 시스템 리소스를 지속적으로 고갈시켜 시스템 속도를 늦추거나 충돌시키는 간단한 포크 폭탄이다.
```text
:TOP
start "" %0
goto TOP
9. 예제
dosbatch
@ECHO OFF
ECHO Hello World!
PAUSE
```
이 스크립트를 실행하면 "Hello World!"를 출력하고, 사용자에게 아무 키나 누르라는 메시지를 표시한 후 종료한다.[1]
실행 시 다음과 같이 표시된다.
```text
Hello World!
Press any key to continue . . .
```
다음은 1부터 100까지 숫자를 출력하면서, 3의 배수는 "Fizz", 5의 배수는 "Buzz", 15의 배수는 "Fizz Buzz"를 출력하는 예제이다.
```dosbatch
@echo off
setlocal enabledelayedexpansion
cd /d %~dp0
if exist %cd%\FizzBuzz.txt del %cd%\FizzBuzz.txt
for /l %%i in (1,1,100) do (
set echo=
set /a f=%%i%%3,b=%%i%%5
if !f!==0 set echo=!echo!Fizz
if !b!==0 set echo=!echo!Buzz
if "!echo!"=="" set echo=%%i
echo !echo!>>%cd%\FizzBuzz.txt
)
```
이 스크립트는 결과를 화면에 출력하는 대신 FizzBuzz.txt 파일에 저장한다.[1]
10. 호환 인터프리터
마이크로소프트 외에도 다양한 회사에서 배치 파일 호환 인터프리터를 제공한다. 4DOS가 그 한 예이다. 4NT, Take Command 등도 .btm 확장자를 사용하는 대표적인 인터프리터이다.
참조
[1]
템플릿
Kłodzko County
[2]
웹사이트
".NET Core Runtime: System.Diagnostics.Process.Unix"
https://github.com/d[...]
2020-02-11
[3]
웹사이트
How Command Line Parameters Are Parsed
http://daviddeley.co[...]
2020-06-08
[4]
웹사이트
Child process documentation, section Windows Command Line, NodeJS PR #29576
https://github.com/A[...]
2020-02-11
[5]
웹사이트
.cmdファイルとは - IT用語辞典
https://e-words.jp/w[...]
2022-08-11
[6]
웹사이트
Windows commands | Microsoft Learn
https://learn.micros[...]
[7]
웹사이트
Command-line syntax key | Microsoft Learn
https://learn.micros[...]
[8]
웹사이트
echo | Microsoft Learn
https://learn.micros[...]
[9]
웹사이트
rem | Microsoft Learn
https://learn.micros[...]
[10]
웹사이트
Rem - Comment - Windows CMD - SS64.com
https://ss64.com/nt/[...]
[11]
웹사이트
cls | Microsoft Learn
https://learn.micros[...]
[12]
웹사이트
color | Microsoft Learn
https://learn.micros[...]
[13]
웹사이트
call | Microsoft Learn
https://learn.micros[...]
[14]
웹사이트
if | Microsoft Learn
https://learn.micros[...]
[15]
웹사이트
§Using environment variables with Cmd.exe - Command shell overview | Microsoft Learn
https://learn.micros[...]
[16]
웹사이트
for | Microsoft Learn
https://learn.micros[...]
[17]
웹사이트
dir | Microsoft Learn
https://learn.micros[...]
[18]
웹사이트
shift | Microsoft Learn
https://learn.micros[...]
[19]
웹사이트
set | Microsoft Learn
https://learn.micros[...]
[20]
웹사이트
RAND_MAX | Microsoft Learn
https://learn.micros[...]
[21]
웹사이트
rand | Microsoft Learn
https://learn.micros[...]
[22]
웹사이트
Common program exit codes and error levels
https://www.febooti.[...]
[23]
웹사이트
System Error Codes (0-499) (WinError.h) - Win32 apps | Microsoft Learn
https://learn.micros[...]
[24]
웹사이트
EXIT_SUCCESS, EXIT_FAILURE - cppreference.com
https://en.cpprefere[...]
[25]
웹사이트
EXIT_SUCCESS, EXIT_FAILURE | Microsoft Learn
https://learn.micros[...]
[26]
웹사이트
NUMA Support - Win32 apps | Microsoft Learn
https://learn.micros[...]
[27]
웹사이트
GetNumaHighestNodeNumber function (systemtopologyapi.h) - Win32 apps | Microsoft Learn
https://learn.micros[...]
[28]
웹사이트
setlocal | Microsoft Learn
https://learn.micros[...]
[29]
웹사이트
endlocal | Microsoft Learn
https://learn.micros[...]
[30]
웹사이트
EnableDelayedExpansion - Windows CMD - SS64.com
https://ss64.com/nt/[...]
[31]
웹사이트
Errorlevel - Windows CMD - SS64.com
https://ss64.com/nt/[...]
[32]
웹인용
btm file extension :: all about the .btm file type
http://www.cryer.co.[...]
Cryer.co.uk
2012-11-30
[33]
웹사이트
http://www.snoopybox[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com