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

[数值计算] 批处理变量延迟扩展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参数后会出现这个结果啊 ?

回复 9# fatcat
开启变量延迟扩展后,set /a a=b+2 这里的“b” 是被解释成 !b!还是 %b% ?
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

回复 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 结果是一样的.

TOP

把你的代码中等号两边的空格全部删掉

TOP

回复 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
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 4# cjiabing


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

TOP

set b=b+1
凭什么要进行变量扩展?又不是%b%或!b!。如果扩展了才是怪事,你的cmd.exe可能被病毒替换了。

TOP

set /a b = 0
set /a b=b+1
一样吗?
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

我说的不是运算的问题!
是变量延迟扩展的问题!
按照变量延迟扩展来说的话 第一列应该全是0啊  不知道为什么全是b+1!
不过还是谢谢你的回答!  呵呵!

TOP

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的赋值,运算时也是将表达式的的第一个字符进行相关运算。
个人理解,有错误之处请指正!

TOP

返回列表