windows命令行运行bat - Windows批处理文件:.bat vs.cmd?




windows cmd教程 (10)

.cmd和.bat文件的执行方式不同,因为在.cmd错误级别变量中,它可以在受命令扩展影响的命令上更改。 这是真的。

据我了解, .bat是旧的16位命名约定, .cmd是32位Windows,即从NT开始。 但我继续在任何地方都看到.bat文件,而且它们似乎使用任一后缀完全相同。 假设我的代码永远不需要运行在比NT更早的任何东西上,那么我命名我的批处理文件的方式真的很重要,还是有一些通过使用错误的后缀等待我的问题?


RE:显然,当command.com被调用时有点复杂的奥秘;

几个月前,在一个项目过程中,我们必须弄清楚为什么一些我们想在CMD.EXE下运行的程序实际上是在COMMAND.COM下运行的。 有问题的“程序”是一个非常古老的.BAT文件,每天仍在运行。

我们发现批处理文件在COMMAND.COM下运行的原因是它是从.PIF文件(也是古老的)启动的。 由于仅通过PIF提供的特殊内存配置设置已变得无关紧要,因此我们将其替换为传统的桌面快捷方式。

从快捷方式启动的同一批处理文件在CMD.EXE中运行。 当你考虑它时,这是有道理的。 我们花了这么长时间才弄明白的原因部分是因为我们忘记了它在创业小组的项目是PIF,因为它自1998年以来一直在生产。


Mark Zbikowski本人发布新闻组中发现

就CMD.EXE而言,.CMD和.BAT之间的区别是:启用了扩展,.CMD文件中的PATH / APPEND / PROMPT / SET / ASSOC将设置ERRORLEVEL而不管错误。 .BAT仅在出错时设置ERRORLEVEL。


以下是本主题中各种答案和引用参考文献的验证信息汇编:

  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.exe向后兼容command.com
  5. cmd.exe设计的脚本可命名为.cmd以防止在Windows 9x上意外执行。 这个文件扩展名也可以追溯到OS / 2版本1.0和1987。

以下列出了command.com不支持的cmd.exe功能:

  • 长文件名(超过8.3格式)
  • 命令历史
  • Tab完成
  • 转义字符: ^ (用于: \ & | > < ^
  • 目录堆栈: PUSHD / POPD
  • 整数算术: SET /A i+=1
  • 搜索/替换/子字符串: SET %varname:expression%
  • 命令替换: FOR /F (之前存在,已被增强)
  • 函数: CALL :label

执行顺序:

如果脚本的两个.bat和.cmd版本(test.bat,test.cmd)位于相同的文件夹中,并且您运行的脚本没有扩展名(测试),则默认情况下脚本的.bat版本将运行,甚至在64位Windows 7上。执行顺序由PATHEXT环境变量控制。 有关更多详细信息,请参阅命令提示符执行文件的顺序

参考文献:

wikipedia: 比较命令外壳


区别:

.cmd文件在执行前被加载到内存中。 .bat文件执行一行,读取下一行,执行该行...

你可以在执行脚本文件时遇到这种情况,然后在完成执行之前对其进行编辑。 蝙蝠文件将由此弄乱,但cmd文件不会。


尽管如此,在Windows 7上,BAT文件也有这样的区别:如果您曾在同一个目录中创建TEST.BAT和TEST.CMD文件,并且在该目录中运行TEST,它将运行BAT文件。

C:\>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

C:\Temp>echo echo bat > test.bat

C:\Temp>echo echo cmd > test.cmd

C:\Temp>test

C:\Temp>echo bat
bat

C:\Temp>

所有在批处理中工作的应该以cmd工作; cmd为控制环境提供了一些扩展。 而且,cmd是由新的cmd解释器执行的,因此在NTVDM模拟的16位环境下应该更快(在短文件中不明显)并且更稳定


扩展没有区别。 处理文件与CMD.EXE的COMMAND.COM之间略有不同



这些答案有点太长,主要集中在交互使用方面。 重要的区别是:

  • .cmd防止在非NT系统上无意执行。
  • .cmd允许内置命令在成功时将Errorlevel更改为0。

编辑:在Windows 2000或更高版本下,命令扩展名默认处于.bat和.cmd文件中。

在2012年及以后,我推荐独家使用.cmd





cmd