中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-02 23:45
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » for /f 不明白,不会用 查看 1,638 回复 14
楼 主 for /f 不明白,不会用 发表于 2006-10-15 23:01 ·  中国 黑龙江 佳木斯 电信
初级用户
积分 25
发帖 7
注册 2006-10-13 06:50
19年会员
UID 65582
状态 离线
用for /?查了一下,但是对于for /f 不明白.skip=n delims=xxx tokens=x,y,m-nusebackq eol=c 这几个都不会用,谁能给讲一下???????
2 发表于 2006-10-15 23:15 ·  中国 四川 成都 教育网
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
20年会员
UID 42173
性别 男
状态 离线
请楼主学会搜索和查看帮助文档

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'>"
3 发表于 2006-10-16 00:58 ·  中国 黑龙江 佳木斯 电信
初级用户
积分 25
发帖 7
注册 2006-10-13 06:50
19年会员
UID 65582
状态 离线
我查了,但有点看不懂.
4 发表于 2006-10-16 02:14 ·  中国 湖北 武汉 电信
初级用户
积分 28
发帖 11
注册 2006-10-12 21:18
19年会员
UID 65492
状态 离线
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


我也是初学,说的不一定正确,你最好亲自试用一下才知道它的真正含义。
5 发表于 2006-10-16 02:21 ·  中国 甘肃 平凉 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
多看帮助,多看例子
6 共同进步! 发表于 2006-10-16 02:22 ·  中国 湖北 武汉 电信
初级用户
积分 28
发帖 11
注册 2006-10-12 21:18
19年会员
UID 65492
状态 离线

@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
附件
ip.txt (105 bytes, 下载附件所需积分 1 点, 下载次数: 45)
7 发表于 2006-10-16 04:23 ·  中国 黑龙江 佳木斯 电信
初级用户
积分 25
发帖 7
注册 2006-10-13 06:50
19年会员
UID 65582
状态 离线
多谢各位帮忙,楼上的朋友我按你给的试了一下,运行后有一点不明白.

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

谢谢
8 发表于 2006-10-16 06:46 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
Originally posted by 1980623 at 2006-10-16 04:23:
多谢各位帮忙,楼上的朋友我按你给的试了一下,运行后有一点不明白.

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


  请注意“delims=, ”后面还有一个空格。 :)
9 发表于 2006-10-16 07:45 ·  中国 浙江 衢州 电信
银牌会员
★★★
积分 1,270
发帖 548
注册 2004-05-31 00:00
22年会员
UID 25754
性别 男
状态 离线
这for命令可真要好好学学。
10 发表于 2006-10-16 08:38 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
20年会员
UID 58987
来自 湖南.娄底
状态 离线
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=, " 这里将,号和空格都作为分隔符, 只要出现这两个字符中的一个就会将前后的字符或字符串赋按顺序赋给不同的变量.
11 发表于 2006-10-17 00:45 ·  中国 广东 东莞 电信
中级用户
★★
积分 282
发帖 130
注册 2006-09-20 22:25
19年会员
UID 63201
来自 广东
状态 离线
路过,学习了。
~~~~好好学习
天天向上~~~~
12 发表于 2006-12-04 11:51 ·  中国 北京 海淀区 联通
新手上路
积分 19
发帖 9
注册 2006-11-29 15:24
19年会员
UID 72098
性别 男
状态 离线
DOS,代表着自由开放与发展,我们努力起來,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!
13 发表于 2006-12-04 12:24 ·  中国 北京 朝阳区 联通
高级用户
★★
朦胧的世界
积分 579
发帖 218
注册 2006-10-24 04:29
19年会员
UID 67972
状态 离线
找点例子多试试效果就会用了!

认识自己,降伏自己,改变自己
,才能改变别人!
14 发表于 2006-12-10 10:23 ·  中国 四川 成都 龙泉驿区 电信
初级用户
积分 23
发帖 11
注册 2006-11-07 09:04
19年会员
UID 69894
性别 男
来自 四川成都
状态 离线
正在学习,将坛子里面的重要具体应用文章打印出来了,慢慢提高!

“FO IN DO”命令好啊!!!!
15 发表于 2006-12-30 06:57 ·  中国 山东 青岛 中移铁通
初级用户
积分 63
发帖 33
注册 2006-12-04 05:49
19年会员
UID 72514
性别 男
状态 离线
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 ]
论坛跳转: