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:
wikipedia: Comparison of command shells
These answers are a bit too long and focused on interactive use. The important differences for scripting are:
.cmd
prevents inadvertent execution on non-NT systems..cmd
enables built-in commands to change Errorlevel to 0 on success.
Not that exciting, eh?
There used to be a number of additional features enabled in .cmd
files, called Command Extensions. However, they are now enabled by default for both .bat
and .cmd
files under Windows 2000 and later.
Bottom line: in 2012 and beyond, I recommend using .cmd
exclusively.