找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 53631|回复: 5

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

[复制链接]
发表于 2010-4-26 11:44:15 | 显示全部楼层 |阅读模式
悬赏100已解决
在教程区的的教程帖《批处理文件是什么?》看到这么一句话
由于.bat文件是基于16平台下的程序,在Windows NT及以后的32位中运行时偶尔会出现堆栈溢出之类的错误,所以建议在新的系统中尽可能的采用.cmd扩展的批处理文件代替.bat的文件。

不知道有什么依据没有?

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

最佳答案

查看完整内容

http://en.wikipedia.org/wiki/Batch_file#Differences http://groups.google.com/group/m ... sg/ad9066638815812c [ 本帖最后由 ___ 于 2010-4-26 21:40 编辑 ]
发表于 2010-4-26 11:44:16 | 显示全部楼层
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 编辑 ]
 楼主| 发表于 2010-4-26 23:45:39 | 显示全部楼层
我这里访问不到GoogleGroup的链接
你能把完整内容引用过来吗?
 楼主| 发表于 2010-4-28 14:55:05 | 显示全部楼层
根据Usernet里的讨论信息也只能确认
PATH/APPEND/PROMPT/SET/ASSOC等命令
在.cmd和.bat中有关于errorlevel的不同表现
而这些命令除了assoc之外
其主要效果都是修改环境变量
所以大概这个问题与环境变量脱不了干系

经过对cmd.exe的静反和跟踪
仅发现处理.bat和.cmd的差异代码两处
而且都没有发现实质上的差别
仅仅只是对寄存器FLAG的影响略有不同
发表于 2011-3-6 21:19:31 | 显示全部楼层
经典。顶一下。。。。
 楼主| 发表于 2012-3-17 17:07:58 | 显示全部楼层
补充确认一些信息

包括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的特性
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-10-10 19:22

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表