标题: [数值计算] 批处理变量延迟扩展set命令去掉/a为何出错? [打印本页]
作者: luonanyun 时间: 2012-5-18 16:37 标题: 批处理变量延迟扩展set命令去掉/a为何出错?
- @echo off
- setlocal enabledelayedexpansion
- set /a b = 0
- for %%a in (*) do (
- set /a b=b+1
- echo !b! %%a
- )
- pause
复制代码
这样能正常显示当前文件夹文件 结果如下:
[attach]5270[/attach]
但是去掉“set /a b=b+1”中的/a参数 结果如下:
[attach]5271[/attach]
不是说在变量扩展的时候b已经等于0了么 为什么去掉/a参数后会出现这个结果啊 ?
作者: nasaer 时间: 2012-5-18 17:19
set 命令只有加上开关/a命令才能进行算术计算!
做了一个小实验:- @echo off
- set a=1+2
- set b=1+a
- set c=a+1
- set /a d=1+a
- set /a e=1+b
- set /a f=1+c
- echo %a%,%b%,%c%,%d%,%e%,%f%
- 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 |