据我所知,它.bat
是旧的16位命名约定,.cmd
适用于32位Windows,即从NT开始.但我继续在任何地方看到.bat文件,并且它们似乎使用任一后缀完全相同.假设我的代码将永远不需要对新台币任何旧的运行,是否真的重要走哪条路我名字我的批处理文件,还是有一些疑难杂症,通过使用错误的后缀等着我?
从这个新闻组记录由马克·茨柏克沃斯基自己:
就CMD.EXE而言,.CMD和.BAT之间的区别在于:启用扩展后,.CMD文件中的PATH/APPEND/PROMPT/SET/ASSOC将设置ERRORLEVEL而不管错误..BAT仅在出错时设置ERRORLEVEL.
换句话说,如果将ERRORLEVEL设置为非0,然后运行其中一个命令,则生成的ERRORLEVEL将为:
单独留在.bat文件中的非0值
在.cmd文件中重置为0.
以下是本主题中各种答案和引用参考文献的经过验证的信息汇编:
command.com
是MS-DOS中引入的16位命令处理器,也用于Win9x系列操作系统.
cmd.exe
是Windows NT中的32位命令处理器(64位Windows操作系统也有64位版本).cmd.exe
从未成为Windows 9x的一部分.它起源于OS/2版本1.0,OS/2版本cmd
开始16位(但仍然是一个完全成熟的保护模式程序,带有命令start
).Windows NT继承cmd
自OS/2,但Windows NT的Win32版本从32位开始.虽然OS/2在1992年变为32位,但它cmd
仍然是一个16位OS/2 1.x程序.
在ComSpec
环境变量定义了程序由发射.bat
和.cmd
脚本.(从WinNT开始,默认为cmd.exe
.)
cmd.exe
向后兼容command.com
.
cmd.exe
可以命名专为此目的设置的脚本,.cmd
以防止在Windows 9x上意外执行.此文件扩展名也可以追溯到OS/2版本1.0和1987.
以下是cmd.exe
不支持的功能列表command.com
:
长文件名(超过8.3格式)
命令历史
标签完成
转义字符:^
(适用于:\ & | > < ^
)
目录堆栈:PUSHD
/POPD
整数算术: SET /A i+=1
查找/替换/字符串: SET %varname:expression%
命令替换:( FOR /F
之前存在,已被增强)
功能: CALL :label
执行顺序:
如果脚本的.bat和.cmd版本(test.bat,test.cmd)都在同一文件夹中并且您运行没有扩展名(test)的脚本,则默认情况下脚本的.bat版本将运行,甚至在64位Windows 7上.执行顺序由PATHEXT环境变量控制.有关更多详细信息,请参阅命令提示符执行文件的顺序.
参考文献:
CMD.EXE
command.com
维基百科:命令shell的比较
这些答案有点太长,专注于交互式使用.脚本的重要区别是:
.cmd
防止在非NT系统上无意中执行.
.cmd
启用内置命令,在成功时将Errorlevel更改为0.
默认情况下,Windows 2000或更高版本下的.bat和.cmd文件中都启用了命令扩展.
在2012年及以后,我建议.cmd
专门使用.
不 - 丝毫没关系.在NT上,.bat和.cmd扩展名都会导致cmd.exe处理器以完全相同的方式处理文件.
有关MS TechNet的WinNT级系统上的command.com与cmd.exe的其他有趣信息(http://technet.microsoft.com/en-us/library/cc723564.aspx):
此行为揭示了Windows NT非常重要的一个非常微妙的功能.Windows NT附带的16位MS-DOS shell(COMMAND.COM)是专门为Windows NT设计的.当输入命令以供此shell执行时,它实际上不会执行它.相反,它打包命令文本并将其发送到32位CMD.EXE命令shell以供执行.因为所有命令实际上都是由CMD.EXE(Windows NT命令shell)执行的,所以16位shell继承了完整Windows NT shell的所有功能和设施.
RE:显然当调用command.com时有点复杂的谜团;
几个月前,在项目过程中,我们必须弄清楚为什么我们想要在CMD.EXE下运行的某些程序实际上是在COMMAND.COM下运行的.有问题的"程序"是一个非常古老的.BAT文件,它仍然每天运行.
我们发现批处理文件在COMMAND.COM下运行的原因是它是从.PIF文件(也很古老)启动的.由于仅通过PIF提供的特殊内存配置设置已变得无关紧要,因此我们将其替换为传统的桌面快捷方式.
从快捷方式启动的同一批处理文件在CMD.EXE中运行.当你考虑它时,这是有道理的.我们花了这么长时间才弄明白的原因部分是由于我们忘记了它在启动组中的项目是PIF,因为它自1998年以来一直在生产.
尽管如此,在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>
由于原来的文章是关于使用.bat或.cmd的后果后缀,不一定是命令里面的文件...
.bat和.cmd之间的另一个区别是,如果两个文件存在相同的文件名和两个扩展名,那么:
在命令行输入文件名或文件名 .bat将运行.bat文件
要运行.cmd文件,您必须输入文件名 .cmd
批处理中的所有工作都应该在cmd中工作; cmd提供了一些控制环境的扩展.此外,cmd由新的cmd解释器执行,因此应该更快(在短文件上不明显)并且在NTVDM仿真16位环境下运行时更稳定