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

[数值计算] 以下代码,为什么在循环中,加法不生效

  1. set gateway_ip=192.168.0.1
  2. set net_ip=www.baidu.com
  3. set /a count=0
  4. set file=log.txt
  5. :start
  6. :: 这里的写法有问题?
  7. set /a %count%=%count%+1
  8. echo '开始第%count%次ping' >> %file%
  9. (ping %gateway_ip% -n "1"|find /i "TTL">nul&&echo 网关连接正常。||echo 网关连接失败。) >> %file%
  10. (ping %net_ip% -n "1"|find /i "TTL">nul&&echo 外网连接正常。||echo 外网连接失败。) >> %file%
  11. TIMEOUT /T 5
  12. goto start
  13. pause
复制代码

:: 这里的写法有问题?
set /a %count%=%count%+1

大家新年好!!

TOP

本帖最后由 /zhqsystem/zhq 于 2018-2-17 19:44 编辑

count变量解析后重新计算是什么
以下代码仅供参考
  1. set "gateway_ip=192.168.0.1
  2. call:Network_false_or_true
  3. pause
  4. goto:eof
  5. :Network_false_or_true
  6. set "Network_Lan="&&set "Network_Wan="&&echo/
  7. ping %gateway_ip% -n "1"|find /i "TTL=">nul&&set "Network_Lan=true"
  8. ping baidu.com -n "1"|find /i "TTL=">nul&&set "Network_Wan=true"
  9. if defined Network_Lan (echo,局域网正常)else (echo,局域网异常,不返回)
  10. if defined Network_Wan (echo,广域网正常&&goto:eof)else (echo,广域网异常,重新返回&&goto:Network_false_or_true)
  11. goto:eof
复制代码
这么好的论坛你上哪找,运行测试环境为6.1.7601-64
注:请遵守互联网信息安全,勿用于非法用途

TOP

:: 这里的写法有问题?
set /a %count%=%count%+1
mimixi666 发表于 2018-2-17 17:28
  1. rem 第三行为什么用set /a count=0,而不用set /a %count%=0
  2. set /a count=0
  3. set /a count=%count%+1
  4. echo %count%
  5. set /a count+=1
  6. echo %count%
  7. pause
复制代码

TOP

你直接用set/a count+=1
计算时不用加%%
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

楼上正解。能简单的就不要复杂化

TOP

原因是, 命令收到的参数是经过命令解释器处理的.

命令实际是由命令解释器调用的,命令的参数也是从命令解释器处获得的. 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

返回列表