Windows批文件:.蝙蝠vs。cmd?
-
02-07-2019 - |
题
我的理解是, .bat
是的老16位命名约定, .cmd
是32位,即开始与NT。但我继续看到的。蝙蝠文件无处不在,他们似乎完全相同的使用后缀。假设我的代码将不再需要运行上的任何东西超过NT,它不会真正的问题,这样我的名字我的批文件,还是有一些 疑难杂症 等待我的使用错误的后缀?
解决方案
从 这个新闻小组发布 通过 标记Zbikowski 自己:
之间的差异.CMD。蝙蝠尽CMD.EXE 感到关切的是 有:与扩展,启用,路径/追加提示/SET/ASSOC.CMD 文件将定等级不管的错误。.蝙蝠集等级 只有在错误。
换句话说,如果等级是设为非0然后你跑一个,这些命令,所得到的等级将是:
- 独自留在其非0值中的一个。蝙蝠文件
- 重要0中的一个。cmd文件。
其他提示
这里是一个汇编的经核实的信息的各种答案,并引用的参考文献在这个主线:
command.com
是16位的命令处理器中介绍的MS-DOS,并还利用在Win9x系列操作系统。cmd.exe
是32位的命令处理器在Windows NT(64位Windows操作系统也有64位版)。cmd.exe
不Windows9x。它起源于OS/2 1.0版,并OS/2版的cmd
开始的16位(但尽管如此,一个完全成熟的保护模式的程序的命令喜欢start
).Windows NT继承cmd
OS/2,但Windows NT的Win32version开始了32位。虽然OS/2去的32位于1992年,它的cmd
仍有16位OS/2 1.x程序。- 的
ComSpec
env变量的定义哪些程序的启动.bat
和.cmd
脚本。(从开始WinNT这个默认cmd.exe
.) cmd.exe
是向后兼容command.com
.- 一个脚本,目的是为
cmd.exe
可以叫.cmd
防止意外执行上Windows9x。本文件的扩展也可追溯到OS/2 1.0版和1987年。
这是一个列表中的 cmd.exe
功能,不支持 command.com
:
- 长长的文件(超过8.3格式)
- 历史的命令
- 签完成
- 逃脱的角色:
^
(用于:\ & | > < ^
) - 目录栈:
PUSHD
/POPD
- 整数的算术:
SET /A i+=1
- 搜索/替换/Substring:
SET %varname:expression%
- 命令取代:
FOR /F
(存在之前,已经增强的) - 职能:
CALL :label
为了执行:
如果两个。蝙蝠。cmd版本的剧本(测试。蝙蝠、测试。cmd)是在同一个文件夹和你的剧本没有扩展(试验),可通过默认。蝙蝠版本的剧本将运行,甚至在64位Windows7。的执行顺序的控制是通过PATHEXT环境变量。看看 为了在该命令迅速执行文件 更多的细节。
参考文献:
维基百科: 比较的命令弹
这些答案都是太长了一点,并侧重于交互使用。重要的差异为脚本是:
.cmd
防止无意中执行关于非NT系统。.cmd
使内置命令改变错误级别以上的0的成功。
命令扩展上的默认这两者。蝙蝠。cmd文件,在Windows2000年或以后。
在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的功能非常好 重要。 16位MS-DOS shell Windows附带的(COMMAND.COM) NT专为Windows设计 NT。输入命令时 由这个shell执行,它没有 实际执行它。相反,它 打包命令文本并发送它 到32位CMD.EXE命令shell 执行。因为所有命令都是 实际上是由CMD.EXE执行的( Windows NT命令shell),16位 shell继承了所有的功能和 完整的Windows NT的设施 外壳
RE:显然,调用command.com时有点复杂;
几个月前,在项目过程中,我们必须弄清楚为什么我们想要在CMD.EXE下运行的某些程序实际上是在COMMAND.COM下运行的。 <!>“程序<!>”;问题是一个非常古老的.BAT文件,它仍然每天运行。
我们发现批处理文件在COMMAND.COM下运行的原因是它是从.PIF文件(也很古老)启动的。由于仅通过PIF提供的特殊内存配置设置已变得无关紧要,因此我们将其替换为传统的桌面快捷方式。
从快捷方式启动的同一批处理文件在CMD.EXE中运行。当你考虑它时,这是有道理的。我们花了这么长时间才弄明白的部分原因是因为我们忘记了它在启动组中的项目是PIF,因为它自1998年开始生产。
由于原来的职位是关于使用后果。蝙蝠或.cmd 缀, 不一定是命令 内部 该文件...
一个其他之间的差异。蝙蝠。cmd是,如果两个文件的存在具有相同文件的名称和这两个扩展,那么:
进入 文件名 或 文件名.蝙蝠可以在命令线路运行。蝙蝠文件
运行。cmd文件,你要进入 文件名.cmd
但是,在Windows 7上,BAT文件也存在这种差异:如果您在同一目录中创建文件TEST.BAT和TEST.CMD,并且在该目录中运行TEST,它将运行BAT文件。 / p>
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>
批处理中的所有内容都应该在cmd中工作; cmd提供了一些控制环境的扩展。 此外,cmd由新的cmd解释器执行,因此应该更快(在短文件上不明显)并且在NTVDM模拟的16位环境下运行时更稳定
我相信如果您将ComSpec环境变量的值更改为%SystemRoot%system32 \ cmd.exe,那么文件扩展名是.BAT还是.CMD并不重要。我不确定,但这甚至可能是WinXP及以上版本的默认设置。
稍微偏离主题,但您是否考虑过 Windows脚本主机?你可能会发现它更好。
.cmd和.bat文件执行是不同的,因为在.cmd errorlevel变量中,它可以在受命令扩展影响的命令上更改。这就是真的。
扩展名没有区别。处理文件的COMMAND.COM与CMD.EXE
之间存在细微差别以下是我发现的一个区别:EnableDelayedExpansion
在.cmd
文件中必需。
在.bat
文件的情况下,默认情况下它是隐式的。 ( Windows 10 )
dir *? | find /i "FOOBAR"
if ERRORLEVEL 0 (
set result="found" ) else (
set result="not found" )
echo %result%
这适用于found
,但在line 2
文件的情况下始终<=>。
将<=>更改为以下内容使其按预期工作:
if %ERRORLEVEL% equ 0 (
最后,对于<=>文件,这可以正常工作:
setLocal EnableDelayedExpansion
...
if !ErrorLevel! equ 1 (
...
区别:
.cmd文件在执行前加载到内存中。 .bat文件执行一行,读取下一行,执行该行...
当你执行一个脚本文件然后在它完成执行之前编辑它时,你可以遇到这个问题。 bat文件将被搞乱,但cmd文件不会。