Windows batch files: .bat vs .cmd?
From this news group posting by Mark Zbikowski himself:
The differences between .CMD and .BAT as far as CMD.EXE is concerned are: With extensions enabled, PATH/APPEND/PROMPT/SET/ASSOC in .CMD files will set ERRORLEVEL regardless of error. .BAT sets ERRORLEVEL only on errors.
In other words, if ERRORLEVEL is set to non-0 and then you run one of those commands, the resulting ERRORLEVEL will be:
- left alone at its non-0 value in a .bat file
- reset to 0 in a .cmd file.
Here is a compilation of verified information from the various answers and cited references in this thread:
command.com
is the 16-bit command processor introduced in MS-DOS and was also used in the Win9x series of operating systems.cmd.exe
is the 32-bit command processor in Windows NT (64-bit Windows OSes also have a 64-bit version).cmd.exe
was never part of Windows 9x. It originated in OS/2 version 1.0, and the OS/2 version ofcmd
began 16-bit (but was nonetheless a fully fledged protected mode program with commands likestart
). Windows NT inheritedcmd
from OS/2, but Windows NT's Win32 version started off 32-bit. Although OS/2 went 32-bit in 1992, itscmd
remained a 16-bit OS/2 1.x program.- The
ComSpec
env variable defines which program is launched by.bat
and.cmd
scripts. (Starting with WinNT this defaults tocmd.exe
.) cmd.exe
is backward compatible withcommand.com
.- A script that is designed for
cmd.exe
can be named.cmd
to prevent accidental execution on Windows 9x. This filename extension also dates back to OS/2 version 1.0 and 1987.
Here is a list of cmd.exe
features that are not supported by command.com
:
- Long filenames (exceeding the 8.3 format)
- Command history
- Tab completion
- Escape character:
^
(Use for:\ & | > < ^
) - Directory stack:
PUSHD
/POPD
- Integer arithmetic:
SET /A i+=1
- Search/Replace/Substring:
SET %varname:expression%
- Command substitution:
FOR /F
(existed before, has been enhanced) - Functions:
CALL :label
Order of Execution:
If both .bat and .cmd versions of a script (test.bat, test.cmd) are in the same folder and you run the script without the extension (test), by default the .bat version of the script will run, even on 64-bit Windows 7. The order of execution is controlled by the PATHEXT environment variable. See Order in which Command Prompt executes files for more details.
References:
- cmd.exe
- command.com
wikipedia: Comparison of command shells