 
- 帖子
- 107
- 积分
- 583
- 技术
- 6
- 捐助
- 0
- 注册时间
- 2009-2-22
|
但是
@echo off
setlocal enabledelayedexpansion
color 1f
set "var=00000"
for /l %%a in (1 1 10) do set var=!var!!var!
echo !var!
echo 这里可以运行。
pause
color cf
set var=!var:0= 0 !
echo !var!
echo 这无法运行???
pause
我把set var=!var:0= 0 !这里改为字符串的标准写法set var=!var:"0"= "0 "! 的确可以正确的执行啊。是不是可以这样将,批处理对于非标准的写法,有的能执行,有的不能。比如说rem 写出 ::就可以正常的执行。
但是我做采用了标准写法 可以正常执行,这该怎么解释呢?按“长度”理论,我就没想明白。
还有就是看cmd 的set帮助是这样说的:
------------------------------------------------------------
如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
引号扩起来。
*****在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在--------使用前-------转换成数字。*********
如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
那么它显示该表达式的最后值。该分配的操作符在分配的操作符
左边需要一个环境变量名称。除十六进制有 0x 前缀, 八进制
有 0 前缀的,数字值为十进位数字。因此, 0x12 与 18 和 022
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
因为 8 和 9 不是有效的八进制位数。
---------------------------------------------------------
还有就是如果变量值的长度是8192那就是说浮点数采用的是16为二进制数其中2^13=8192,,这是你上面观点的论据,
但是微软的资料上找不到,你的论据啊。微软的资料上却可以明确找到---转换为数据这样的说发啊。
我是越想越糊涂。不知道怎么采对。
我去看到了。长度理论有道理。
- The maximum individual environment variable size is 8192bytes.
- The maximum total environment variable size for all variables, which includes variable names and the equal sign, is 65,536KB.
- 这两句话 第一句是 最大的单个 环境变量的 大小是 2^13bytes,从原文看,这里不应该包含其它符号。它没有这句话:“which includes variable names and the equal sign”, 从第二句话看,在计算全部变量的大小时要包含其它的符号,因为这时候有:which includes variable names and the equal sign, is 65,536KB. /第二句是:最大的全部 环境变量的大小之和是2^16=65536kb。按这个理论去想你的问题,又该如何解释 加了引号 就可以正常执行呢?
- 我是这么想的不知道对不对:set "var=00000"
for /l %%a in (1 1 10) do set var=!var!!var! 首先机器翻译这句话,第一次,var=2^3个0,因为是延迟环境变量,所以for中,在执行语句前,即机器在解释语句时,可以对环境变量的值进行传递,而对%%这种值机器在解释for时是不可以进行值的传递的, in(1 1 10) 说明要循环10次,每循环一次,var的长度就就增加8,相当于原有长度的基础上乘了2,10循环完,长度就变成了8*(2^10)=2^13=8192,所以你的程序,没有超过规定的长度,认为就是你的书写有错误,掉了引号。批处理这中松散的语句,不严格的写法,时对时不对。 - 后来我把set "var=0000" 改为了set "var=000" ,程序中的其它不变,发现可以运行,这说明,我最初对英语
- The maximum individual environment variable size is 8192bytes.的理解有误,这句话应该包含第二句话里面的
which includes variable names and the equal sign,这句话,如果算上其它的符号,变量真的是超过范围了。这正好解释了把把set "var=0000" 改为了set "var=000" 可以执行的原因了。
因为 算上name和equal 变量的初始长度是6,不含引号,机器解释for时,var的长度是12,10次循环后长度是
12*(2^10)=12288>8192,所以报错。
不过 ,还是得说说解释解释为什么 set var=!var:0=0 ! 改为这样set var=!var:"0"="0 "!又可以了
我明白了 ,长度理论是对的。支持!!!!!!
[ 本帖最后由 myzwd 于 2009-2-24 13:16 编辑 ] |
|