Windows批处理文件:.bat vs .cmd?
据我了解, .bat
是旧的16位命名约定, .cmd
是32位Windows,即从NT开始。 但我继续在任何地方都看到.bat文件,而且它们似乎使用任一后缀完全相同。 假设我的代码将永远不需要对新台币任何旧的运行,是否真的重要走哪条路我名字我的批处理文件,还是有使用错误的后缀一些疑难杂症等着我?
从Mark Zbikowski本人发布的新闻组中发现:
就CMD.EXE而言,.CMD和.BAT之间的区别是:启用了扩展,.CMD文件中的PATH / APPEND / PROMPT / SET / ASSOC将设置ERRORLEVEL而不管错误。 .BAT仅在出错时设置ERRORLEVEL。
以下是本主题中各种答案和引用参考文献的验证信息汇编:
command.com
是在MS-DOS中引入的16位命令处理器,也用于Win9x系列操作系统。 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程序。 ComSpec
env变量定义了由.bat
和.cmd
脚本启动的程序。 (从WinNT开始,这默认为cmd.exe
。) cmd.exe
向后兼容command.com
。 cmd.exe
设计的脚本可命名为.cmd
以防止在Windows 9x上意外执行。 该文件扩展名也可以追溯到OS / 2版本1.0和1987。 以下列出了command.com
不支持的cmd.exe
功能:
^
(用于: & | > < ^
) 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
防止在非NT系统上无意执行。 .cmd
允许内置命令在成功时将Errorlevel更改为0。 编辑:在Windows 2000或更高版本下,命令扩展名默认处于.bat和.cmd文件中。
在2012年及以后,我推荐独家使用.cmd
。
上一篇: Windows batch files: .bat vs .cmd?
下一篇: Long commands split over multiple lines in Windows Vista batch (.bat) file