Answers:
就CMD.EXE而言,.CMD和.BAT之间的区别是:启用扩展名后,.CMD文件中的PATH / APPEND / PROMPT / SET / ASSOC将设置ERRORLEVEL而不考虑错误。.BAT仅对错误设置ERRORLEVEL。
换句话说,如果将ERRORLEVEL设置为非0,然后运行这些命令之一,则产生的ERRORLEVEL将为:
set var=..
语句时不会(重新)设置错误级别。这很奇怪,因为我认为这是预期的行为。两者都可以争论。我会坚持使用.bat文件。:-)
DPATH /?
仍被列为APPEND ,但已被未记录的DPATH命令替换。此外,此后Wiki文章已得到更正,但未列出DPATH。
以下是该线程中各种答案和引用参考中经过验证的信息的汇总:
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
:
^
(适用于:\ & | > < ^
)PUSHD
/POPD
SET /A i+=1
SET %varname:expression%
FOR /F
以前存在,已得到增强)CALL :label
执行顺序:
如果脚本的.bat和.cmd版本(test.bat,test.cmd)都位于同一文件夹中,并且您运行的脚本没有扩展名(测试),则默认情况下,脚本的.bat版本将运行,即使在64位Windows 7上。执行的顺序由PATHEXT环境变量控制。有关更多详细信息,请参见命令提示符执行文件的顺序。
参考文献:
维基百科:命令外壳的比较
dir filename
与dir filename.*
command.com中的相同;cmd.exe中需要通配符。在command.com中rem Create an empty file > empty.txt
工作;不在cmd.exe中。
这些答案太长了,只能用于交互式使用。脚本编制的重要区别是:
.cmd
防止在非NT系统上无意执行。.cmd
使内置命令在成功时将Errorlevel更改为0。不是那么令人兴奋,是吗?
文件中曾经有许多启用的附加功能.cmd
,称为命令扩展。但是,现在默认情况下,Windows 2000和更高版本下的.bat
和.cmd
文件都启用了它们。
底线:在2012年及以后,我建议.cmd
仅使用。
不-一点也没有关系。在NT上,.bat和.cmd扩展名都使cmd.exe处理器以完全相同的方式处理文件。
MS TechNet(http://technet.microsoft.com/zh-cn/library/cc723564.aspx)上有关WinNT类系统上的command.com与cmd.exe的其他有趣信息:
此行为表明Windows NT的非常微妙的功能非常重要。Windows NT附带的16位MS-DOS外壳程序(COMMAND.COM)是专门为Windows NT设计的。当此外壳输入要执行的命令时,它实际上不会执行。而是,它将命令文本打包并将其发送到32位CMD.EXE命令外壳以执行。因为所有命令实际上都是由CMD.EXE(Windows NT命令外壳程序)执行的,所以16位外壳程序继承了完整Windows NT外壳程序的所有功能。
command /c ver
与启动command.com并键入ver。
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>
PATHEXT
变量.BAT扩展名放在.CMD之前(如此答案所示)。如果您在PATHEXT中修改此顺序,则将改为执行test.cmd。
PATH
环境变量中位于其他目录之前,而不管扩展名如何。
由于原来的文章是关于使用.bat或.cmd的后果后缀,不一定是命令里面的文件...
.bat和.cmd之间的另一个区别是,如果存在两个具有相同文件名和两个扩展名的文件,则:
在命令行中输入文件名或文件名 .bat将运行.bat文件
要运行.cmd文件,必须输入文件名 .cmd
PATHEXT
环境变量。如果未指定扩展名,则出现扩展名的顺序是优先顺序。还值得一提的是,不必为扩展名显示在env变量中的文件指定扩展名。
批量工作的所有内容都应在cmd中工作;cmd提供了一些用于控制环境的扩展。另外,cmd由新的cmd解释器执行,因此应该更快(在短文件中不可见),并且由于bat在NTVDM模拟的16位环境下运行,因此更稳定
.bat
不能在NT中的DOS下运行。VDM仅在程序需要时才启动,甚至在64位Windows中也不支持,尽管我相信.bat是。
.cmd和.bat文件的执行不同,因为在.cmd错误级别变量中,它可以在受命令扩展名影响的命令上更改。就是这样。
@echo off&setlocal ENABLEEXTENSIONS call :func&&echo/I'm a cmd||echo/I'm a bat goto :EOF :func md;2>nul set var=1
话题不大,但是您是否考虑过Windows Scripting Host?您可能会觉得更好。
区别:
.cmd文件在执行之前已加载到内存中。.bat文件执行一行,读取下一行,然后执行该行...
您可以在执行脚本文件时遇到此问题,然后在执行完毕之前对其进行编辑。bat文件将因此而混乱,但cmd文件不会。
echo 1&pause
然后执行它。您将看到1
和Press any key to continue...
。暂停时,echo 2&pause
使用外部编辑器添加新行。按一个键。您将看到2
和Press any key to continue...
。您甚至可以尝试echo 3&pause
在开始时添加。当您再次按下某个键时,您将看到2
。