中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-16 06:19
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » For 命令中tokens参数的使用求教? 查看 4,758 回复 29
楼 主 For 命令中tokens参数的使用求教? 发表于 2006-10-25 04:16 ·  中国 广东 广州 白云区 电信
初级用户
积分 22
发帖 7
注册 2006-10-25 03:39
UID 68145
性别 男
状态 离线
因为要批量建文件夹,学习了一下FOR的使用,但任务完成了,FOR的学习却没法完成,被TOKEN绊了个跟头~~~


在命令行中打for /?出来的解释看不在懂,请问大家一下:

eol=c - 指一个行注释字符的结尾(就一个) ________这个俺懂,指明什么是注释行,忽略过
skip=n - 指在文件开始时忽略的行数。 _________这个也明白
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。___________这个似乎明白,在试验中,发现似乎是指从指定的字符处开始干活
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的格式为一个范围。通过 nth 符号指定 m符号。如果字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后,分配并接受行的保留文本。 _____________这个就完全糊涂了,越试越糊涂,一团浆糊.


tokens=x,y,m-n

tokens的使用参数,我不明白x,y,m-n都是什么作用,哪位达人给解释一下?

如果您有时间,请向下接着看,如果没时间,就此指点两句也行,谢谢了先.

这个是我用来做试验的文本文件t1.txt的内容

为a工了挽住那转逝的感触,
我a不得不提起了笔,
写a下这禁忌之爱的点点滴滴。
或a许阴暗,或许残忍,或许另类,
但a谁也不能否认这其间人物最真的善良与无私。
愿a大家陪着他们走到那注定的终点。



以下是试验过程
E:\>for /f "eol=为 tokens=2 delims=a " %1 in (t1.txt) do @echo %1
不得不提起了笔,
下这禁忌之爱的点点滴滴。
许阴暗,或许残忍,或许另类,
谁也不能否认这其间人物最真的善良与无私。
大家陪着他们走到那注定的终点。

E:\>for /f "eol=为 tokens=1 delims=a " %1 in (t1.txt) do @echo %1






E:\>for /f "eol=为 tokens=3 delims=a " %1 in (t1.txt) do @echo %1

E:\>
2 发表于 2007-01-01 05:08 ·  中国 山东 青岛 中移铁通
初级用户
积分 63
发帖 33
注册 2006-12-04 05:49
UID 72514
性别 男
状态 离线
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
当tokens后指定了多个符号时,后面的变量也会进行扩充,比如下例:

for /f "tokens=1-4 delims=- " %a in ('date /t') do echo %a:%b:%c:%d

运行后我们得到"2006:12:29:星期五".其中,这个 for 程序体的语句引用 %a 来取得第一个符号(2006),引用 %b 来取得第二个符号(12),引用 %c来取得第三个符号(29),引用%d来取得第四个符号(星期五), 因为你用"tokens"指定了"date /t"命令输出的结果中的第一到第四个符号,所以这时引出了%b;%c;%d,当然后面的变量也不是随便给出的,它必须跟第一次给出的变量名是相邻的,但后面(do后面执行的命令)他们之间的顺序可以颠倒,只是会影响到最终的输出结果,如果在for /f中没有指定"tokens",默认 tokens=1
3 发表于 2007-01-01 05:19 ·  中国 山东 青岛 中移铁通
初级用户
积分 63
发帖 33
注册 2006-12-04 05:49
UID 72514
性别 男
状态 离线
这个是我用来做试验的文本文件t1.txt的内容


Quote:
为a工了挽住那转逝的感触,
我a不得不提起了笔,
写a下这禁忌之爱的点点滴滴。
或a许阴暗,或许残忍,或许另类,
但a谁也不能否认这其间人物最真的善良与无私。
愿a大家陪着他们走到那注定的终点。

for /f "eol=为 tokens=2 delims=a " %1 in (t1.txt) do @echo %1

注: 因eol=为,所以将忽略掉所有以"为"打头的行,由于"delims=a",又将每一行以"a"为分割成两部分,同时"tokens=2"即取第二部分.

for /f "eol=为 tokens=1 delims=a " %1 in (t1.txt) do @echo %1

同上,只是最后你取的是以"a"分割的第一部分

for /f "eol=为 tokens=3 delims=a " %1 in (t1.txt) do @echo %1

同上,因t1.txt文件中每行只出现一个"a",所以实际你每行只分隔成两部分,而"tokens=3"去取第3部分,当然不会有显示.
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
hy433124shc +1 2007-03-14 09:40
4 简单点可以这个来回答 发表于 2007-01-04 04:09 ·  中国 湖北 武汉 电信
初级用户
积分 40
发帖 14
注册 2006-12-27 11:38
UID 74713
性别 男
状态 离线
楼主 的 字母 a 可以当作是 分隔符 (默认的分隔符 是 空格 或 跳格 )
而那个 tokens= 是指的 列数...
1 就是第一列 ; 2 就是第二列 ; 3 就是第三列...
这样就 好理解多了...
5 发表于 2007-01-04 04:15 ·  中国 湖北 武汉 电信
初级用户
积分 40
发帖 14
注册 2006-12-27 11:38
UID 74713
性别 男
状态 离线

为a工了挽住那转逝的感触,
我a不得不提起了笔,
写a下这禁忌之爱的点点滴滴。
或a许阴暗,或许残忍,或许另类,
但a谁也不能否认这其间人物最真的善良与无私。
愿a大家陪着他们走到那注定的终点。


楼主的文字可以用表格形象成 这们..
第一列 第二列 第三列 ......

为 工了挽住那转逝的感触,
我 不得不提起了笔,
写 下这禁忌之爱的点点滴滴。
或 许阴暗,或许残忍,或许另类,
但 谁也不能否认这其间人物最真的善良与无私。


几列都是 以 a 为分隔符 的 ...第三列 是 你写的那 行命令而加上的.

本来 第三列就没有..是空 的..

看了 希望 你明白 ..
愿 大家陪着他们走到那注定的终点。
本帖最近评分记录 (共 7 条) 点击查看详情
评分人分数时间
hy433124shc +2 2007-03-14 09:39
logictianjin +1 2007-04-07 01:29
caucfeiyu +1 2007-04-12 16:57
gugewang +1 2008-01-11 20:30
h2thesun +1 2008-03-03 23:47
dosz +1 2009-03-07 11:42
slw218856 +1 2009-11-11 22:48
6 发表于 2007-01-05 23:01 ·  中国 河北 保定 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
首先,你要明白,for /f的主要作用是从文本行中提取出特定的字符串。因此,它的每一个循环处理的就是一行文本。既然要从这行文本中提取出特定的字符串,当然,就需要对这一行文本进行分隔,分隔的结果就是将这一行文本分成了若干个字段,例如下面一行文本:
Dog*Cat*Monkey*Donkey

很显然,我们如果以*号作为分隔符,那么这一行就会分为下面四个字段:
Dog Cat Monkey Donkey

ok,现在我们要取出其中的一个或者所有字段进行处理,那么在for /f语句中,字段就是用tokens来代表的。

例如,我们这样写:for /f "tokens=1,2,3,4 delims=*" %i in ('...') do ....

那么以上面一行文本为例:tokens中的1就表示Dog、2表示Cat、依次类推。而在Do语句中,%i 代表tokens(1)的值,即Dog,而%j表示tokens(2)的值即Cat,再次依次类推。

如果我们写成:for /f "tokens=2,4 delims=*" %i in ('...') do ...

那么%i = tokens(2) 即Cat,%j=tokens(4)即Donkey。

另外,在tokens中可以使用*号,表示剩余的全部字段,例如:tokens=1,*
那么这里的*号表示tokens(2,3,4)的全部内容,也就是%j = Cat Monkey Donkey。

关于tokens大致就是这些东西了,以上的描述中可能有不准确的地方,以实践为准。
本帖最近评分记录 (共 8 条) 点击查看详情
评分人分数时间
zhxy9804 +2 2007-03-11 12:16
hy433124shc +2 2007-03-12 08:48
logictianjin +1 2007-04-07 01:29
caucfeiyu +1 2007-04-12 17:01
z310394543 +1 2007-10-29 22:48
joyoustar +2 2008-01-07 11:42
regvip2008 +1 2008-01-14 17:44
dosz +2 2009-03-07 11:43
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
7 发表于 2007-01-15 05:00 ·  中国 广东 广州 白云区 电信
初级用户
积分 21
发帖 6
注册 2006-12-17 00:10
UID 73746
性别 男
状态 离线
楼上精解!
8 发表于 2007-01-16 09:53 ·  中国 江苏 连云港 联通
高级用户
★★★
前进者
积分 641
发帖 303
注册 2007-01-10 02:57
UID 76009
性别 男
状态 离线
嗯,看完了,又加深了一些印像,for是要好好学的。
我相信总有一天,总会遇到一个人可以相濡以沫、相吻以湿!
9 发表于 2007-01-22 11:56 ·  中国 山东 菏泽 联通
初级用户
积分 22
发帖 9
注册 2006-07-03 13:14
UID 57930
状态 离线
6楼精解
10 发表于 2007-01-22 22:42 ·  中国 广东 广州 白云区 电信
初级用户
积分 99
发帖 43
注册 2007-01-12 23:05
UID 76317
性别 男
状态 离线
本来我也是不懂的,看完6楼的解释真是茅塞顿开啊,啥也不说了,回去接着学。。。
11 发表于 2007-03-09 08:31 ·  中国 江苏 无锡 电信
新手上路
积分 10
发帖 4
注册 2007-03-07 10:23
UID 80993
性别 男
状态 离线
不错,终于明白了
12 发表于 2007-03-10 16:34 ·  新西兰
初级用户
积分 107
发帖 47
注册 2007-03-03 03:12
UID 80618
性别 男
状态 离线
6楼讲的好 明白了很多``````信心又来了
13 发表于 2007-03-11 12:16 ·  中国 山东 临沂 电信
中级用户
★★
积分 208
发帖 97
注册 2006-12-28 22:08
UID 74845
性别 男
状态 离线
给他加分啊 6楼 这样光说好有什么用 付出点实际行动来!
14 发表于 2007-03-12 08:51 ·  中国 山东 潍坊 电信
中级用户
★★
积分 201
发帖 75
注册 2007-02-24 00:26
UID 80034
性别 男
状态 离线
6楼的通俗易懂!
说得明明白白.清清楚楚!
我给加2分!
15 发表于 2007-03-13 11:58 ·  中国 陕西 西安 电信
初级用户
积分 120
发帖 45
注册 2007-03-13 05:57
UID 81568
性别 男
状态 离线
6楼说的好啊
论坛跳转: