标题: [其他] [讨论]批处理for命令中tokens最多截取31位 [打印本页]
作者: Hello123World 时间: 2011-10-7 17:47 标题: [讨论]批处理for命令中tokens最多截取31位
偶然发现的一个现象。
1.txt中合计48段,47个-- 17-11-15-13-11-19-21-7-9-14-14-8-11-14-18-12-7-8-11-2-17-7-16-18-17-12-13-15-15-16-11-14-13-14-16-15-16-14-11-14-12-15-10-18
复制代码
- @echo off
- for /f "delims=- tokens=31" %%i in (1.txt) do echo %%i %%j
- pause
复制代码
显示11,%j- @echo off
- for /f "delims=- tokens=32" %%i in (1.txt) do echo %%i %%j
- pause
复制代码
不显示。
经测试tokens最多截取,2的5次幂-1,即31段。
是不是因为32位的系统,所以就是32-1?64位系统可能就是,63段?
作者: wc726842270 时间: 2011-10-7 17:50
如果一个FOR不够用就用2个或更多好了。tokens的个数虽然有限,但是可以嵌套
作者: CrLf 时间: 2011-10-7 18:06
经测试,64x win7 下的 tokens 上限同样是 32
作者: Hello123World 时间: 2011-10-7 18:16
回复 3# CrLf
你用的是64位的系统
作者: Hello123World 时间: 2011-10-7 18:17
本帖最后由 Hello123World 于 2011-10-7 18:26 编辑
论坛又禁止发表情了
作者: CrLf 时间: 2011-10-7 18:32
回复 4# Hello123World
没,用别人的。
作者: 601997526 时间: 2011-10-7 19:09
这个我很早以前就已经发现了,当时我还在群里问:字母只有26个,可tokens却有31个,那剩下的要怎么来全付值呢
作者: CrLf 时间: 2011-10-7 19:34
本帖最后由 CrLf 于 2011-10-7 19:39 编辑
对了,寒夜Boss 说过 tokens 中无论是否使用* ,cmd 都会为其保留一个令牌,若开启则可以使用第 32 个令牌。若使用的令牌数(含*)超过 32 则相当于只设置了一个 *。
至于如何使用连续的32 个令牌,我做过测试,令牌的先后次序按照字符编码排序,也就是说非字母数字的字符也可用(实例见俺签名档),包括汉字。后来看发现了 plp626 的精华帖中早就注明了…
作者: Hello123World 时间: 2011-10-7 19:51
回复 7# 601997526
这个问题问的有水平,也有意思
作者: Hello123World 时间: 2011-10-7 19:55
回复 8# CrLf
字符编码排序 是指按照ascii码排序?
作者: HAT 时间: 2011-10-7 19:57
你不是说要深挖吗?挖的还不够深,你得朝着两三年之前挖
http://bbs.bathome.net/thread-3704-1-1.html
http://bbs.bathome.net/thread-5548-1-1.html
作者: Hello123World 时间: 2011-10-7 19:59
- @echo off
- For /f "tokens=1-2 delims=-" %%? in (1.txt) do echo %%? %%@
- pause
复制代码
还真是按照ascii码排序的,呵呵。
作者: Hello123World 时间: 2011-10-7 20:03
回复 11# HAT
恩,确实挖的还不够深,还得努力。
作者: Hello123World 时间: 2011-10-7 20:03
奇怪啊,我怎么发不出表情?
作者: CrLf 时间: 2011-10-7 20:23
补上那个链接:
http://bbs.bathome.net/viewthrea ... hlight=for%2Bplp626
可以参考顶楼内容
以下为单字节字符的可用性测试文件:
::其中标注为出错的表明测试脚本在对其进行预处理时发生问题,而不代表此字符不用于令牌,而显示“不能成为首个参数变量”的表明该字符不可作为 [%%A] 出现,应为它们是 for 命令的默认分隔符或双引号,无法在 for 中被当成普通字符进行预处理操作,但我们可以把他们用作 [%%B] 或其他位于 [%%A] 之后的令牌名(可行,但不推荐)
也就是说,既可以使用汉字作为连续的 31 个令牌名,也可以使用单字节字符(比如 0x63~0x127 这个范围都是连续的可用令牌名)
作者: wc726842270 时间: 2011-10-7 20:42
楼上的链接很给力啊,又OUT了。是啊,“创新带来无限可能”
作者: CrLf 时间: 2011-10-7 21:37
回复 12# Hello123World
是按 Unicode 排,见 15 楼链接,保存为 Ansi 与 Unicode 格式的文本各一,再 debug 一下就知道了~不过话说回来,0x128 之前都是完全一样的。
顺便说一句,记得寒夜胸(怎么又是他...)提到过 cmd 内部是以 Unicode 运行的,仅在与用户交互时使用 Ansi,不过我当时像听故事一样,没有问清该说法是推论还是猜测...
作者: cjiabing 时间: 2011-10-7 23:10
回复 17# CrLf
帅锅,好崇拜你的寒夜胸哦!~
呵呵,签名好炫!~
作者: Hello123World 时间: 2011-10-7 23:42
我对寒夜sama的敬仰,一直犹如滔滔江水延绵不绝,又如黄河泛滥一发不可收拾
作者: lxzzr 时间: 2011-10-8 00:46
都不看老帖....
这是“批处理阶段教程奥运最终版[英雄出品].CHM”原话:- 大家都知道for命令中有一个tokens,它的功能想必大家也明白。
- 我在这里要说的是它的取值范围,tokens占用了4位存储单元,这4
- 位所能表示的最大二进制数为1111,转换为十进制为31,即tokens
- 的取值范围是0~31。
复制代码
“for的tokens细节或者缺陷”来自“中国DOS联盟批处理室经典帖子合集2008A” 地址:http://www.bathome.net/thread-3527-1-6.html
当然,没有绝对!!!
作者: HAT 时间: 2011-10-8 01:28
回复 20# lxzzr
1111是怎样转换成31的?
作者: Hello123World 时间: 2011-10-8 13:32
8+4+2+1=15……
11111?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |