标题: [数值计算] 以下代码,为什么在循环中,加法不生效 [打印本页]
作者: mimixi666 时间: 2018-2-17 17:28 标题: 以下代码,为什么在循环中,加法不生效
- set gateway_ip=192.168.0.1
- set net_ip=www.baidu.com
- set /a count=0
- set file=log.txt
-
- :start
- :: 这里的写法有问题?
- set /a %count%=%count%+1
- echo '开始第%count%次ping' >> %file%
- (ping %gateway_ip% -n "1"|find /i "TTL">nul&&echo 网关连接正常。||echo 网关连接失败。) >> %file%
- (ping %net_ip% -n "1"|find /i "TTL">nul&&echo 外网连接正常。||echo 外网连接失败。) >> %file%
- TIMEOUT /T 5
- goto start
- pause
复制代码
:: 这里的写法有问题?
set /a %count%=%count%+1
作者: mimixi666 时间: 2018-2-17 17:29
大家新年好!!
作者: /zhqsystem/zhq 时间: 2018-2-17 19:29
本帖最后由 /zhqsystem/zhq 于 2018-2-17 19:44 编辑
count变量解析后重新计算是什么
以下代码仅供参考
- set "gateway_ip=192.168.0.1
- call:Network_false_or_true
- pause
- goto:eof
- :Network_false_or_true
- set "Network_Lan="&&set "Network_Wan="&&echo/
- ping %gateway_ip% -n "1"|find /i "TTL=">nul&&set "Network_Lan=true"
- ping baidu.com -n "1"|find /i "TTL=">nul&&set "Network_Wan=true"
- if defined Network_Lan (echo,局域网正常)else (echo,局域网异常,不返回)
- if defined Network_Wan (echo,广域网正常&&goto:eof)else (echo,广域网异常,重新返回&&goto:Network_false_or_true)
- goto:eof
复制代码
作者: slore 时间: 2018-2-17 19:47
:: 这里的写法有问题?
set /a %count%=%count%+1
mimixi666 发表于 2018-2-17 17:28
- rem 第三行为什么用set /a count=0,而不用set /a %count%=0
-
- set /a count=0
- set /a count=%count%+1
- echo %count%
- set /a count+=1
- echo %count%
- pause
复制代码
作者: 慕夜蓝化 时间: 2018-2-18 12:15
你直接用set/a count+=1
计算时不用加%%
作者: l00l00 时间: 2018-2-18 16:57
楼上正解。能简单的就不要复杂化
作者: chenxizhan 时间: 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.
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |