![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-15 12:17 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [共同讨论]for语句读取文本内容的一些陷阱 |
| 可打印版本 5,901 / 17 |
| 第1楼 namejm | 发表于 2007-01-25 05:33 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
[共同讨论]for语句读取文本内容的一些陷阱 1、普通for语句会忽略以分号开头的文本:
test.txt内容: 测试代码: 此陷阱在不用for的 type test.txt、more test.txt和findstr .* test.txt 语句中不存在。 2、在for语句中使用带 tokens=1* delims=: 的 findstr /n .* test.txt 的时候,会过滤掉行首的所有冒号: test.txt同1; 测试代码: 解决问题1和问题2的通用方案: 稍微复杂一点的: 最简洁的(经测试,这个方案不具备通用性,因为"delims= eol=" 会把行首为引号的内容过滤掉,看来真是前门驱虎后门进狼、引号和分号不能兼顾啊): 简洁方案中的"delims= eol=" 顺序不能颠倒,否则会出现偏差。 不知道强大的 for 还会有哪些陷阱会让不明就里的我们往里跳,请各位收集一下,以便日后编写代码的时候能少走弯路。 [ Last edited by namejm on 2007-5-17 at 09:17 PM ] |
|
| 第2楼 9527 | 发表于 2007-01-25 05:42 |
| 银牌会员 发帖 438 积分 1,185 来自 北京 | |
|
首先我想说的是FOR语句默认是忽略以“分号”开头的行,而不是冒号。
其次for /f "eol= delims=" %%a in (xxx) do command 命令中不会忽略任何符号开头的行,也就是说会显示全部的内容........ |
|
| 第3楼 lzmyst | 发表于 2007-01-25 05:46 |
| 新手上路 发帖 10 积分 19 | |
|
几乎所有教程都说delims要放在最后,今天才知道也是有陷阱的。
|
|
| 第4楼 pengfei | 发表于 2007-01-25 05:51 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
又一个值得注意的地方, 不能说是陷阱, 任何程序自然不能顾及所有方面, 这就得靠我们平时多留意了.
|
|
| 第5楼 namejm | 发表于 2007-01-25 05:54 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
Originally posted by 9527 at 2007-1-24 16:42: 呵呵,多谢提醒,笔误已经修正。 其次for /f "eol= delims=" %%a in (xxx) do command 命令中不会忽略任何符号开头的行,也就是说会显示全部的内容........ 这个方案会忽略掉以空格打头的行,兄弟测试一下就知道了。 Originally posted by pengfei at 2007-1-24 16:51: 这些值得注意的地方,在微软的使用手册里没有任何地方提及,究竟是它刻意忽略的bug还是问题太小而不屑于提及异或是没有察觉到,已经无从得知,但是从使用者的角度来说,有bug的地方却没有正式的说明,无异于是一个个隐藏着的陷阱等着别人往里跳^_^ [ Last edited by namejm on 2007-1-24 at 05:59 PM ] |
|
| 第6楼 vkill | 发表于 2007-01-25 08:22 |
| 金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽 | |
|
"delims= eol=" 顺序不能颠倒
for /?上不是这样的啊 |
|
| 第7楼 namejm | 发表于 2007-01-25 08:31 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
哈哈,for /? 里还说:eol=c -指一个行注释字符的结尾(就一个) 。我狂吐血ing——嘿嘿,实际上是过滤掉以 c 打头的行,不知是哪个家伙翻译的,E文也太差了点吧?
言归正传,我所说的顺序不能颠倒,并不是指所有的情形,而是说为了能同时处理以分号和冒号打头的行内容,这个顺序不能颠倒。 |
|
| 第8楼 vkill | 发表于 2007-01-25 08:43 |
| 金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽 | |
Originally posted by namejm at 2007-1-25 08:31: 汗,才发现for /?有这么大个超级错误,狂晕中 |
|
| 第9楼 pengfei | 发表于 2007-01-25 09:24 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
for /f "eol= delims=" %%i in (test.txt) do echo %%i "eol= delims=" 不能颠倒, 本机测试没有发现错误.
看来for /?的注释真的有点问题啊. eol=c - 指一个行注释字符的结尾(就一个) delims=xxx - 指分隔符集。这个替换了空格和跳格键的 默认分隔符集。 上面的说明我们在理解时产生了歧义, eol是过滤与行首字符匹配的行. 就像delims默认的分隔符为空格或TAB. 而eol的默认过滤的行首字符为;号, 而for /?却没有说明. namejm兄说明给出的解决代码, for /f "delims= eol=" %%i in (test.txt) do echo %%i 它的作用和"delims=" 一样是取消默认空格作为分隔符, 而"eol="是取消;作分隔符. 下面代码为过滤行首为冒号的行, 同时取消了默认的分号分隔符. test.txt elo分隔符只能为一个, 上面代码故意让elo有两个分隔符, 可是只过滤了行首为:号的行, 而空格行却没有过滤. |
|
| 第10楼 hxmupdata | 发表于 2007-03-14 22:30 |
| 初级用户 发帖 39 积分 76 | |
|
看个帖要花半个小时,,,不愧是经典帖..............................
|
|
| 第11楼 wudixin96 | 发表于 2007-04-04 01:07 |
| 银牌会员 发帖 931 积分 1,928 | |
|
下面代码为过滤行首为冒号的行, 同时取消了默认的分号分隔符.
CODE: -------------------------------------------------------------------------------- @echo off for /f "delims= eol=: " %%i in (test.txt) do echo %%i pause 应该是 下面代码为过滤行首为冒号的行, 同时取消了默认的空格和跳格键分隔符. |
|
| 第12楼 ccuu668 | 发表于 2007-05-02 15:32 |
| 初级用户 发帖 29 积分 57 | |
|
看来只有多多学习学习基础的东西了.看的不彻底.
|
|
| 第13楼 luowei14 | 发表于 2007-08-15 17:27 |
| 初级用户 发帖 98 积分 193 | |
|
。。。呵。。microsoft还有这个BUG啊。。。晕晕
|
|
| 第14楼 knoppix7 | 发表于 2007-08-15 22:04 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
|
set /?里的BUG更多。。。
|
|
| 第15楼 dai13910 | 发表于 2008-01-11 14:39 |
| 新手上路 发帖 5 积分 10 | |
|
恩!很多细节值得推敲
|
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |