.bat
是旧的16位命名约定,而.cmd
是用于32位Windows,例如从NT开始。但我仍然到处看到.bat文件,并且无论使用哪个后缀,它们似乎都能正常工作。假设我的代码永远不需要在NT之前的任何操作系统上运行,那么我将批处理文件命名为哪种方式真的很重要吗?或者说如果我使用错误的后缀会有一些问题等待着我吗?.bat
是旧的16位命名约定,而.cmd
是用于32位Windows,例如从NT开始。但我仍然到处看到.bat文件,并且无论使用哪个后缀,它们似乎都能正常工作。假设我的代码永远不需要在NT之前的任何操作系统上运行,那么我将批处理文件命名为哪种方式真的很重要吗?或者说如果我使用错误的后缀会有一些问题等待着我吗?根据这篇新闻组帖子,由Mark Zbikowski本人撰写:
CMD.EXE在处理.CMD和.BAT文件时的区别在于:启用扩展名后,.CMD文件中的PATH/APPEND/PROMPT/SET/ASSOC命令会在出现错误时设置ERRORLEVEL。而.BAT文件只有在出现错误时才会设置ERRORLEVEL。
换句话说,如果将ERRORLEVEL设置为非0值,然后运行其中一个命令,结果的ERRORLEVEL将是:
DPATH /?
仍将该命令列为 APPEND。此外,维基文章已经进行了大部分修正,但未列出 DPATH 命令。 - dbenham.cmd
脚本执行时,FTYPE命令才会将ERRORLEVEL清除为0。 - dbenhamSET /A i+=1
SET %varname:expression%
FOR /F
(之前已存在,现在已得到增强)CALL :label
执行顺序:
如果脚本的 .bat 和 .cmd 版本(test.bat、test.cmd)都在同一个文件夹中,并且你在不带扩展名(test)的情况下运行该脚本,则默认情况下将运行 .bat 版本的脚本,即使在 64 位 Windows 7 上也是如此。执行顺序由 PATHEXT 环境变量控制。有关更多详细信息,请参见Order in which Command Prompt executes files。
参考资料:
wikipedia:Comparison of command shells
dir filename
相当于dir filename.*
;在cmd.exe中需要使用通配符。在command.com中,执行rem Create an empty file > empty.txt
可以创建一个空文件,但在cmd.exe中不行。 - Aacini这些答案过于冗长,关注的是交互使用。脚本编程时的重要区别在于:
.cmd
防止在非NT系统上意外执行。.cmd
使内置命令能够在成功时将错误级别更改为0。没什么激动人心的,对吧?
以前有许多其他功能可以在 .cmd
文件中启用,称为命令扩展。然而,它们现在已默认在Windows 2000及以后的版本中启用了 .bat
和 .cmd
文件。
底线: 在2012年及以后,我建议独家使用 .cmd
。
不会,.bat和.cmd扩展名在NT上都会让cmd.exe处理器以完全相同的方式处理文件。
来自MS TechNet(http://technet.microsoft.com/en-us/library/cc723564.aspx)关于WinNT级系统中command.com与cmd.exe的额外有趣信息:
这种行为揭示了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的所有功能和设施。
command /c ver
与启动 command.com 并键入 ver 的区别。 - phd443322RE: 明显地,当调用command.com时有点复杂的奥秘;
几个月前,在项目过程中,我们不得不弄清楚为什么我们想要在CMD.EXE下运行的某些程序实际上是在COMMAND.COM下运行的。涉及到的“程序”是一个非常古老的.BAT文件,现在仍然每天运行。
我们发现批处理文件在COMMAND.COM下运行的原因是它是从一个.PIF文件(同样古老)启动的。由于只能通过PIF获得的特殊内存配置设置已经变得无关紧要,我们用传统的桌面快捷方式替换它。
从快捷方式启动的相同批处理文件在CMD.EXE下运行。如果你好好想想,这是有道理的。我们花了很长时间才弄清楚其中的原因,部分原因是因为我们忘记了它在启动组中的项是一个PIF,因为它自1998年以来就一直在生产中使用。
然而,在Windows 7上,批处理文件也有这样的区别:如果您在同一个目录下创建了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>
PATH
环境变量中始终优先于其他目录。 - Turkeyphant由于原始帖子涉及使用 .bat 或 .cmd 后缀名 的后果,而不一定是文件内部的命令...
.bat 和 .cmd 之间的另一个区别是,如果存在两个具有相同文件名和这两个扩展名的文件,则:
在命令行中输入 文件名 或 文件名.bat 将运行 .bat 文件
要运行 .cmd 文件,必须输入 文件名.cmd
echo notepad.exe %* > np.cmd
然后,如果我只是输入“np mytextfilename.txt”,它会打开记事本。我不必输入“np.cmd”来调用它。 - Jon DavisPATHEXT
环境变量。扩展名出现的顺序决定了没有指定扩展名时的优先顺序。值得一提的是,对于扩展名出现在环境变量中的文件,不必指定其扩展名。 - Ricardo Zorio所有在批处理中工作的内容都应该可以在命令提示符(cmd)下工作;cmd提供了一些控制环境的扩展。此外,cmd是由新的cmd解释器执行的,因此应该更快(对于短文件不明显),并且更稳定,因为bat运行在NTVDM模拟的16位环境下。
.bat
在NT下不运行DOS。只有当程序需要时才会启动VDM,而且在64位Windows中甚至不支持它,尽管我相信.bat
是支持的。 - Gringo Suave.cmd和.bat文件执行不同,因为在.cmd中,errorlevel变量可以在受命令扩展影响的命令上发生改变。就是这样。
`@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`
- zask我认为,如果您将ComSpec环境变量的值更改为%SystemRoot%system32\cmd.exe
(CMD),那么文件扩展名是.BAT
还是.CMD
都无所谓。我不确定,但这可能是WinXP及以上版本的默认设置。