Windows 배치 파일 : .bat 및 .cmd?


747

내가 알기로, .bat오래된 16 비트 명명 규칙이며 .cmd32 비트 Windows, 즉 NT로 시작합니다. 그러나 나는 어디에서나 .bat 파일을 계속 보았으며 접미사를 사용하여 정확히 똑같이 작동하는 것처럼 보입니다. 내 코드는, 정말 내 배치 파일의 이름을 어떤 방법으로 상관이야 NT보다 오래된 아무것도 실행 할 필요가 없습니다, 또는 일부가 않을 것이라고 가정 잡았다 잘못된 접미사를 사용하여 저를 기다리고은?


19
혼란을 더하기 위해 이제 .ps1 파일도 있습니다.
Martin Brown

42
내가 실수하지 않으면 .ps1 파일은 Windows Power Shell 파일이어야합니다. 그래도 잘못 될 수 있습니다.
CMS_95 2016 년

답변:


454

에서 이 뉴스 그룹 게시물 에 의해 마크 즈비 코우 스키 자신 :

CMD.EXE에 관한 한 .CMD와 .BAT의 차이점은 다음과 같습니다. 확장을 사용하면 .CMD 파일의 PATH / APPEND / PROMPT / SET / ASSOC가 오류에 관계없이 ERRORLEVEL로 설정됩니다. .BAT는 오류에서만 ERRORLEVEL을 설정합니다.

다시 말해, ERRORLEVEL이 0이 아닌 것으로 설정되어 있고 그 명령 중 하나를 실행하면 ERRORLEVEL의 결과는 다음과 같습니다.

  • .bat 파일에서 0이 아닌 값으로 홀로 남겨짐
  • .cmd 파일에서 0으로 재설정하십시오.

4
.bat 스크립트를 사용하면 성공시 ERRORLEVEL 0 값을 반환하지 않습니까? 그것이 사실이라면 나는 그것을 눈치 채지 못했습니다.
djangofan

31
ERRORLEVEL이 0이 아닌 값으로 설정된 경우 해당 명령 중 하나를 실행하면 .bat 파일에서는 0이 아닌 그대로 남지만 .cmd 파일에서는 0으로 재설정됩니다. 그러나 Windows는 그것이 무엇인지에 따라 실제로 Pig Latin에서 "너무 신경 쓰면 ERRORLEVEL을 재설정하십시오!"
MadScientist

5
나는 특정 명령 만 다른 설정 / 설정되지 않은 작업을 수행한다고 말합니다. 다른 사람들은 정상처럼 작동합니다
PsychoData

1
지금은 이해. 요점을 업데이트했습니다. 분명히 set var=..문을 호출 할 때 오류 수준을 설정하지 않습니다 . 예상되는 동작이라고 가정했기 때문에 이상합니다. 두 가지 모두에 대한 논쟁이 이루어질 수있다. .bat 파일을 사용하겠습니다. :-)
wasatchwizard

1
주 – APPEND 명령은 문서화되지 않은 DPATH 명령으로 대체되었지만 DPATH /?여전히 명령을 APPEND로 나열합니다. 또한 위키 기사는 DPATH를 나열하지 않는 한 대부분 수정되었습니다.
dbenham

417

이 스레드의 다양한 답변과 인용 문헌에서 검증 된 정보를 모았습니다.

  1. command.com MS-DOS에 도입 된 16 비트 명령 프로세서이며 Win9x 시리즈 운영 체제에서도 사용되었습니다.
  2. cmd.exeWindows NT의 32 비트 명령 프로세서입니다 (64 비트 Windows OS에도 64 비트 버전이 있음). cmd.exeWindows 9x에 포함되지 않았습니다. OS / 2 버전 1.0에서 cmd시작했으며 OS / 2 버전의 16 비트 가 시작되었습니다 (그러나 그럼에도 불구하고 같은 명령을 가진 완전한 보호 모드 프로그램이었습니다 start). Windows NT cmd는 OS / 2에서 상속 되었지만 Windows NT의 Win32 버전은 32 비트에서 시작되었습니다. 1992 년에 OS / 2가 32 비트 였지만 cmd16 비트 OS / 2 1.x 프로그램 으로 남았습니다.
  3. ComSpecENV 변수를 정의하는 프로그램에 의해 시작됩니다 .bat.cmd스크립트. (WinNT로 시작하면 기본값은 cmd.exe입니다.)
  4. cmd.exe이전 버전과 호환됩니다 command.com.
  5. Windows 9x에서 실수로 실행되는 것을 방지하기 위해 설계된 스크립트의 cmd.exe이름 .cmd을 지정할 수 있습니다 . 이 파일 이름 확장자는 OS / 2 버전 1.0 및 1987로 거슬러 올라갑니다.

다음은 cmd.exe지원하지 않는 기능 목록입니다 command.com.

  • 긴 파일 이름 (8.3 형식 초과)
  • 명령 내역
  • 탭 완성
  • 문자를 탈출 : ^(사용을 위해 : \ & | > < ^)
  • 디렉토리 스택 : PUSHD/POPD
  • 정수 산술 : SET /A i+=1
  • 검색 / 바꾸기 / 하위 문자열 : SET %varname:expression%
  • 명령 대체 : FOR /F(이전에 존재했고 향상되었습니다)
  • 기능 : CALL :label

실행 순서 :

스크립트의 .bat 및 .cmd 버전 (test.bat, test.cmd)이 동일한 폴더에 있고 확장자 (test)없이 스크립트를 실행하면 기본적으로 스크립트의 .bat 버전이 실행됩니다. 64 비트 Windows 7에서. 실행 순서는 PATHEXT 환경 변수에 의해 제어됩니다. 자세한 내용은 명령 프롬프트가 파일실행하는 순서 를 참조하십시오.

참고 문헌 :

위키 백과 : 명령 셸 비교


4
몇 가지 사소한 점 : 1) .bat가 반드시 command.com을 호출 할 필요는 없습니다. command.com이 호출 될 때 분명히 복잡한 미스터리입니다. 2) command.com은 MS-DOS와 함께 도입되었습니다. 3) cmd.exe는 대부분의 command.com 스크립트를 실행할 수 있지만 cmd에서 작동하지 않는 몇 가지 사소한 command.com 항목이 있습니다.
Michael Burr

6
cmd.exe는 Windows 95가 아니라 NT 4.0에서 도입되었습니다.
FlySwat

1
Chris : Wikipedia 기사의 최신 버전 인 esp를 참조하십시오. groups.google.com/group/…
Mark

2
이 문제에 대한 정보를 추가 dir filename하려면 : dir filename.*command.com 과 동일합니다 . 와일드 카드는 cmd.exe에 필요합니다. command.com에서 rem Create an empty file > empty.txt작동합니다. cmd.exe에는 없습니다.
Aacini

2
이 중 약간만 OP의 질문과 관련이있는 것 같습니다. command.com과 cmd.exe의 차이점이 아니라 .bat와 .cmd의 차이점에 관한 것입니다. 내가 읽을 때 문제는 .bat 파일과 .cmd 파일의 차이점에 관한 것입니다. 다른 모든 것은 동일합니다.
스튜어트

85

이 답변은 너무 길어서 대화 형 사용에 중점을 둡니다. 스크립팅의 중요한 차이점은 다음과 같습니다.

  • .cmd 비 NT 시스템에서 실수로 실행되는 것을 방지합니다.
  • .cmd 내장 명령이 성공하면 Errorlevel을 0으로 변경할 수 있습니다.

흥미롭지 않습니까?

이전에는 .cmd파일에서 명령 확장이라고 하는 여러 가지 추가 기능이 활성화되었습니다 . 그러나 이제 Windows 2000 이상에서 파일 .bat.cmd파일 모두에 대해 기본적으로 사용됩니다 .

결론 : 2012 년 이후에는 .cmd독점적으로 사용하는 것이 좋습니다 .


7
IMO, 그것이 핵심입니다. 이전 16 비트 OS에서 실행되지 않았는지 또는 확실하지 않은 경우 최신 스크립트의 확장명으로 .cmd를 사용합니다.
Oliver

12
나는 쓸데없고, 대학과 같은 답변의 수많은 벽에 대한 간결하고 실용적이며 명확한 답변에 정말 감사합니다.
Liquid Core

7
저는 대학교 수이며 @Liquid Core에 동의합니다! 간결하고 실용적이고 명확한 답변은 우리가 배우는 방법입니다 (아직 무언가를 모르는 경우). 그런 다음, 일단 이해하면 추상적이고 이해할 수없는 방식으로 설명해야한다는 충동을 느낍니다. 기묘한. 좋은 관찰!
유레카

24

아니요-조금이라도 중요하지 않습니다. NT에서 .bat 및 .cmd 확장자는 모두 cmd.exe 프로세서가 파일을 정확히 동일한 방식으로 처리하게합니다.

MS TechNet ( http://technet.microsoft.com/en-us/library/cc723564.aspx )의 WinNT 클래스 시스템에서 command.com과 cmd.exe에 대한 추가 흥미로운 정보 :

이 동작은 매우 중요한 Windows NT의 미묘한 기능을 나타냅니다. Windows NT와 함께 제공되는 16 비트 MS-DOS 셸 (COMMAND.COM)은 Windows NT 용으로 특별히 설계되었습니다. 이 쉘에서 실행할 명령을 입력하면 실제로 실행되지는 않습니다. 대신 명령 텍스트를 패키지하여 실행을 위해 32 비트 CMD.EXE 명령 셸로 보냅니다. 모든 명령은 실제로 CMD.EXE (Windows NT 명령 셸)에 의해 실행되므로 16 비트 셸은 전체 Windows NT 셸의 모든 기능과 기능을 상속합니다.


5
중요 할 수도 있습니다. 링크 텍스트에서 언급했듯이 차이점은 미묘합니다.
Gringo Suave

command.com이 명령 행에서 dos 명령을 지정하여 강제로 dos 명령을 실행하도록 할 수 있습니다. command /c vercommand.com 시작과 ver 입력을 참조하십시오 .
phd443322

이름이 중요합니다 : D 과거의 사람들로부터 .bat를 많이 보았습니다! .cmd를 사용하십시오! 또한 NT가 오늘날에도 여전히 사용된다고 믿을 수 없습니다.
hfrmobile

@ hfrmobile : 'NT'를 언급했을 때 기본적으로 우리가 NT를 기반으로하는 모든 Windows 버전을 의미했습니다 (9x 아님). 따라서 XP 이후 데스크탑 또는 서버용 NT, Win2k 및 모든 Windows 버전이 기본적으로 제공됩니다. 그리고 파일 이름은 파일을 작성한 사람의 사고 방식과 코딩 스타일에 대한 통찰력을 줄 수 있지만 통역사에는 차이가 없습니다.
Michael Burr

16

RE : 분명히 command.com이 호출 될 때 약간 복잡한 미스터리입니다.

몇 달 전에 프로젝트를 진행하는 동안 CMD.EXE에서 실행하려는 일부 프로그램이 실제로 COMMAND.COM에서 실행되는 이유를 찾아야했습니다. 문제의 "프로그램"은 여전히 ​​매일 실행되는 매우 오래된 .BAT 파일입니다.

배치 파일이 COMMAND.COM에서 실행 된 이유는 .PIF 파일 (고대)에서 시작 되었기 때문입니다. PIF를 통해서만 사용할 수있는 특수 메모리 구성 설정은 관련이 없으므로 일반적인 바탕 화면 바로 가기로 바꿨습니다.

바로 가기에서 시작된 동일한 배치 파일이 CMD.EXE에서 실행됩니다. 당신이 그것에 대해 생각할 때, 이것은 의미가 있습니다. 우리가 그것을 알아내는 데 너무 오래 걸렸던 이유는 부분적으로 스타트 업 그룹의 항목이 1998 년부터 생산 되었기 때문에 PIF라는 사실을 잊었 기 때문입니다.


1
이것은 어떤 OS입니까? XP 전에 뭔가?
phk

14

여전히 Windows 7에서 BAT 파일은 다음과 같은 차이점이 있습니다. 동일한 디렉토리에 TEST.BAT 및 TEST.CMD 파일을 작성하고 해당 디렉토리에서 TEST를 실행하면 BAT 파일이 실행됩니다.

C:\>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

C:\Temp>echo echo bat > test.bat

C:\Temp>echo echo cmd > test.cmd

C:\Temp>test

C:\Temp>echo bat
bat

C:\Temp>

test.bat가 알파벳순으로 test.cmd이기 때문에 그렇게합니다. Windows는 욕심 많은 완성을합니다.
David

26
@David : 사실이 아닙니다. 이는 PATHEXT변수에서 .BAT 확장자가 .CMD 확장자 앞에 있기 때문에 발생합니다 (이 답변에 표시된대로). PATHEXT에서이 순서를 수정하면 test.cmd가 대신 실행됩니다.
Aacini

흠, 나는 그들이 다른 순서대로 있기를 바랐다. MS는 기존의 일부 소프트웨어가 동일한 기본 이름을 가진 .CMD 파일과 .BAT 파일을 선적했음을 발견했거나 추측했을 것입니다. exe이지만 다른 셸 명령 , 응용 프로그램이 읽은 구성 스크립트 또는 응용 프로그램 이진과 같은 다른 많은 것들이있을 수 있습니다 . (적어도, 그것은 MS가 겉보기에 차선책으로 보이는 일반적인 방법에 대한 나의 이해입니다.)
SamB

또한 현재 디렉토리가 PATH확장에 관계없이 환경 변수의 다른 디렉토리보다 우선한다는 점에 주목할 가치가 있습니다.
Turkeyphant 2016 년

13

원래 게시물은 .bat 또는 .cmd 접미사 를 사용한 결과에 관한 것이기 때문에 반드시 파일 내부 의 명령은 아닙니다 ...

.bat와 .cmd의 또 다른 차이점은 동일한 파일 이름과 두 개의 확장자를 가진 두 파일이 존재하면 다음과 같습니다.

  • 명령 행 에 filename 또는 filename .bat를 입력 하면 .bat 파일이 실행됩니다.

  • .cmd 파일을 실행하려면 filename .cmd 를 입력해야합니다


2
뭐라고? 디렉토리에 cmd 파일을 넣으면 파일 확장자를 지정하여 호출 할 필요가 없습니다. 예 : echo notepad.exe % *> np.cmd 그런 다음 "np mytextfilename.txt"를 입력하면 메모장이 나타납니다. "np.cmd"를 입력 할 필요가 없습니다.
Jon Davis

2
@ stimpy77 : np.cmd가 해당 이름을 가진 유일한 파일이지만 "두 파일이 동일한 파일 이름과 확장자를 가진 파일"인 경우 .cmd 파일을 실행하는 유일한 방법은 확장자를 포함하는 것입니다. ..
Aacini

1
이것은 .cmd와 .bat의 기술적 차이와 관련이없는 모든 쉘의 모호성을 해결해야합니다. filename.bat가 알파벳순으로 filename.cmd보다 앞에 있기 때문일 수 있습니다.
Jon Davis

6
실제로 PATHEXT환경 변수 에 따라 다릅니다 . 확장자가 명시되지 않은 순서는 확장자가 지정되지 않은 경우 우선 순위입니다. 또한 확장자가 env 변수에 나타나는 파일의 확장자를 지정할 필요는 없습니다.
Ricardo Zorio

8

배치에서 작동하는 모든 것은 cmd에서 작동해야합니다. cmd는 환경 제어를위한 일부 확장을 제공합니다. 또한 cmd는 새로운 cmd 인터프리터에서 실행되므로 NTVDM 에뮬레이트 된 16 비트 환경에서 bat가 실행될 때 더 빠르며 (짧은 파일에서는 눈에 띄지 않음) 안정적이어야합니다


속도에 차이가 없어야합니다. .batNT의 DOS에서는 실행되지 않습니다. VDM은 프로그램에 필요한 경우에만 시작되며 .bat는 믿지만 64 비트 Windows에서는 지원되지 않습니다.
Gringo Suave

3

.cmd 및 .bat 파일 실행은 .cmd errorlevel 변수에서 명령 확장자의 영향을받는 명령에서 변경 될 수 있기 때문에 다릅니다. 그게 진짜야


대략 ^. ^ 각각에 사용되는 명령 언어에 차이가 있습니다 (.bat 파일은 호환 버전을 얻습니다). 이 중 일부는 여기에서이 스크립트로 설명 할 수 있습니다. @echo off&setlocal ENABLEEXTENSIONS call :func&&echo/I'm a cmd||echo/I'm a bat goto :EOF :func md;2>nul set var=1
zask

4
.cmd 파일에서 모든 명령은 오류 수준을 설정합니다. .bat 파일에서 일부 명령은 허용 된 답변에 설명 된대로 오류 수준을 변경하지 않은 상태로 둡니다
jeb

1
BAT는 DOS의 명령 해석기 인 COMMAND.COM과 상호 작용하기 위해 만들어졌습니다. Microsoft는 대부분의 DOS 명령을 CMD라는 새로운 인터프리터에 채택했습니다. EXE. CMD는 CMD.EXE와 인터페이스하도록 만들어졌으며 COMMAND.COM과의 호환성을 손상시킵니다. 오류 수준 변수를 처리하는 방법으로 주로 알려져 있습니다. BAT를 사용할 때이 변수는 실제 오류가 발생한 후에 만 ​​변경되며 각 명령이 성공적으로 실행될 때 상태 변경이 발생하지 않습니다. errorlevel 변수는 오류가 발생하지 않더라도 여전히 상태를 변경하므로 CMD의 경우에는 해당되지 않습니다.
zask

3

ComSpec 환경 변수의 값을 %SystemRoot%system32\cmd.exe(CMD)로 변경하면 파일 확장자가 .BAT또는 인지 여부는 중요하지 않습니다 .CMD. 확실하지 않지만 WinXP 이상의 기본값 일 수도 있습니다.


1

주제를 약간 벗어 났지만 Windows 스크립팅 호스트 를 고려 했습니까? 더 좋을 수도 있습니다.


13
이를 위해 WSH / cscript.exe가 더 이상 사용되지 않는 PowerShell입니다.
Jon Davis

3
@ stimpy77 Powershell이 ​​꽤 끔찍한 것처럼 보이지만 사실입니다.
Marcin

2
나는 WSH가 훨씬 더 나쁘다는 것을 안다. 모든 것이 우리가 "끔찍한"측정 대상에 달려 있다고 생각합니다. PowerShell에는 시작 시간이 끔찍합니다. 그것에 관한 모든 것은 절대적으로 훌륭한 IMO입니다.
존 데이비스

형식을 변명하지만 PSH 시작 시간을 단축하려면 다음을 실행하십시오. Set-Alias ​​ngen @ (dir (join-path $ {env : \ windir} "Microsoft.NET \ Framework") ngen.exe -recurse | sort -descending lastwritetime) [0] .fullName [새 줄] [appdomain] :: currentdomain.getassemblies () | % {ngen $ _. location}
mjbnz

1
완전히 벗어난 주제.
HappyDog

1

확장은 차이가 없습니다.

COMMAND.COM파일 처리와 CMD.EXE. 처리 에는 약간의 차이가 있습니다 .


-10

차이점:

.cmd 파일은 실행되기 전에 메모리에로드됩니다. .bat 파일은 한 줄을 실행하고 다음 줄을 읽고 그 줄을 실행합니다 ...

스크립트 파일을 실행할 때이 문제를 발견 한 다음 실행이 완료되기 전에 편집 할 수 있습니다. bat 파일은 이것으로 엉망이되지만 cmd 파일은 그렇지 않습니다.


ComSpec env 변수는 이미 확립 된대로 어떤 프로그램이 시작되는지 정의합니다. cmd.exe는 파일을 메모리에 사전로드하는 동안 command.com이 한 번에 한 줄씩 파일을 읽습니다. 이것에 대한 참조를 인용 할 수 있습니까?
Chris Noe

24
Vista와 XP에서는 잘못되었습니다. 두 파일 형식 모두 한 줄씩 읽습니다. 당신이 .CMD 또는 .BAT 파일 편집을 일시 정지하는 경우, 새로운 코드가 실행됩니다


1
명령 파일의 중간에서 실행을 일시 중지하고 처음에 문자를 추가하면 파서가 다시 시작될 때 한 문자 씩 떨어져서 스크립트의 나머지 부분을 버릴 수 있기 때문에 한 줄씩 토론 할 수 있습니다.

2
.bat에 대해 토론해서는 안되며 .cmd는 그런 식으로 다르지 않습니다. 둘 다 항상 한 줄씩 읽습니다. 믿지 않으면 테스트 할 수 있습니다. 배치 파일을 echo 1&pause만든 다음 실행하십시오. 당신은 볼 1Press any key to continue.... 일시 정지 된 상태 echo 2&pause에서 외부 편집기 로 새 줄 을 추가하십시오 . 키를 누릅니다. 당신은 볼 2Press any key to continue.... echo 3&pause처음에 추가해 볼 수도 있습니다 . 그 후 다시 키를 누르면을 볼 수 2있습니다.
venimus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.