Windows 批处理 .bat 和 .cmd 文件之间的区别

Siddharth Bishnoi 2024年2月15日
  1. COMMAND.COMcmd.exe 之间的区别
  2. Windows Batch .bat.cmd 文件之间的主要区别
  3. 结论
Windows 批处理 .bat 和 .cmd 文件之间的区别

用户通常认为 COMMAND.COMcmd.exe 相同。此外,他们对批处理文件使用哪个扩展名 .bat.cmd 感到困惑。

它们是相同的还是不同的,使用哪些扩展是否重要?本文将讨论所有这些问题的答案。

当我们运行批处理文件时,它们会在命令提示符中执行。批处理文件主要在 Windows NT 版本的 cmd.exe 中运行。

在旧版本中,它将在 COMMAND.COM shell 中运行。

COMMAND.COMcmd.exe 之间的区别

COMMAND.COMcmd.exe 是 MS-DOS 和 Windows 的命令解释器版本。COMMAND.COM 是一个用于运行 16 位程序的命令行 shell;它是一个 DOS 程序,它是启动后第一个运行的程序,它通过运行 AUTOEXEC.BAT 配置文件来设置系统。

它最初于 1980 年发布,用于 MS-DOS、Windows 95-98 和 Windows ME。它仅对设计为作为 16 位程序运行的旧程序兼容和有用,并且从那时起就没有更新。

command.com

另一方面,cmd.exeCOMMAND.COM 的继承者。它是为 32 位程序设计的,于 1987 年发布,用于 OS/2、Windows NT 和 Windows CE。

COMMAND.COM 相比,cmd.exe 提供了更好的扩展,例如详细的错误信息,支持箭头键查看命令历史,支持延迟变量扩展,并改进了内部命令。

cmd.exe

批处理文件是一个脚本文件,可以存储命令并由命令行解释器按串行顺序执行。 .bat 文件扩展名用于 MS-DOS 和 Windows,它是第一个用于批处理文件的扩展名,而 .cmd 用于 Windows NT 系列和 OS/2。

.cmd 文件只能在 cmd.exe 中执行,因为 COMMAND.COM 无法识别此扩展名。

本教程将说明 .bat.cmd 文件之间的主要区别。

Windows Batch .bat.cmd 文件之间的主要区别

.bat.cmd 之间的主要关键区别将在下面讨论。

ERRORLEVEL 处理

.bat.cmd 以不同方式处理 ERRORLEVEL 变量。当调用 ERRORLEVEL 时,.bat 仅在发生真正错误时更改其状态,即对于诸如 appenddpathftypesetpathassoc 这样的命令 , .bat 不会设置 ERRORLEVEL。

但是,在 .cmd 的情况下,它会设置 ERRORLEVEL,而不考虑真正的错误。即使成功执行,它也会将 ERRORLEVEL 重置为 0。

有时,它在编写脚本时会造成混乱,因此用户应该小心这一点。

执行顺序

环境变量 PATHEXT 控制执行顺序。执行取决于存储在 PATHEXT 变量中的变量的顺序。

如果 .bat.cmd 脚本都存储在同一个文件夹中,执行不带扩展名的脚本将首先运行 .bat 文件,然后运行 ​​.cmd 文件。PATHEXT 变量的默认顺序如下:

ECHO %PATHEXT%

路径下变量

但是,你可以更改 PATHEXT 变量中的扩展顺序。即使你删除了 PATHEXT 变量,其顺序也将与 Windows 的 MS-DOS 版本相同。

支持

关于对 Windows 版本的支持,几乎所有 Windows 版本都支持 .cmd 文件,这与 .bat 文件的情况不同。 .bat 最初是为 MS-DOS 开发的,而 .cmd 是为 Windows NT 开发的,因此 .cmd 文件不能在非 Windows NT 系统中执行。

.bat 的脚本比 .cmd 更旧。与 .bat 文件相比,.cmd 向后兼容。

安全

关于安全性,.cmd.bat 更安全。由于 .bat 文件中的命令是以串行方式存储的,并且是逐行执行的,因此更容易受到安全攻击。 .cmd 文件不按顺序执行命令,因此它们比 .bat 文件更安全。

.cmd 文件也可以通过允许查看、安装和运行 .cmd 文件的应用程序在 Android 中使用。Android 不支持 .bat 文件。

.bat 文件具有旧版本的 Microsoft 语言,因为它是早期为 MS-DOS 开发的。 .cmd 是为较新版本的 Windows 开发的编程语言和解释器。

当你运行没有任何扩展名的批处理文件时,它将以 .bat 运行,而对于 .cmd 文件扩展名,你必须输入文件名作为 filename.cmd。这种情况仅适用于两个扩展名具有相同文件名的情况; .cmd 需要提供扩展名来运行文件,而 .bat 文件直接运行程序而不需要扩展名。

如下图所示,我们有两个具有相同文件名 testfile 和不同扩展名 .bat.cmd 的批处理文件。 .bat 文件存储为 Windows 批处理文件,.cmd 存储为 Windows 命令脚本。

具有相同文件名的批处理文件

运行 .bat 文件:

运行 bat 文件

运行 .cmd 文件:

运行 cmd 文件

工作环境

.bat 文件设计为在 NTVDM 环境中运行,这是一个在 32 位 Windows 上运行 16 位程序的 Windows 进程。NTVDM 代表 Windows NT 虚拟 DOS 机器,执行为 ntvdm.exe

它是系统的重要程序,为了程序的稳定运行,不应删除它。 .bat 文件在此环境中运行,因此在所有环境中都受支持,而 .cmd 文件无法在 16 位环境中执行。

此外,.cmd 文件在执行之前存储在内存中,而 .bat 文件逐行执行命令而不将它们存储在内存中。

解释器

带有 .bat 文件扩展名的批处理文件可以在 COMMAND.COMcmd.exe 下运行,尽管两个解释器执行文件的方式不同。 .cmd 文件仅在 cmd.exe 中运行。

COMSPEC 环境变量用于启动批处理文件的命令行解释器。默认情况下,对于旧版本(如 MS-DOS),它设置为 COMMAND.COM

从 Windows NT 开始,它默认为 cmd.exe。要查看其内容,请执行以下命令:

ECHO %COMSPEC%

compspec 变量

因此,较新版本的 Windows 将在 cmd.exe 中运行。但在旧版本中,只会执行 .bat 文件。

结论

因此,我们已经讨论了批处理文件扩展名 .bat.cmd 之间的基本关键区别。两者都有各自的优势。

总而言之,在 .bat 文件中工作的所有内容也应该在 .cmd 文件中工作。 .cmd 文件比 .bat 文件更快、更稳定。

使用正确的扩展取决于你的要求。但是,对于较新的版本,建议使用 .cmd 文件扩展名。