- 帖子
- 4
- 积分
- 15
- 技术
- 0
- 捐助
- 0
- 注册时间
- 2018-2-18
|
7楼
发表于 2018-2-19 01:16
| 只看该作者
原因是, 命令收到的参数是经过命令解释器处理的.
命令实际是由命令解释器调用的,命令的参数也是从命令解释器处获得的. 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. |
|