맨위로가기

배치 파일

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의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. 파일 확장자

배치 파일은 일반적으로 다음과 같은 확장자를 사용한다.


  • '''`.bat`''': 마이크로소프트가 배치 파일에 사용한 최초의 파일 확장자이다. 이 확장자는 MS-DOS와 모든 버전의 윈도우에서 `COMMAND.COM` 또는 `cmd.exe`를 통해 실행된다.[1]
  • '''`.cmd`''': 윈도우 NT 계열에서 배치 파일에 사용되며 `cmd.exe`에서 해석 및 실행된다. `COMMAND.COM`은 이 파일 확장자를 인식하지 않는다.[1]
  • '''`.btm`''': 4DOS, 4NT, Take Command와 같은 서드파티 셸에서 사용되는 확장자이다. 이러한 스크립트는 특히 긴 스크립트의 경우 더 빠르게 실행된다.


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


  • `.cmd` 확장자의 실행 결과:




ErrorLevel is 0

ErrorLevel is 1

ErrorLevel is 0


  • `.bat` 확장자의 실행 결과:




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 [else ]

if [not] == [else ]

if [not] exist [else ]



확장 구문은 다음과 같다.



if [/i] [else ]

if CMDEXTVERSION [else ]

if defined [else ]



반복문은 `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