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

回复 1楼 的帖子

掉了过引号
@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=00000"这句里面的00000是字符串常量,set var=!var:0= 0 !里面电脑把它读成了数字,是数据类型不匹配。所以运行不了。改为 set var=!var:“0”=“ 0” 就正常了。!
1

评分人数

TOP

但是

@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 编辑 ]

TOP

回复 1楼 的帖子

我的例子:
@echo off
set tt
setlocal enabledelayedexpansion

for /l %%1 in (1 1 2323) do (

set tt=!tt!%%1)
set tt
pause
结果是tt为:123...2323,这是从1到2323的拼接。
这里里面的1位数有:9个
          2位数有:90个
          3位数有:900个
          4位数有:1324个
这样tt变量的总长度=9+2*90+3*900+4*1324=8185
------------------
还有7个字节就不知道跑哪去了。因为把tt换成ttt还是同样的结果。

The maximum individual environment variable size is 8192bytes.
最大的当环境变量的大小是8192b。我想这句话里面不应该包含名和等号才能解释上面的把tt换成ttt结果相同这个现象。因为它已经预留了给那些特殊符号的起指示作用的空间。值是不知道它是怎么留的,留的多少。
我猜测是7个字节。但是不能以上面一个例子来肯定。
The maximum total environment variable size for all variables, which includes variable names and the equal sign, is 65,536KB.
最大的全部环境变量的大小是,包括名字,等号,为65536kb
在计算全部变量的总大小时才考虑等号和名。


晕。管它是多少,反正关系不大。

[ 本帖最后由 myzwd 于 2009-2-24 19:48 编辑 ]

TOP

回复 23楼 的帖子

我试过了 你讲的完全对
我是用下面的例子做的
set tt=123a123
set tt=%tt:a=b%
-----------------------------
set tt=%tt:"a"="b"%
------------------------
结果是前一种有变化,后一种有变化。因为它们在运用时转换为数值的值不一样。
(cmd的set帮助说:它们都是要转换为数值计算的。)

TOP

回复 29楼 的帖子

你这么一说好象可以把我差的那7b找回来,但是我把tt换成ttt还是一样的结果,
所以我猜测是把那7b留来记录set命令代码了,包含你提到的=,名等等。
其实 ,弄的这么晕,全怪微软。

[ 本帖最后由 myzwd 于 2009-2-25 12:01 编辑 ]

TOP

返回列表