Windows批处理文件:.bat与.cmd?
据我了解,.bat
是旧的16位命名约定,.cmd
是用于32位Windows的,即以NT开头。但是我仍然到处都看到.bat文件,并且无论使用哪个后缀,它们似乎都可以完全相同地工作。假设我的代码永远不需要在NT之前的任何版本上运行,那么用哪种方式命名批处理文件真的很重要,还是因为使用了错误的后缀而使我有些困惑?
解决方案
不,一点也没有关系。在NT上,.bat和.cmd扩展名都使cmd.exe处理器以完全相同的方式处理文件。
MS TechNet(http://technet.microsoft.com/zh-cn/library/cc723564.aspx)上有关WinNT类系统上的command.com与cmd.exe的其他有趣信息:
This behavior reveals a quite subtle feature of Windows NT that is very important. The 16-bit MS-DOS shell (COMMAND.COM) that ships with Windows NT is specially designed for Windows NT. When a command is entered for execution by this shell, it does not actually execute it. Instead, it packages the command text and sends it to a 32-bit CMD.EXE command shell for execution. Because all commands are actually executed by CMD.EXE (the Windows NT command shell), the 16-bit shell inherits all the features and facilities of the full Windows NT shell.
在马克·兹比科夫斯基本人的新闻组发文中:
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.
扩展名没有区别。 COMMAND.COM处理文件与CMD.EXE之间存在细微差异
批量工作的所有内容都应在cmd中工作; cmd提供了一些用于控制环境的扩展。
同样,cmd由新的cmd解释器执行,因此应该更快(在短文件中不可见),并且由于bat在NTVDM模拟的16位环境下运行,因此更稳定
我相信,如果将ComSpec环境变量的值更改为%SystemRoot%system32 \ cmd.exe,则文件扩展名是.BAT还是.CMD都没有关系。我不确定,但这甚至可能是WinXP及更高版本的默认设置。
这是该线程中各种答案和引用参考文献中经过验证的信息的汇总:
- " command.com"是MS-DOS中引入的16位命令处理器,也用于Win9x系列操作系统中。
- " cmd.exe"是Windows NT中的32位命令处理器(64位Windows OS也具有64位版本)。 cmd.exe绝不是Windows 9x的一部分。它起源于OS / 2版本1.0,而OS / 2版本的cmd从16位开始(但仍然是一个完整的保护模式程序,带有诸如start之类的命令)。 Windows NT从OS / 2继承了cmd,但是Windows NT的Win32版本从32位开始。尽管OS / 2在1992年成为32位,但是它的cmd仍然是16位OS / 2 1.x程序。
- " ComSpec"环境变量定义了哪个程序由" .bat"和" .cmd"脚本启动。 (从WinNT开始,默认为
cmd.exe
。) - cmd.exe与command.com向后兼容。
- 专为cmd.exe设计的脚本可以命名为.cmd,以防止在Windows 9x上意外执行。此文件扩展名也可以追溯到OS / 2版本1.0和1987.
这是command.com
不支持的cmd.exe
功能列表:
- 长文件名(超过8.3格式)
- 命令历史
- 制表符补全
- 换码符:
^
(用于:\ | |> <^`) - 目录堆栈:
PUSHD
/POPD
- 整数运算:
SET / A i + = 1
- 搜索/替换/子字符串:SET%varname:expression%
- 命令替换:
FOR / F
(以前存在,已得到增强) - 功能:
CALL:label
执行顺序:
如果脚本的.bat和.cmd版本(test.bat,test.cmd)都位于同一文件夹中,并且我们运行的脚本没有扩展名(测试),则默认情况下,脚本的.bat版本将运行,即使在64位Windows 7上。执行的顺序由PATHEXT环境变量控制。有关更多详细信息,请参见命令提示符执行文件的顺序。
参考:
- 命令文件
- command.com
维基百科:命令外壳的比较
稍微偏离主题,但我们是否考虑过Windows Scripting Host?我们可能会觉得更好。
区别:
.cmd文件在执行之前已加载到内存中。 .bat文件执行一行,读取下一行,然后执行该行...
我们可以在执行脚本文件时遇到此问题,然后在执行脚本文件之前对其进行编辑。 bat文件将因此而混乱,但cmd文件不会。