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

[原创] 批处理中set /a 极大的误区

关于 set /a 中极大的误区,几乎所有的批处理教材中都有这个错误,误导了至少80%的人!

这句:set /a a+=1
一切教学资料上的解释都是:与
set /a a=%a%+1
相等同!

那么我们做一个有趣的实验:
  1. @echo off
  2. set a=0
  3. for /l %%b in (1,1,5) do set /a a+=1
  4. echo a=%a%
  5. pause
复制代码
得到的输出是:
a=5
请按任意键继续. . .

那么根据教材所说的,等同于 set /a a=%a%+1 ,我们测试一下效果:
  1. @echo off
  2. set a=0
  3. for /l %%b in (1,1,5) do set /a a=%a%+1
  4. echo a=%a%
  5. pause
复制代码
得到的输出是:
a=1
请按任意键继续. . .

教材和资料都错了!
正确的解释应是:set /a a+=1 与 set /a a=a+1 对等!
多了两个%括住就造成的极大的错误!

正确对等的代码是:
@echo off
set a=0
for /l %%b in (1,1,5) do set /a a=a+1
echo a=%a%
pause


输出:
a=5
请按任意键继续. . .

当然,无聊的话下面这样写也是对等的,当然及不简便:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set a=0
  4. for /l %%b in (1,1,5) do set /a a=!a!+1
  5. echo a=%a%
  6. pause
复制代码
开启变量延迟,用!括住也是正确的



那么,请大家看完这篇东西之后,记住不要再犯同样的错误,同样不要再去误导他人:
set /a a+=1
不等于
set /a a=%a%+1
应等于
set /a a=a+1
2

评分人数

回复 1# defanive


    这个复合运算符隐含延迟变量的功能。就像java中复合运算符隐式一个强制类型转换
我就是我,不一样的烟火!

TOP

回复 11# applba


    大侠说到点子上了。细心点发现
我就是我,不一样的烟火!

TOP

这是延迟变量的问题,而不是什么教程乱讲。若考虑延迟变量应该写为set /a a+=1等价于set /a a=!a!+1,如果没有开启本地自动化操作则是错误的语句。所以set /a a=%a%+=1并没有错误。

TOP

QAQ LZ不要误导别人啊,吓得差点误解了我习惯了3年的知识
这是因为变量延迟的问题,这和所谓的%%没有关系
你只需要加一个setlocal enabledelayedexpansion,把%换成!就好了,QAQ

TOP

谢谢 分享     

TOP

set /a x=a,a=b,b=x
可以交换a和b的位置,你怎么看?

TOP

预处理机制而已。

TOP

我觉得官方解释不能说错,只是在批处理有些特别的地方罢了。开启变量延迟就可以了,说明它解释还是对的。

TOP

有心提醒了。   心意领会了
莫求昨天无悔,但愿今日无愧。

TOP

for中的%a%只会应用上一个语句set设置的环境变量
还是变量延迟高的鬼嘛!
智慧是创造财富的唯一保障!

TOP

哈哈,我比较怕数学,没有上过当,不过现在经常用到set /a a+=1,其它两个用得少。
写教材一定要自己亲自测试过代码才可以引用,否则害人不浅!~
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

应该是变量延迟的问题

TOP

set命令能够自行识别变量名,并完成变量值的替换。
还有一个用法类似,if defined varname,也不需要%。

TOP

这个帖子也许是楼主刚接触批处理的时候写的,大家淡定了。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表