据我所知,.bat是旧的16位命名约定,.cmd用于32位Windows,即从NT开始。但我仍然看到到处都有.bat文件,而且使用两个后缀时,它们的工作方式似乎完全相同。假设我的代码永远不需要在比NT更旧的软件上运行,那么我用哪种方式命名批处理文件真的很重要吗,或者使用错误的后缀会有什么问题等着我吗?


当前回答

从Mark Zbikowski本人的新闻组帖子中可以看到:

CMD.EXE与.CMD和.BAT之间的差异是:启用扩展名后,.CMD中的PATH/APPEND/PROMPT/SET/AASSOC文件将设置ERRORLEVEL,而不考虑错误。BAT设置ERRORLEVEL仅在错误时。

换句话说,如果ERRORLEVEL设置为非0,然后运行其中一个命令,则生成的ERRORLEVEL将为:

在.bat文件中仅保留非0值在.cmd文件中重置为0。

其他回答

从Mark Zbikowski本人的新闻组帖子中可以看到:

CMD.EXE与.CMD和.BAT之间的差异是:启用扩展名后,.CMD中的PATH/APPEND/PROMPT/SET/AASSOC文件将设置ERRORLEVEL,而不考虑错误。BAT设置ERRORLEVEL仅在错误时。

换句话说,如果ERRORLEVEL设置为非0,然后运行其中一个命令,则生成的ERRORLEVEL将为:

在.bat文件中仅保留非0值在.cmd文件中重置为0。

由于最初的帖子是关于使用.bat或.cmd后缀的后果,所以不一定是文件中的命令。。。

.bat和.cmd之间的另一个区别是,如果存在两个具有相同文件名和两个扩展名的文件,则:

在命令行输入filename或filename.bat将运行.bat文件要运行.cmd文件,必须输入filename.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的设施壳

答:显然,command.com的调用时间有点复杂;

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

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

从快捷方式启动的同一批处理文件在CMD.EXE中运行。仔细想想,这是有道理的。我们花了这么长时间才弄清楚,部分原因是我们忘记了它在创业团队中的项目是PIF,因为它从1998年开始生产。

差异:

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

当您执行脚本文件,然后在执行完成之前对其进行编辑时,可能会遇到这种情况。bat文件会被这个搞砸,但cmd文件不会。