views:

195

answers:

5

what is the difference between a.bat, a.com and a.exe extensions?

A: 

A bat(ch) file is a script that is executed by the command interpretor.

A exe file is compiled binary code to be executed directly on the cpu.

A com file is a relic from the past to create a small exe.

Gamecat
A: 

.bat is a batch file. It is interpreted.

.exe is a regular executable program file.

A .com file, at least for MS-DOS, has many meta-data missing and is loaded into a specific offset in the main memory. It is smaller than .exe

Extrakun
+2  A: 

I assume you mean for windows?

"a.bat" is supposed to be a batch file, the Windows/DOS equivalent of a script file.

"a.com" and "a.exe" are supposed to be equivalent these days. However, back in the Windows 3.x days, a "com" file was a dos executable, where an "exe" file was a portable executable, or a Windows-based executable. This is a gotcha these days, as files in the format "www.example.com" can exist on your hard drive, and many people mistake such a file for a web link. Even worse, Windows typically tries executing "com" files before "exe" files.

Medivh
Order of Precedence in Locating Executable Files (http://support.microsoft.com/kb/35284) is also useful sometimes when you're in a bind (rarely though).
Liao
.exe files existed before Windows came around.
Ignacio Vazquez-Abrams
Actually, Portable Executables existed before Windows. See Wikipedia.
George Edison
A: 

.BAT - Batch File: list of commands (basically a text file with command-line commands)

.COM - DOS Executable loaded into a fixed block of memory (stems back from before multi-tasking)

.EXE - Executable file - standard application on the Windows platform

mynameiscoffey
+14  A: 

Originally, a .COM file was a literal blob of 8086 code (that is, 16-bit x86). It is meant to be loaded at a fixed address, and the loader would jump straight to the first byte of its address. It's also limited in size.

An .EXE file has more header information. So it has required structures for things like dynamic linking, where code from a DLL can be patched into the .EXE's memory space at load time.. It originally comes from DOS, but it's today used in Windows.

However DOS and Windows eventually went to a model where the file extension in a .COM and .EXE didn't mean anything. The program loader first checks the first two bytes of the file. If it happens to be the string MZ (legend has it this stands for the initials of an early Microsoft employee), it will treat it as an EXE, otherwise it will load it as if it were a COM file. Since MZ doesn't map to a sensible x86 instruction to start a program, they can get away with this. Net effect: In some versions of DOS/Windows, an .EXE can be named with .COM and vice versa. For example, in many versions of DOS/Windows, the famous COMMAND.COM was actually an EXE.

I am not sure how much the previous paragraph applies to NT based versions of Windows. I'd imagine by now they've abandoned the .COM stuff altogether.

Lastly, a .BAT file is a list of commands to be executed as if you typed them at your command prompt. However these days most people name them as .CMD.

asveikau
**MZ** stands for **MORIN Zobowski** - He designed and implemented the first versions of EXE headers. :)
this. __curious_geek
You can rename any .exe file to .com and it will run fine - it makes no difference.
George Edison
Just because it runs it doesn't mean it works! EXE and COM are like 2 completely different model of cars from the same manufacture.
this. __curious_geek
@George Edison - What I meant was, if you assemble "mov ax, 4c00h ; int 21h", then name that with .COM, will it do anything if you run it? Does this still work on Win7?
asveikau
I use Vista :) What I meant was that Windows will load the executable based on headers/content, not extension. It is ignored - at least when it comes to exe/com. As for real .com apps, NT based OS's will not run 16 bit executable files.
George Edison
@George Edison I'm pretty sure 32-bit NT will still run Win16 EXEs.
asveikau
I believe that a "call 0" would terminate the program, as it's a holdover from CP/M days. The zero refers to the first 16 bit word of the PSP, which is an int 20h (no exit code used, but causes a program to terminate)
Arthur Kalliokoski