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

命令实际是由命令解释器调用的,命令的参数也是从命令解释器处获得的. DOS的命令解释器在向命令传递参数之前会进行一些处理,其中就有一个步骤
是将形如%var%的东西扩展为变量var中存储的值,(如果变量var不存在,那么扩展结果是空串)

例如,
set pa=a
set %pa%=hello
echo pa=%pa%, a=%a%
执行结果为
pa=a, a=hello

实际上,第二句中,set实际看到的参数是 a=helloe
原因是命令处理器调用set之前,已经将%pa%扩展为pa的值 a,
这条命令实际相当于 set a=hello
而set压根不知道有%pa%这回事, 所以第二条语句的实际效果是将名为a的变量的值设为hello

对于语句
set /a %count%=%count% + 1
在第一次循环中,set命令实际收到的参数是
        /a 0=0+1
set命令根本没有见到count这个变量, 所以这条语句没有实现预期的目的.


下面的语句是等价的,结果都是使count的值增加1
set /a count=%count%+1
set /a count=count+1
set /a count+=1

对于第一条语句,在预设count=0的情况下,相当于
set /a count = 0 + 1
/a count = 0 + 1 是set实际收到的参数,根据set的语法,/a扩展下,set将 0+1的计算结构赋给变量count

对于第二条语句, set实际收到的参数就是 /a count=count+1,
set命令的帮助信息中有这样一段话
        "在表达式中的任何非数字字符串键作为环境变量名称,这些环境变量名称的值已在使用前转换成数字。如果指定了一个环境变量名称,但未在当前环境中定义,那么值将被定为零。这使您可以使用环境变量值做计算而不用键入那些 % 符号来得到它们的值。"
       
所以, set 在表达式 count+1 中看到 count 后,发现它不是数字,就把它当作环境变量名,然后尝试取它的值, 最后才进行计算.

第三条语句中, += 是 set 的/a扩展下支持的运算符之一, 依 += 的定义, 第三条语句实际等价于于第二条语句.
还可以这样用,
set a=2
set /a a+=a
按照+=的定义, 语句 set /a a+=a  相当于 set /a a = a + a, 最后a的值是4.

TOP

返回列表