据我了解, .bat
是旧的 16 位命名约定, .cmd
是用于 32 位 Windows 的,即以 NT 开头。但是我仍然到处都看到. bat 文件,无论使用哪个后缀,它们似乎都可以完全相同地工作。假设我的代码永远不需要在 NT 之前的任何版本上运行,那么用哪种方式命名批处理文件真的很重要,还是因为使用错误的后缀而使我有些困惑 ?
从马克 · 兹比科夫斯基本人发布的新闻组中 :
就 CMD.EXE 而言,.CMD 和. BAT 之间的区别是:启用扩展名后,.CMD 文件中的 PATH / APPEND / PROMPT / SET / ASSOC 将设置 ERRORLEVEL 而不考虑错误。 .BAT 仅对错误设置 ERRORLEVEL。
换句话说,如果将 ERRORLEVEL 设置为非 0,然后运行这些命令之一,则产生的 ERRORLEVEL 将为:
以下是该线程中各种答案和引用参考中经过验证的信息的汇总:
command.com
是 MS-DOS 中引入的 16 位命令处理器,也用于 Win9x 系列操作系统中。 cmd.exe
是 Windows NT 中的 32 位命令处理器(64 位 Windows 操作系统也具有 64 位版本)。 cmd.exe
绝不是 Windows 9x 的一部分。它起源于 OS / 2 版本 1.0,而cmd
的 OS / 2 版本以 16 位开始(但是仍然是带有start
命令的成熟的保护模式程序)。 Windows NT 从 OS / 2 继承了cmd
,但是 Windows NT 的 Win32 版本从 32 位开始。尽管 OS / 2 在 1992 年成为 32 位,但是它的cmd
仍然是 16 位 OS / 2 1.x 程序。 ComSpec
env 变量定义由.bat
和.cmd
脚本启动的程序。 (从 WinNT 开始,此默认值为cmd.exe
。) cmd.exe
与command.com
向后兼容。 cmd.exe
设计的脚本命名为.cmd
以防止在 Windows 9x 上意外执行。此文件扩展名也可以追溯到 OS / 2 版本 1.0 和 1987。 这是command.com
不支持的cmd.exe
功能的列表:
^
(用于: \ & | > < ^
) PUSHD
/ POPD
SET /A i+=1
SET %varname:expression%
FOR /F
(以前存在,已得到增强) CALL :label
执行顺序:
如果脚本的. bat 和. cmd 版本(test.bat,test.cmd)都位于同一文件夹中,并且您运行的脚本没有扩展名(测试),则默认情况下,脚本的. bat 版本将运行,即使在 64 位 Windows 7 上。执行的顺序由 PATHEXT 环境变量控制。有关更多详细信息,请参见命令提示符执行文件的顺序 。
参考文献:
维基百科: 命令外壳的比较
这些答案太长了,只能用于交互式使用。脚本编制的重要区别是:
.cmd
可以防止在非 NT 系统上意外执行。 .cmd
启用内置命令,以在成功时将 Errorlevel 更改为 0。 不是那么令人兴奋,是吗?
.cmd
文件中曾经启用了许多附加功能,称为命令扩展。但是,现在默认情况下在 Windows 2000 及更高版本中为.bat
和.cmd
文件启用了它们。
底线:在 2012 年及以后,我建议仅使用.cmd
。