Board logo

标题: For 命令中tokens参数的使用求教? [打印本页]

作者: lgaint     时间: 2006-10-25 04:16    标题: 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:\>


作者: trickster     时间: 2007-1-1 05:08
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
作者: trickster     时间: 2007-1-1 05:19
这个是我用来做试验的文本文件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部分,当然不会有显示.
作者: rochan     时间: 2007-1-4 04:09    标题: 简单点可以这个来回答

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


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

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

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


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

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

看了  希望 你明白 ..
愿              大家陪着他们走到那注定的终点。
作者: Climbing     时间: 2007-1-5 23:01
首先,你要明白,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大致就是这些东西了,以上的描述中可能有不准确的地方,以实践为准。
作者: bigcarp     时间: 2007-1-15 05:00
楼上精解!
作者: oilio     时间: 2007-1-16 09:53
嗯,看完了,又加深了一些印像,for是要好好学的。
作者: tyrbl     时间: 2007-1-22 11:56
6楼精解
作者: hangyug     时间: 2007-1-22 22:42
本来我也是不懂的,看完6楼的解释真是茅塞顿开啊,啥也不说了,回去接着学。。。
作者: kevinye     时间: 2007-3-9 08:31
不错,终于明白了
作者: nzisisco     时间: 2007-3-10 16:34
6楼讲的好 明白了很多``````信心又来了
作者: zhxy9804     时间: 2007-3-11 12:16
给他加分啊 6楼 这样光说好有什么用 付出点实际行动来!
作者: hy433124shc     时间: 2007-3-12 08:51
6楼的通俗易懂!
说得明明白白.清清楚楚!
我给加2分!
作者: tianlijian     时间: 2007-3-13 11:58
6楼说的好啊
作者: leoson88     时间: 2007-3-14 00:05
以前也是半懂不懂,看了精讲,全明白了~~
作者: vsda2008     时间: 2007-3-25 07:36    标题: 6楼说的好啊

6楼说的好啊
作者: studythedos     时间: 2007-3-30 00:31
本来也是就tokens的那个*号什么意思不理解,eol以为只去掉它后边跟的那个字呢。
听了6楼的解释。现在明白了。嘿。谢谢!
作者: huahua0919     时间: 2007-12-3 10:58
我是自己把文档看懂后,再看这个才觉得对
作者: gugewang     时间: 2008-1-11 20:32
确实是茅塞顿开啊,恍然大悟啊~~~~~~~~

真是多亏了强人的教导啊~~~~~~~
作者: haiou327     时间: 2008-1-14 17:32
好教程!!!!!!!!!!!
作者: wangjmh     时间: 2008-1-18 20:04
我想知道里面有个%j,我没找到这个参数在哪
作者: wangjmh     时间: 2008-1-18 20:05
我的Q是284292673,邮箱是:wangjmh@126.com
谢谢
作者: haiou327     时间: 2008-1-19 19:35
好帖顶了先,不然又被淹了
作者: h2thesun     时间: 2008-3-3 23:48
不错,以前看到一堆*号数字,号什么的就晕,6楼解释得不错。加分。
作者: snzy342     时间: 2009-11-11 12:01
for可以取到超过26个变量的值,根据ASCII的大小顺序来取,最多达31个
自A开始时可达31个,它们是“A至Z、[、\、]、^、_”
自a开始时可达29个,它们是“a至z、{、|、}”
自!开始时可达31个,它们是“!、"、#、$、&、'、(、)、*、+、,、-、.、/、0至9、:、;、<、=、>、?”
作者: mindayl     时间: 2009-11-11 21:51
看了下 6楼讲的很清楚了  不错哦!!
作者: slw218856     时间: 2009-11-11 22:59
for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j for /f "tokens=2* delims= " %%i in (a.txt) do echo %%i %%j
2,*与2*有区别吗?
作者: weasel     时间: 2009-11-12 00:23
好好学习
  天天向上
6楼说的好啊
作者: flying008     时间: 2009-11-12 13:19


  Quote:
Originally posted by slw218856 at 2009-11-11 22:59:
for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j for /f "tokens=2* delims= " %%i in (a.txt) do echo %%i %%j
2,*与2*有区别吗?

当然有区别. CMD自带的帮助就解释得很清楚了.