据我所知,.bat是旧的16位命名约定,.cmd用于32位Windows,即从NT开始。但我仍然看到到处都有.bat文件,而且使用两个后缀时,它们的工作方式似乎完全相同。假设我的代码永远不需要在比NT更旧的软件上运行,那么我用哪种方式命名批处理文件真的很重要吗,或者使用错误的后缀会有什么问题等着我吗?
当前回答
扩展没有什么区别。
COMMAND.COM处理文件与CMD.EXE略有不同。
其他回答
不,这一点都不重要。在NT上,.bat和.cmd扩展名都会导致cmd.exe处理器以完全相同的方式处理文件。
有关MS TechNet中WinNT类系统上command.com与cmd.exe的其他有趣信息(http://technet.microsoft.com/en-us/library/cc723564.aspx):
这种行为揭示了一个非常微妙的Windows NT的功能重要的16位MS-DOS shellWindows附带的(COMMAND.COM)NT是专门为Windows设计的NT。输入命令时由这个shell执行,它不会实际上执行它。相反打包命令文本并发送到32位CMD.EXE命令shell处决因为所有命令都是由CMD.EXE实际执行(Windows NT命令shell),16位shell继承了所有功能和完整Windows NT的设施壳
尽管如此,在Windows7上,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>
我相信,如果将ComSpec环境变量的值更改为%SystemRoot%system32\cmd.exe(cmd),那么文件扩展名是.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位开始(但仍然是一个完全成熟的保护模式程序,具有启动等命令)。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功能列表:
长文件名(超过8.3格式)命令历史记录制表符完成转义符:^(用于:\&|><^)目录堆栈:PUSHD/POPD整数算术:SET/A i+=1搜索/替换/子字符串:SET%varname:expression%命令替换:FOR/F(以前存在,已增强)函数:CALL:标签
执行顺序:
如果.bat和.cmd版本的脚本(test.bat、test.cmd)位于同一文件夹中,并且您运行的脚本没有扩展名(test),则默认情况下,.bat版本的脚本将运行,即使在64位Windows 7上也是如此。执行顺序由PATHEXT环境变量控制。有关详细信息,请参见命令提示符执行文件的顺序。
参考文献:
命令提示符命令程序
wikipedia:命令shell的比较
这些答案有点太长,而且侧重于交互式使用。脚本编写的重要区别在于:
.cmd可防止在非NT系统上意外执行。.cmd允许内置命令在成功时将Errorlevel更改为0。
没那么令人兴奋吧?
以前,.cmd文件中启用了许多其他功能,称为“命令扩展”。但是,在Windows 2000及更高版本下,它们现在默认同时为.bat和.cmd文件启用。
一句话:在2012年及以后,我建议只使用.cmd。
推荐文章
- 我如何找到哪个程序正在使用端口80在Windows?
- 在Windows中有像GREP这样的模式匹配实用程序吗?
- 如何在Windows命令提示符下运行.sh ?
- 如何从命令行在windows中找到mysql数据目录
- 在没有事件源注册的情况下写入Windows应用程序事件日志
- Windows FINDSTR命令的未记录的特性和限制是什么?
- 无法在Windows上从/usr/local/ssl/openssl.cnf加载配置信息
- 用Windows任务调度器运行批处理文件
- GIT克隆在windows中跨本地文件系统回购
- 如何运行一个PowerShell脚本而不显示窗口?
- PowerShell:仅为单个命令设置环境变量
- 为什么这个Windows批处理文件只执行第一行,而在命令shell中执行所有三行?
- 如何将文件内容读入批处理文件中的变量?
- 环境变量存储在Windows注册表的哪里?
- 有一个好的Valgrind Windows的替代品吗?