中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 用for指令,從一個文本文件讀取某一行之疑問
作者:
标题: 用for指令,從一個文本文件讀取某一行之疑問 上一主题 | 下一主题
yc421206
初级用户





积分 52
发帖 21
注册 2006-1-4
状态 离线
『楼 主』:  用for指令,從一個文本文件讀取某一行之疑問

DEAR ALL:
小弟日前在版上搜集到的一個帖子,這帖子讓我受用無盡,但還有許多地方不明白,懇請諸位先進不吝惜指教,謝謝!


這一頁告訴大家如何從一個文本文件讀取某一行. 這裡有很多方法可以使用 for/f 讀取 input.txt 的內容,例如:

for /f "delims=" %%a in (input.txt) do ...

for /f "delims=" %%a in ('type input.txt') do ...

for /f "delims=" %%a in ('more ^< input.txt') do ...

不過,只有最後一種方法(使用 more 命令) 可以在不同的操作系統中如:Windows NT, 2000, XP and 2003 取得一致的結果。第一種方法不能識別UNICODE編碼文件,並且, 如果輸入文件名包含空格,usebackq 參數必須被使用,第二個方法, 使用 type 命令, 在 windows2000, XP 和 2003 中如果文件不是從字節序標記(BOM)開始 ,同樣不識別unicode 文件。

在所有例子中,假設numbers.txt的內容為:

one
two
three
four
five
six
seven
eight
nine
ten

顯示第一行

這個例子輸出 one。

@echo off & setlocal ENABLEEXTENSIONS
set "first="
for /f "delims=" %%a in ('more ^< numbers.txt') do (
  if not defined first set first=%%a
)
echo/%first%

==============================================
為什麼定義了if not defined first set first=%%a,就只會顯示第一行呢

==============================================

顯示前幾行

這個例子輸出 one, two 和 three。

@echo off & setlocal ENABLEEXTENSIONS
set "lines=3"
set i=-1
set "ok="
for /f "delims=" %%a in ('more ^< numbers.txt') do (
  set/a i+=1 & for /f %%z in ('echo/%%i%%') do (
    if "%%z"=="%lines%" set ok=1
  )
  if not defined ok echo/%%a
)

==============================================
set/a i+=1→這句該如何解釋,可否提供相關文章說明,因為我找了很多卻找不到。
('echo/%%i%%')→這句該如何解釋
==============================================

顯示最後一行

這個例子輸出 ten。

@echo off & setlocal ENABLEEXTENSIONS
for /f "delims=" %%a in ('more ^< numbers.txt') do set "last=%%a"
echo/%last%

顯示最後幾行

這個例子輸出 nine 和 ten。

@echo off & setlocal ENABLEEXTENSIONS
set "lines=2"
for /f %%a in ('find/c /v "" ^< numbers.txt') do set/a skip=%%a-lines
for /f "delims=" %%a in ('more/e +%skip% ^< numbers.txt') do (
  echo/%%a
)

==============================================
('find/c /v "" ^< numbers.txt')→這句該如何解釋。
('more/e +%skip% ^< numbers.txt')→這句該如何解釋
==============================================

顯示第 n 行

這個例子輸出three,注意這裡使用more的 /e 參數 來跳過指定的行數,配合for/f 使用,當數值小於1時會失敗。


@echo off & setlocal ENABLEEXTENSIONS
set LineNo=3
set "line="
set/a LineNo-=1
for /f "delims=" %%a in ('more/e +%LineNo% ^< numbers.txt') do (
  if not defined line set "line=%%a"
)
echo/%line%

顯示第 n 行加上 X 行

這個例子輸出five和six。

@echo off & setlocal ENABLEEXTENSIONS
set start=5
set "lines=2"
set/a i=-1,start-=1
set "ok="
for /f "delims=" %%a in ('more/e +%start% ^< numbers.txt') do (
  set/a i+=1 & for /f %%z in ('echo/%%i%%') do (
    if "%%z"=="%lines%" set ok=1
  )
  if not defined ok echo/%%a
)

==============================================
('more/e +%start% ^< numbers.txt')→這句該如何解釋。
('echo/%%i%%')→這句該如何解釋
==============================================



以上,麻煩諸位幫忙了,謝謝!:)

2007-1-25 12:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yc421206
初级用户





积分 52
发帖 21
注册 2006-1-4
状态 离线
『第 2 楼』:  

沒人幫我><
自己頂一下


懇請版上高手為我解答阿><
2007-01-27

[ Last edited by yc421206 on 2007-1-27 at 02:30 PM ]

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





积分 52
发帖 21
注册 2006-1-4
状态 离线
『第 3 楼』:  

沒有人肯幫我嗎~
再頂

2007-1-29 14:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 4 楼』:  

@echo off & setlocal ENABLEEXTENSIONS
set "first="
for /f "delims=" %%a in ('more ^< numbers.txt') do (
  if not defined first set first=%%a
)
echo/%first%

==============================================
為什麼定義了if not defined first set first=%%a,就只會顯示第一行呢

==============================================
因为 echo 不在 FOR 里面,只执行了一次,输出的是 FOR 中存的第一行。





==============================================
set/a i+=1→這句該如何解釋,可否提供相關文章說明,因為我找了很多卻找不到。
('echo/%%i%%')→這句該如何解釋
==============================================

set/a i+=1 就相当于 set /a i=%i%+1
%%i%% 是因为要多用一层“解释”



==============================================
('find/c /v "" ^< numbers.txt')→這句該如何解釋。
('more/e +%skip% ^< numbers.txt')→這句該如何解釋
==============================================

第一句好像是查总共有多少行
第二句是跳过开头 skip 行



仅供参考,可能有误。

   此帖被 +10 点积分       点击查看详情   
评分人:【 redtek 分数: +8  时间:2007-1-29 22:52
评分人:【 stance 分数: +2  时间:2008-5-4 14:35


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





积分 52
发帖 21
注册 2006-1-4
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by NaturalJ0 at 2007-1-29 22:09:
@echo off & setlocal ENABLEEXTENSIONS
set "first="
for /f "delims=" %%a in ('more ^< numbers.txt') do (
  if not defined first set first=%%a
)
echo/%first%

====== ...

謝謝您的解答,小弟受教了

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





积分 64
发帖 46
注册 2008-4-21
状态 离线
『第 6 楼』:  

謝謝NaturalJ0,以前也見過%%i%%,想得頭都大了也沒想明白。

2008-5-4 14:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nipo
中级用户





积分 228
发帖 106
注册 2008-4-26
状态 离线
『第 7 楼』:  

按照这里的说法,在处理UNICODE字符方面,more比type还好用。

2008-5-12 00:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
106942397
初级用户




积分 29
发帖 15
注册 2008-4-23
状态 离线
『第 8 楼』:  

我不懂'more ^< numbers.txt'和'type input.txt'
有什么区别.....
我想知:
第一種方法不能識別UNICODE編碼文件
UNICODE編碼文件是什么??
楼主能不能复几句出来呀???

2008-5-12 09:55
查看资料  发送邮件  发短消息 网志  OICQ (106942397)  编辑帖子  回复  引用回复

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


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



论坛跳转: