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

回复 7楼 的帖子

关于第5点,我认为可能和预处理有关系。
set a=!a:0=1!,预处理时并不展开变量(执行时才进行替换操作),所以输入行长度为该行语句字面长度13。
set a=%a:0=1%,预处理时要先对变量进行展开,展开后的长度显然超过了命令行允许的长度(这个长度应该是8192)。

[ 本帖最后由 zqz0012005 于 2009-2-22 05:22 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 7楼 的帖子

至于第2点中推断的结论“变量名和等号都占字节”,可以进一步验证:
随风的一个测试代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1 1 10000) do (
  4.   set m=a!m!||(echo %%a&pause)
  5.   )
  6. pause
复制代码
如果把变量名换成逗号“,”,利用命令行的空子,写成如下形式:
set,=a!,!||(echo %%a&pause)
则结果为8191。
逗号有多重意思,一是作为命令与参数之间必要的分隔符,二就是作为变量名。而系统有时对这种多样性处理不完善,最后的结果认为set,=a!,!语句中没有变量名,于是给变量值多分配了一位。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

关于取最大长度的一个题外话(先写在这里,整理时再分开或删除吧)
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1 1 8193) do (
  4.   set,=a!,!||(echo !,!&echo !errorlevel!&pause)
  5. )
  6. pause
复制代码
如果换成以下形式
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1 1 8193) do (
  4.   set,=a!,!
  5.   if !errorlevel! neq 0 (echo !,!&echo !errorlevel!&pause)
  6. )
  7. pause
复制代码
即将||改成errorlevel的形式,结果竟然不同。

这好像是for语句内部errorlevel返回值的问题。以前说过for本身是一个特殊的命令解释程序,但不知这一点有没有讨论过(我以前也发过,但讨论的人不多,我当时的分析也比较混乱,有时间再好好整理一下)。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

如果用echo命令将变量写到文本中,
!m!长度是8190,而文本中的字符是8189个“a”+2字节的回车换行符(CrLn),结果共8191个字节。
!,!长度是8191,而文本中的字符是8190个“a”+1个回车符(Cr),结果也是共8191个字节。

已经讨论过,微软的说法中“字节(byte)”是不准确的,实际可以为字符。
如果把字母a换成汉字比如“人”,则
!m!长度是8190,而文本中的字符是8189个“人”+2字节的回车换行符(CrLn),结果共(8189*2+2)个字节。
!,!长度是8191,而文本中的字符是8190个“人”+1个回车符(Cr),结果共(8190*2+1)个字节,比上面多1个字节。

[ 本帖最后由 zqz0012005 于 2009-2-22 06:47 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

是变量类型不匹配还是输入行太长,把set "var=00000"中的0换成字母不就知道了吗?

根本不存在什么类型不匹配的问题。

而set var=!var:"0"=" 0 "! 显然没有进行任何替换操作。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 27楼 的帖子

(cmd的set帮助说:它们都是要转换为数值计算的。)

请注意上下文!那说的是使用/a开关进行数学运算时才要转换。
set /?
...
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:
...
如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
引号扩起来。在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
来得到它们的值。...


这里有一个以前说过多次的,常常让新手误解的地方:微软总喜欢把bat中的变量称为环境变量,很容易与系统环境变量这一概念混淆。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 26楼 的帖子

注意还要受到总的输入行长度的限制。
set var=value
即:set命令+空格[+引号]+变量名+等号+变量值[+引号]
这一条命令的总长度不能超过8192。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

http://technet.microsoft.com/en-us/library/bb490954.aspx

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

实际上,第一句话后面也应该加上: which includes the variable name and the equal sign.

即:The maximum individual environment variable size is 8192bytes, which includes the variable name and the equal sign.
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

这个帖子的标题是不是该一下?

“变量的最大长度问题”比较合适
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表