Board logo

标题: [数值计算] 批处理变量延迟扩展set命令去掉/a为何出错? [打印本页]

作者: luonanyun    时间: 2012-5-18 16:37     标题: 批处理变量延迟扩展set命令去掉/a为何出错?

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a b = 0
  4. for %%a in (*) do (
  5. set /a b=b+1
  6. echo !b! %%a
  7. )
  8. pause
复制代码
这样能正常显示当前文件夹文件  结果如下:
[attach]5270[/attach]
但是去掉“set /a b=b+1”中的/a参数  结果如下:
[attach]5271[/attach]
不是说在变量扩展的时候b已经等于0了么  为什么去掉/a参数后会出现这个结果啊 ?
作者: nasaer    时间: 2012-5-18 17:19

set 命令只有加上开关/a命令才能进行算术计算!
做了一个小实验:
  1. @echo off
  2. set a=1+2
  3. set b=1+a
  4. set c=a+1
  5. set /a d=1+a
  6. set /a e=1+b
  7. set /a f=1+c
  8. echo %a%,%b%,%c%,%d%,%e%,%f%
  9. pause>nul
复制代码
没有加开关/a时,set将表达式赋给了变量,而没有进行运算。
即使如d、c、e的赋值,运算时也是将表达式的的第一个字符进行相关运算。
个人理解,有错误之处请指正!
作者: luonanyun    时间: 2012-5-18 17:26

我说的不是运算的问题!
是变量延迟扩展的问题!
按照变量延迟扩展来说的话 第一列应该全是0啊  不知道为什么全是b+1!
不过还是谢谢你的回答!  呵呵!
作者: cjiabing    时间: 2012-5-18 18:47

set /a b = 0
set /a b=b+1
一样吗?
作者: powerbat    时间: 2012-5-18 18:48

set b=b+1
凭什么要进行变量扩展?又不是%b%或!b!。如果扩展了才是怪事,你的cmd.exe可能被病毒替换了。
作者: nasaer    时间: 2012-5-18 22:27

回复 4# cjiabing


   感觉若表达式第一个字符不为数字,则用set /a 时默认赋值为0,所以set /a b=a+1 和 set /a b=1+a结果不一样
前者是0,后者是1
作者: cjiabing    时间: 2012-5-19 01:20

回复 6# nasaer


C:\Documents and Settings\甲兵>set var=123
C:\Documents and Settings\甲兵>echo %var%
123
C:\Documents and Settings\甲兵>set var    =abc
C:\Documents and Settings\甲兵>echo %var%
123
C:\Documents and Settings\甲兵>echo %var    %
abc
作者: gawk    时间: 2012-5-19 06:35

把你的代码中等号两边的空格全部删掉
作者: fatcat    时间: 2012-5-19 11:54

回复 1# luonanyun

2 楼 nasaer 和 5 楼 powerbat 都解释了楼主的疑问:

1. 非 set /a 形式之后, 不用 %var% 或 !var! 的 形式, 变量是不会被扩展的, 或者说不会被解释成一个变量,
而只是一个字符串 "var".
2. 无论是否 开启 变量延迟扩展, set /a 都会把 赋值等号 右边的表达式中的 非数字(0~9)开头的字符串操作数 尝试解释成 变量, 进而获取可能的值以参加数值运算;
如果 存在 变量名以数字开头的情形, 例如: 1var, 仍然可以用 %1var% 或 !1var! 的 形式获取该变量的数值参与数值运算.
3. 8 楼 gawk 所述赋值号 左右 的 空格, 在 set /a 下仍可以正常赋值, 例: set /a v=23 和 set /a v  =  23 结果是一样的.
作者: 悬崖之树    时间: 2012-12-5 21:29

回复 9# fatcat
开启变量延迟扩展后,set /a a=b+2 这里的“b” 是被解释成 !b!还是 %b% ?




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2