Windows批处理文件:.bat与.cmd?

时间:2020-03-06 14:52:39  来源:igfitidea点击:

据我了解,.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文件不会。