中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » For 命令中tokens参数的使用求教?
« [1] [2] »
作者:
标题: For 命令中tokens参数的使用求教? 上一主题 | 下一主题
lgaint
初级用户





积分 22
发帖 7
注册 2006-10-25
状态 离线
『楼 主』:  For 命令中tokens参数的使用求教?

因为要批量建文件夹,学习了一下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的内容

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

以下是试验过程

  Quote:
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:\>



2006-10-25 04:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
trickster
初级用户




积分 63
发帖 33
注册 2006-12-4
状态 离线
『第 2 楼』:  

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

2007-1-1 05:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
trickster
初级用户




积分 63
发帖 33
注册 2006-12-4
状态 离线
『第 3 楼』:  

这个是我用来做试验的文本文件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-3-14 09:40


2007-1-1 05:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
rochan
初级用户





积分 40
发帖 14
注册 2006-12-27
状态 离线
『第 4 楼』:  简单点可以这个来回答

楼主 的 字母 a  可以当作是  分隔符  (默认的分隔符 是 空格 或 跳格 )
而那个 tokens=   是指的 列数...
1 就是第一列   ;  2 就是第二列   ;   3 就是第三列...
这样就 好理解多了...

2007-1-4 04:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
rochan
初级用户





积分 40
发帖 14
注册 2006-12-27
状态 离线
『第 5 楼』:  



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

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

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


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

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

看了  希望 你明白 ..
愿              大家陪着他们走到那注定的终点。

   此帖被 +8 点积分            点击查看详情   
评分人:【 hy433124shc 分数: +2  时间:2007-3-14 09:39
评分人:【 logictianjin 分数: +1  时间:2007-4-7 01:29
评分人:【 caucfeiyu 分数: +1  时间:2007-4-12 16:57
评分人:【 gugewang 分数: +1  时间:2008-1-11 20:30
评分人:【 h2thesun 分数: +1  时间:2008-3-3 23:47
评分人:【 dosz 分数: +1  时间:2009-3-7 11:42
评分人:【 slw218856 分数: +1  时间:2009-11-11 22:48


2007-1-4 04:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 6 楼』:  

首先,你要明白,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大致就是这些东西了,以上的描述中可能有不准确的地方,以实践为准。

   此帖被 +12 点积分                点击查看详情   
评分人:【 zhxy9804 分数: +2  时间:2007-3-11 12:16
评分人:【 hy433124shc 分数: +2  时间:2007-3-12 08:48
评分人:【 logictianjin 分数: +1  时间:2007-4-7 01:29
评分人:【 caucfeiyu 分数: +1  时间:2007-4-12 17:01
评分人:【 z310394543 分数: +1  时间:2007-10-29 22:48
评分人:【 joyoustar 分数: +2  时间:2008-1-7 11:42
评分人:【 regvip2008 分数: +1  时间:2008-1-14 17:44
评分人:【 dosz 分数: +2  时间:2009-3-7 11:43




偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2007-1-5 23:01
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
bigcarp
初级用户





积分 21
发帖 6
注册 2006-12-17
状态 离线
『第 7 楼』:  

楼上精解!

2007-1-15 05:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
oilio
高级用户

前进者


积分 641
发帖 303
注册 2007-1-10
状态 离线
『第 8 楼』:  

嗯,看完了,又加深了一些印像,for是要好好学的。



我相信总有一天,总会遇到一个人可以相濡以沫、相吻以湿!
2007-1-16 09:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tyrbl
初级用户





积分 22
发帖 9
注册 2006-7-3
状态 离线
『第 9 楼』:  

6楼精解

2007-1-22 11:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hangyug
初级用户




积分 99
发帖 43
注册 2007-1-12
状态 离线
『第 10 楼』:  

本来我也是不懂的,看完6楼的解释真是茅塞顿开啊,啥也不说了,回去接着学。。。

2007-1-22 22:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
kevinye
新手上路





积分 10
发帖 4
注册 2007-3-7
状态 离线
『第 11 楼』:  

不错,终于明白了

2007-3-9 08:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
nzisisco
初级用户





积分 107
发帖 47
注册 2007-3-3
状态 离线
『第 12 楼』:  

6楼讲的好 明白了很多``````信心又来了

2007-3-10 16:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhxy9804
中级用户





积分 208
发帖 97
注册 2006-12-28
状态 离线
『第 13 楼』:  

给他加分啊 6楼 这样光说好有什么用 付出点实际行动来!

2007-3-11 12:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hy433124shc
中级用户





积分 201
发帖 75
注册 2007-2-24
状态 离线
『第 14 楼』:  

6楼的通俗易懂!
说得明明白白.清清楚楚!
我给加2分!

2007-3-12 08:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tianlijian
初级用户





积分 120
发帖 45
注册 2007-3-13
状态 离线
『第 15 楼』:  

6楼说的好啊

2007-3-13 11:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: