문제

내가 이해하면서 .bat 오래된 16 비트 명명 컨벤션입니다 .cmd NT부터 시작하여 32 비트 창을위한 것입니다. 그러나 나는 어디에서나 .BAT 파일을 계속보고 있으며, 접미사 중 하나를 사용하여 정확히 동일하게 작동하는 것 같습니다. 내 코드가 NT보다 더 오래된 곳에서 실행할 필요가 없다고 가정하면 실제로 배치 파일을 지명하는 방식이 중요하거나 일부가 있습니까? Gotcha 잘못된 접미사를 사용하여 나를 기다리고 있습니까?

도움이 되었습니까?

해결책

에서 이 뉴스 그룹 게시 ~에 의해 Mark Zbikowski 그 자신:

cmd.exe가 관련된 한 .cmd와 .bat의 차이점은 다음과 같습니다. .CMD 파일의 확장자가 활성화 된 경로/부록/프롬프트/Set/Assoc은 오류에 관계없이 오류 레벨을 설정합니다. .BAT 오류에서만 오류 레벨을 설정합니다.

다시 말해, ErrorLevel이 0이 아닌 것으로 설정된 다음 해당 명령 중 하나를 실행하면 결과적으로 ErrorLevel이 다음과 같습니다.

  • .BAT 파일의 0이 아닌 값으로 홀로 남겨 둡니다.
  • .cmd 파일에서 0으로 재설정하십시오.

다른 팁

다음은 다양한 답변과 인용 된 참조에서 검증 된 정보를 편집 한 것입니다.

  1. command.com MS-DOS에 도입 된 16 비트 명령 프로세서이며 Win9X 시리즈 운영 체제에도 사용되었습니다.
  2. cmd.exe Windows NT의 32 비트 명령 프로세서입니다 (64 비트 Windows OS는 64 비트 버전도 있습니다). cmd.exe Windows 9X의 일부는 아닙니다. OS/2 버전 1.0에서 시작했으며 OS/2 버전에서 시작되었습니다. cmd 16 비트를 시작했지만 그럼에도 start). Windows nt는 상속되었습니다 cmd OS/2에서 Windows NT의 Win32 버전은 32 비트에서 시작되었습니다. OS/2는 1992 년에 32 비트를 기록했지만 cmd 16 비트 OS/2 1.X 프로그램으로 유지되었습니다.
  3. 그만큼 ComSpec ENV 변수는 어떤 프로그램이 시작한 지 정의합니다 .bat 그리고 .cmd 스크립트. (이 기본값으로 시작합니다 cmd.exe.)
  4. cmd.exe 뒤로 호환됩니다 command.com.
  5. 설계된 스크립트 cmd.exe 이름을 지정할 수 있습니다 .cmd Windows 9X에서 우발적 인 실행을 방지합니다. 이 파일 이름 확장자는 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 환경 변수에 의해 제어됩니다. 보다 명령 프롬프트가 파일을 실행하는 순서 자세한 사항은.

참조 :

위키 백과 : 명령 쉘 비교

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

  • .cmd 비 NT 시스템에서 실수로 실행되는 실행을 방지합니다.
  • .cmd 내장 명령이 성공시 에러 레벨을 0으로 변경할 수 있도록합니다.

명령 확장은 Windows 2000 이상에서 .bat 및 .cmd 파일 모두에서 기본적으로 켜져 있습니다.

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

아니요 - 조금은 중요하지 않습니다. nt에서 .bat 및 .cmd extension은 모두 cmd.exe 프로세서가 파일을 정확히 같은 방식으로 처리하게합니다.

MS Technet의 Winnt 클래스 시스템에 대한 Command.com 대 CMD.Exe에 대한 추가 흥미로운 정보 (http://technet.microsoft.com/en-us/library/cc723564.aspx):

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

답장: 명백히 Command.com이 호출되면 약간 복잡한 미스터리입니다.

몇 달 전, 프로젝트 과정에서 CMD.Exe에서 실행하고자하는 일부 프로그램이 실제로 Command.com에서 실행되는 이유를 알아 내야했습니다. 문제의 "프로그램"은 매우 오래된 .bat 파일로, 여전히 매일 실행됩니다.

Batch 파일이 Command.com에서 실행 된 이유는 .pif 파일 (고대)에서 시작 되었기 때문입니다. PIF를 통해서만 사용할 수있는 특수 메모리 구성 설정은 관련이 없으므로 기존 데스크탑 단축키로 교체했습니다.

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

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

.BAT와 .CMD의 또 다른 차이점은 두 파일이 동일한 파일 이름과 이들 확장자로 존재하는 경우 :

  • 입력 파일 이름 또는 파일 이름.BAT에서 명령 줄이 .bat 파일을 실행합니다

  • .cmd 파일을 실행하려면 입력해야합니다. 파일 이름.CMD

그러나 Windows 7에서 BAT 파일에는이 차이점도 있습니다. 동일한 디렉토리에서 파일 테스트 및 test.cmd를 작성하고 해당 디렉토리에서 테스트를 실행하면 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>

배치에서 작동하는 모든 것은 CMD에서 작동해야합니다. CMD는 환경 제어를위한 확장 기능을 제공합니다. 또한 CMD는 New CMD 통역사에서 실행되므로 NTVDM에 모방 된 16 비트 환경에서 BAT가 실행되면서 더 빠르고 (짧은 파일에서는 눈에 띄지 않음) 스테이블러가 더 빠릅니다.

COMSPEC 환경 변수의 값을 %SystemRoot %System32 Cmd.exe로 변경하면 파일 확장자가 .bat 또는 .cmd인지는 중요하지 않습니다. 확실하지 않지만 이것은 winxp 이상의 기본값 일 수도 있습니다.

주제가 약간 벗어 났지만 고려해 보았습니다 Windows 스크립팅 호스트? 당신은 그것이 더 좋을 수도 있습니다.

.CMD 및 .BAT 파일 실행은 .CMD ErrorLevel 변수에서 명령 확장에 영향을받는 명령에서 변경 될 수 있으므로 다릅니다. 그것은 정말로 그것에 관한 것입니다.

확장은 차이가 없습니다. Command.com과 파일 처리 대 CMD.exe 사이에는 약간의 차이가 있습니다.

내가 발견 한 차이점은 다음과 같습니다. EnableDelayedExpansion ~이다 필수의 안에 .cmd 파일.
경우와 마찬가지로 .bat 파일 기본적으로 암시 적입니다. (윈도우 10)

dir *? | find /i "FOOBAR"
if ERRORLEVEL 0             (
set result="found"  ) else  (
set result="not found"  )
echo %result%

이것은 작동합니다 .bat 그러나 항상입니다 found a .cmd 파일.
바꾸다 line 2 다음은 예상대로 작동합니다.

if %ERRORLEVEL% equ 0       (

그리고 마지막으로 .cmd 파일이 올바르게 작동합니다.

setLocal EnableDelayedExpansion
...
if !ErrorLevel! equ 1       (
...

차이:

.CMD 파일은 실행되기 전에 메모리에로드됩니다. .BAT 파일 라인을 실행하고 다음 줄을 읽고 해당 라인을 실행합니다 ...

스크립트 파일을 실행 한 다음 실행되기 전에 편집 할 수 있습니다. BAT 파일은 이것에 의해 엉망이되지만 CMD 파일은 그렇지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top