据我所知,.bat是旧的16位命名约定,.cmd用于32位Windows,即从NT开始。但我仍然看到到处都有.bat文件,而且使用两个后缀时,它们的工作方式似乎完全相同。假设我的代码永远不需要在比NT更旧的软件上运行,那么我用哪种方式命名批处理文件真的很重要吗,或者使用错误的后缀会有什么问题等着我吗?
当前回答
这些答案有点太长,而且侧重于交互式使用。脚本编写的重要区别在于:
.cmd可防止在非NT系统上意外执行。.cmd允许内置命令在成功时将Errorlevel更改为0。
没那么令人兴奋吧?
以前,.cmd文件中启用了许多其他功能,称为“命令扩展”。但是,在Windows 2000及更高版本下,它们现在默认同时为.bat和.cmd文件启用。
一句话:在2012年及以后,我建议只使用.cmd。
其他回答
差异:
.cmd文件在执行之前会加载到内存中。bat文件执行一行,读取下一行,执行该行。。。
当您执行脚本文件,然后在执行完成之前对其进行编辑时,可能会遇到这种情况。bat文件会被这个搞砸,但cmd文件不会。
.cmd和.bat文件的执行不同,因为在.cmd错误级别变量中,它可以在受命令扩展名影响的命令上更改。这真的很重要。
不,这一点都不重要。在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的设施壳
从Mark Zbikowski本人的新闻组帖子中可以看到:
CMD.EXE与.CMD和.BAT之间的差异是:启用扩展名后,.CMD中的PATH/APPEND/PROMPT/SET/AASSOC文件将设置ERRORLEVEL,而不考虑错误。BAT设置ERRORLEVEL仅在错误时。
换句话说,如果ERRORLEVEL设置为非0,然后运行其中一个命令,则生成的ERRORLEVEL将为:
在.bat文件中仅保留非0值在.cmd文件中重置为0。
扩展没有什么区别。
COMMAND.COM处理文件与CMD.EXE略有不同。
推荐文章
- Windows和Linux上的c++编译:ifdef开关
- 如何验证批处理文件中是否存在一个文件?
- 如何循环通过文件匹配通配符在批处理文件
- 异步运行Windows批处理文件命令
- XAMPP -端口80被PID 4的“无法打开进程”使用!12
- 为什么git在Windows下记不住我的密码
- Git克隆/拉不断冻结在“存储密钥在缓存?”
- 如何在批处理文件中请求管理员访问
- 有没有替换Windows (Visual C)的unistd.h ?
- 从Windows批处理文件设置系统环境变量?
- 在批处理文件中处理子字符串的最佳方法是什么?
- 在Sublime Text 2中使用Ctrl+D进行多个选择时,我如何跳过匹配?
- #定义WIN32_LEAN_AND_MEAN具体排除了什么?
- 如何添加一个设置路径只执行批处理文件?
- 最好的轻量级web服务器(只有静态内容)的Windows