协慌网

登录 贡献 社区

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

据我了解, .bat是旧的 16 位命名约定, .cmd是用于 32 位 Windows 的,即以 NT 开头。但是我仍然到处都看到. bat 文件,无论使用哪个后缀,它们似乎都可以完全相同地工作。假设我的代码永远不需要在 NT 之前的任何版本上运行,那么用哪种方式命名批处理文件真的很重要,还是因为使用错误的后缀而使我有些困惑

答案

马克 · 兹比科夫斯基本人发布新闻组中

就 CMD.EXE 而言,.CMD 和. BAT 之间的区别是:启用扩展名后,.CMD 文件中的 PATH / APPEND / PROMPT / SET / ASSOC 将设置 ERRORLEVEL 而不考虑错误。 .BAT 仅对错误设置 ERRORLEVEL。

换句话说,如果将 ERRORLEVEL 设置为非 0,然后运行这些命令之一,则产生的 ERRORLEVEL 将为:

  • 在. bat 文件中单独保留其非零值
  • 在. cmd 文件中重置为 0。

以下是该线程中各种答案和引用参考中经过验证的信息的汇总:

  1. command.com是 MS-DOS 中引入的 16 位命令处理器,也用于 Win9x 系列操作系统中。
  2. 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 程序。
  3. ComSpec env 变量定义由.bat.cmd脚本启动的程序。 (从 WinNT 开始,此默认值为cmd.exe 。)
  4. cmd.execommand.com向后兼容。
  5. 可以将为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 环境变量控制。有关更多详细信息,请参见命令提示符执行文件的顺序

参考文献:

维基百科: 命令外壳的比较

这些答案太长了,只能用于交互式使用。脚本编制的重要区别是:

  • .cmd可以防止在非 NT 系统上意外执行。
  • .cmd启用内置命令,以在成功时将 Errorlevel 更改为 0。

不是那么令人兴奋,是吗?

.cmd文件中曾经启用了许多附加功能,称为命令扩展。但是,现在默认情况下在 Windows 2000 及更高版本中为.bat.cmd文件启用了它们。

底线:在 2012 年及以后,我建议仅使用.cmd