[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
set /a居然能够兼容汉字符及其他非数值字符,才发现原来可以这样:
set /a a=汉字,b=z,c=#,d=_
只是都默认值为0。
***共同提高***

TOP

回复 16楼 的帖子

set /? 中有说:
在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。


这个很有意思:
  1. @echo off
  2. set v=,1
  3. set /a v=v
  4. echo %v%
  5. pause  变量 v 的值变为 0
  6. set v=1,
  7. set /a v=v
  8. echo %v%
  9. pause  变量 v 的值变为 1
复制代码

TOP

回复 14楼 的帖子

合计的结果有问题吧?
C:\Test>type test.bat
@echo off&setlocal enabledelayedexpansion
set "tab=   " rem请将#替换为tab键
for /f "delims=" %%a in (a.txt) do (
     echo %%a&set /a m=0
     set "str=%%a"&set "str=!str:%tab%=%tab%0!"
     for %%b in (!str!) do (
          set /a m+=1
          set "var=%%b"&set "var=!var:~1!"
          if not defined var set /a var=0
          set /a _!m!+=!var!
     )

)
set "_1=合计"
for /l %%a in (1,1,%m%) do (
     set /p=!_%%a!<nul
     if %%a neq %m% set /p= <nul
)
pause>nul

C:\Test>test.bat
姓名    第一项作业      第二项作业      第三项作业      第四项作业
甲      30      63      83      86
乙      27      93      98      22
丙      94      45      77
丁      14              94      78
戊              81      25      57
己      62      58      75
庚      70      49      10      47
辛      98                      2
壬      95      10      81      12
癸      64      29      45      57
合计 35 46 44 24
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回楼上,没有问题啊,你再运行下看
***共同提高***

TOP

回复 17楼 的帖子

  1. @echo off
  2. set m=1,2
  3. set /a n=%m%
  4. echo %n%
  5. set /a n=m
  6. echo %n%
  7. pause
复制代码
有点意思。
set /a n=%m%,即set /a n=1,2,其中,是逗号运算符。逗号表达式的值取最后一个子表达式的值。
  1. set m=2+2
  2. set /a n=m
  3. set "2+2=1" 设置变量2+2
  4. set /a n=m
  5. pause
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 20楼 的帖子

17 楼不是因为“逗号是运算符”。换成这样也可以:
  1. @echo off
  2. set v=bathome1
  3. set /a v=v
  4. echo %v%
  5. pause  变量 v 的值变为 0
  6. set v=1bathome
  7. set /a v=v
  8. echo %v%
  9. pause  变量 v 的值变为 1
  10. set v=1bathome
  11. set /a v=%v%
  12. echo %v%
  13. pause  而这样会出错
复制代码

[ 本帖最后由 tireless 于 2009-6-24 12:33 编辑 ]

TOP

我是说set /a n=1,2是逗号运算符。

而你的例子再一次说明了变量名以数字开头的弊端。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

在表达式中的任何非数字字符串键作为环境变量
看来这个也是需要深入理解的。
把 set /a expression 简化成下面的形式,以便于分析:
set /a n=表达式
注意这里的表达式是预处理后的,比如set /a n=%var%,是先把变量var展开再处理。
而set /a n=var,是不需要预处理的(或者说该语句预处理后是它本身)。至于对字符串var的处理,是set自己的功能,而不是预处理的功劳。

1、如果表达式中出现了非数字、非运算符的字符串,则set将这些字符串作为变量名,遵循下面两点:
(1)如果这些字符串是跟在数字后面,则变量名识别会出现问题:set不把它作为变量名,而是试图解析为某种进制中的数字常数。
如,set /a n=12bat,“bat”这些字符不是10进制的常数0-9。
甚至,set /a n=0xbad,这种十六进制形式其实也可以这样理解:首先当然不把xbad作为变量名,而是作为八进制的数字常数,事实上八进制的数字常数只能是0-7,但碰巧第一个字母是x,set转而把它识别为十六进制。

(2)如果字符串后面有数字,这些数字将不再是“数字”,而是变量名的一部分。如果后面是运算符,仍然是运算符。
如,set /a n=bat12,不是%bat%12,而是%bat12%。
而set /a n=bat+12,就是%bat%+12。

2、如果变量未定义,或变量指向的值是非数字,直接替换为0。
如,set var=bathome&set /a m=var, n=undefined,m、n的值都是0。

3、如果变量指向的值包含数字,则从左边开始,如果是数字字符(0-9),则被保留,直到遇到非数字字符,非数字及以后的内容直接被舍弃。
如,set var=12+3&set /a n=var,n的值是12。

[ 本帖最后由 zqz0012005 于 2009-6-24 13:49 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表