[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
已解决

[其他] .bat与.cmd到底有何区别

悬赏金额: 100

在教程区的的教程帖《批处理文件是什么?》看到这么一句话
由于.bat文件是基于16平台下的程序,在Windows NT及以后的32位中运行时偶尔会出现堆栈溢出之类的错误,所以建议在新的系统中尽可能的采用.cmd扩展的批处理文件代替.bat的文件。

不知道有什么依据没有?

在自己的测试中
.bat中的set成功后不修改errorlevel
而.cmd中的set则会将errorlevel置0
这说明两者虽然同样都是执行Set命令
可他们的“后处理”应该有所区别
这应该可以部分说明二者的“命令解释器”有所区别
但我想应不会是16位与32位的区别

最佳答案 qzwqzw
补充确认一些信息

包括ASSOC、FTYPE、APPEND、PATH、PROMPT、SET等6个命令
在.bat和命令行环境下与.cmd环境下的执行表现不尽相同

在.cmd环境下
这些命令无论是否成功执行
均会设置相应的errorlevel

在.bat和命令行环境下
这些命令只有执行出错时才会
设置相应的errorlevel

这也是windows的.bat和.cmd脚本的唯一区别
这个逻辑依靠的是对扩展名的判断 不区分大小写
它会将判断结果置为一个变量
该变量默认值是0
在第一次调用批处理时会置为1,表明是.bat类型
在发现脚本扩展名是.cmd时设置为2,表明是.cmd类型

在执行相关命令时
将判断该变量是否为2
如果是2则直接设置errorlevel为命令的执行结果
如果非2则判断返回结果是否为0
   如果为0则不设置errorlevel
   否则设置errorlevel为相应的值

如果在脚本中嵌套调用脚本
无论几级嵌套
无论是call调用还是直接调用
都不再判断脚本类型
对应变量始终为第一次设置的值


在.cmd中调用.bat会发生.cmd的特性
在.bat中调用.cmd会发生.bat的特性
天的白色影子

补充确认一些信息

包括ASSOC、FTYPE、APPEND、PATH、PROMPT、SET等6个命令
在.bat和命令行环境下与.cmd环境下的执行表现不尽相同

在.cmd环境下
这些命令无论是否成功执行
均会设置相应的errorlevel

在.bat和命令行环境下
这些命令只有执行出错时才会
设置相应的errorlevel

这也是windows的.bat和.cmd脚本的唯一区别
这个逻辑依靠的是对扩展名的判断 不区分大小写
它会将判断结果置为一个变量
该变量默认值是0
在第一次调用批处理时会置为1,表明是.bat类型
在发现脚本扩展名是.cmd时设置为2,表明是.cmd类型

在执行相关命令时
将判断该变量是否为2
如果是2则直接设置errorlevel为命令的执行结果
如果非2则判断返回结果是否为0
   如果为0则不设置errorlevel
   否则设置errorlevel为相应的值

如果在脚本中嵌套调用脚本
无论几级嵌套
无论是call调用还是直接调用
都不再判断脚本类型
对应变量始终为第一次设置的值


在.cmd中调用.bat会发生.cmd的特性
在.bat中调用.cmd会发生.bat的特性
天的白色影子

TOP

经典。顶一下。。。。
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

根据Usernet里的讨论信息也只能确认
PATH/APPEND/PROMPT/SET/ASSOC等命令
在.cmd和.bat中有关于errorlevel的不同表现
而这些命令除了assoc之外
其主要效果都是修改环境变量
所以大概这个问题与环境变量脱不了干系

经过对cmd.exe的静反和跟踪
仅发现处理.bat和.cmd的差异代码两处
而且都没有发现实质上的差别
仅仅只是对寄存器FLAG的影响略有不同
天的白色影子

TOP

我这里访问不到GoogleGroup的链接
你能把完整内容引用过来吗?
天的白色影子

TOP

http://en.wikipedia.org/wiki/Batch_file#Differences
Differences

The only known difference between .cmd and .bat file processing is that in a .cmd file the ERRORLEVEL variable changes even on a successful command that is affected by Command Extensions (when Command Extensions are enabled), whereas in .bat files the ERRORLEVEL variable changes only upon errors.


http://groups.google.com/group/m ... sg/ad9066638815812c
The differences between .CMD and .BAT as far as CMD.EXE is concerned are:

With extensions enabled, PATH/APPEND/PROMPT/SET/ASSOC in .CMD
files will set ERRORLEVEL regardless of error. .BAT sets ERRORLEVEL
only on errors.

[ 本帖最后由 ___ 于 2010-4-26 21:40 编辑 ]

TOP

返回列表