中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: for /f 不明白,不会用 上一主题 | 下一主题
1980623
初级用户





积分 25
发帖 7
注册 2006-10-13
状态 离线
『楼 主』:  for /f 不明白,不会用

用for /?查了一下,但是对于for /f 不明白.skip=n delims=xxx tokens=x,y,m-nusebackq eol=c 这几个都不会用,谁能给讲一下???????

2006-10-15 23:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 2 楼』:  

请楼主学会搜索和查看帮助文档




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-10-15 23:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
1980623
初级用户





积分 25
发帖 7
注册 2006-10-13
状态 离线
『第 3 楼』:  

我查了,但有点看不懂.

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





积分 28
发帖 11
注册 2006-10-12
状态 离线
『第 4 楼』:  

for /f是处理文件的
具体的方法,就是把(set)里面的文件打开,
把里面的内容,每行都按delims指定的分隔符,分割成一个一个字符串
依次传给你指定的变量,默认的分隔符是空格
eol=c 是不处理以c开头的行
skip=n 是忽略前面的n行
delims=xxx 指定分隔符
tokens=x,y,m-n指定变量
usebackq 如果文件名有空格,需要用"",并同时写上这个符号

比如一个文件ip.txt的内容是:
ip user psw

你用
for /f “tokens=1,2,3 delims=” %%i in (ip.txt) do ...
得到结果是 %%i是ip,%%j是user  %%k是psw


我也是初学,说的不一定正确,你最好亲自试用一下才知道它的真正含义。

2006-10-16 02:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 5 楼』:  

多看帮助,多看例子

2006-10-16 02:21
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
milertom
初级用户





积分 28
发帖 11
注册 2006-10-12
状态 离线
『第 6 楼』:  共同进步!


@echo off
for /f "eol=@ skip=2 tokens=1,2,3 delims=, " %%i in (ip.txt) do echo %%i>>address.txt & echo %%j>>user.txt  & echo %%k>>psw.txt


附件 1: ip.txt (2006-10-16 02:22, 105 bytes, 下载附件所需积分 1 点 ,下载次数: 45)
2006-10-16 02:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
1980623
初级用户





积分 25
发帖 7
注册 2006-10-13
状态 离线
『第 7 楼』:  

多谢各位帮忙,楼上的朋友我按你给的试了一下,运行后有一点不明白.

delims=, 是不是指以逗号为分隔符.但执行发现遇到空隔时也分隔了请问是怎么回事???不懂?????

谢谢

2006-10-16 04:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by 1980623 at 2006-10-16 04:23:
多谢各位帮忙,楼上的朋友我按你给的试了一下,运行后有一点不明白.

delims=, 是不是指以逗号为分隔符.但执行发现遇到空隔时也分隔了请问是怎么回 ...


  请注意“delims=, ”后面还有一个空格。 :)


2006-10-16 06:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
weilong888
银牌会员




积分 1270
发帖 548
注册 2004-5-31
状态 离线
『第 9 楼』:  

这for命令可真要好好学学。

2006-10-16 07:45
查看资料  发送邮件  发短消息 网志  OICQ (314295922)  编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by milertom at 2006-10-16 02:22:
@echo off
for /f "eol=@ skip=2 tokens=1,2,3 delims=, " %%i in (ip.txt) do echo %%i>>address.txt & echo %%j>>user.txt  & echo %%k>>psw.txt

"eol=@ skip=2 tokens=1,2,3 delims=, " 这里将,号和空格都作为分隔符, 只要出现这两个字符中的一个就会将前后的字符或字符串赋按顺序赋给不同的变量.

2006-10-16 08:38
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
jieok3375
中级用户





积分 282
发帖 130
注册 2006-9-20
来自 广东
状态 离线
『第 11 楼』:  

路过,学习了。



~~~~好好学习
              天天向上~~~~
2006-10-17 00:45
查看资料  发送邮件  发短消息 网志  OICQ (147385156)  编辑帖子  回复  引用回复
31676201
新手上路





积分 19
发帖 9
注册 2006-11-29
状态 离线
『第 12 楼』:  

DOS,代表着自由开放与发展,我们努力起來,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

2006-12-4 11:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tao0610
高级用户

朦胧的世界


积分 579
发帖 218
注册 2006-10-24
状态 离线
『第 13 楼』:  

找点例子多试试效果就会用了!




认识自己,降伏自己,改变自己
,才能改变别人!
2006-12-4 12:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tathatayx
初级用户





积分 23
发帖 11
注册 2006-11-7
来自 四川成都
状态 离线
『第 14 楼』:  

正在学习,将坛子里面的重要具体应用文章打印出来了,慢慢提高!

“FO  IN    DO”命令好啊!!!!

2006-12-10 10:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
trickster
初级用户




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

for命令应该是DOS命令中比较难理解的一个,如果不能灵活的应用for语句,你就做不出一个好的批处理。由于本人也是刚刚开始学习dos系统,可能很多理解的都比较肤浅,但本着自由~共享的精神,把自己在最近学习for命令的一些心得拿出来跟LZ共同进行探讨,如有不当之处也请其它朋友给予指正,同时也希望LZ能从中到一些启示:

    eol=c    - 指一个行注释字符的结尾(就一个)

    比如:eol=; for/f 命令在处理时会忽略掉以“;”打头的行,又如: eol=@ for命令在处理后面的操作是将会忽略掉以@大头的行,这个类似与批处理中在遇到以::打头的行时批处理对本行不做处理一样.

    skip=n    - 指在文件开始时忽略的行数。

    比如你设定 skip=5 则for命令从你给定的文件中的第6行(跳过5行)开始处理.这个比较容易理解,不在过多解释.

    delims=xxx      - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。

    delims的作用就是指定分隔符,比如在XP环境下用date /t命令显示当前的日期会得到:"2006-12-29 星期五"而当使用下面的命令后看一下有什么变化:

          for /f "delims=- " %a in('date /t') do echo %a

得到的是"2006",为什么会这样呢,就是因为你使用delims指定l了"-"和" "(空格,)作为分隔符,for 命令在处理时取出分隔符两边的符号,至于为什么最后的结果是2006,将在说完tokens后给出

    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 ,现在你应该明白为什么在第一个例子中得到的结果是"2006"了吧

[ Last edited by trickster on 2006-12-30 at 01:18 PM ]

2006-12-30 06:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: