如何使用批处理读取文本文档的固定行的内容并顺序添加到一个新的文本文档中?

比如说我的D盘中有一个文件夹,存放了很多文本文档。我想把这些文档的第二行的内容都读出来,然后全部顺序分行添加到一个新的文本文档中去。应该怎么操作?请告诉我具体的代码,和每行代码的意思。感激不尽!!!给予100分的奖励!
具体的例子:
D:\man\*.txt
都读取其第二行,然后存入一个新的文本文档>2.txt
请问如何实现?

'保存为vbs类型文件

'以下2种方法只需0~2毫秒处理完.所以只提供最快的一种方法
On Error Resume Next '防止整个程序意外中断
dim fso,f,read,file,sread,path,save,savefolder '声明变量
set fso=createobject("scripting.filesystemobject") '创建对象fso
path="d:\man"
set f=fso.getfolder("D:\man") '要读取的路径
savefolder=path&"\new folder" '保存的路径
save=savefolder&"\New.txt" '保存的文件
if dir(savefolder)="" then fso.createfolder savefolder '判断保存的文件夹是否存在.不存在则新建一个文件夹
'分割线
'----------------------------------------------------------
'方法1,去掉每行注释符号',就可以使用了.不过要注释掉方法2,只能任选其一
'for each i in f.files 'for循环查找目标路径的文件
'if fso.getextensionname(i)="txt" then '判断后缀名是否是txt类型文件
'read=split(fso.opentextfile(i).readall,vbcrlf) '读取全文并分割
'mkfile save&"/",read(1) '截取第2行,并创建文件到目标路径
'end if
'next

'方法2.方法2速度可能会比1快点.只是不容易看出来而已..
for each i in f.files 'for循环查找目标路径的文件
if fso.getextensionname(i)="txt" then '判断后缀名是否是txt类型文件
read=split(fso.opentextfile(i).readall,vbcrlf) '读取全文并分割
readstr=readstr&read(1)&vbcrlf '把要截取的内容储存到变量里
end if
next
readstr=left(readstr,len(readstr)-2) '删除文件末尾空行
mkfile save,readstr '写入并创建文件到目标路径

'-----------------------------------------------------------
'分割线
Function mkFile(ByVal File, ByVal Writes) '自定义函数mkfile(创建文件函数)
On Error Resume Next '发生错误时忽略中断,此代码是防止函数意外中断,和第一行不同.
If Right(File, 1) = "/" Then '判断字符串倒数第一个字是否有符号"/".如果有则....
fs = Replace(File, "/", "") '删除符号"/"
if dir(fs)="" then '判断文件是否存在,不存在则...
fso.Createtextfile(fs).Write Writes '新建文件,写入内容
exit function '退出函数
else '如果文件存在则...
sread = fso.opentextfile(fs).readall '读取目标文件...
If Right(sread, 2) <> vbCrLf And Len(sread) > 0 Then sread = sread & vbCrLf '判断第一行是否有回车符.没有则写入回车符
fso.Createtextfile(fs).Writeline sread & Writes '创建文件并写入内容到文件(追加新内容到文本末尾)
end if
else ' 如果字符串倒数第一个字不是符号"/",则...
fso.Createtextfile(File).Write Writes '创建文件并写入内容到文件(不追加新内容到文本末尾)
End If
End Function '函数结束
public function dir(byval exist) '判断文件(夹)存在函数
if fso.folderexists(exist&"\") then ' 判断文件夹是否存在
if fso.folderexists(exist) then dir=fso.getfolder(exist) else dir=""
else
if fso.fileexists(exist) then dir=fso.getfile(exist) else dir="" ' 判断文件是否存在
end if
end function

'==========================================
rem 分割线
'==========================================

rem 保存为bat类型文件

rem 方法1, 1秒~1.4秒处理完
@echo off&cd/d "d:\man"&md "New folder"
for /f "delims=" %%1 in ('dir /b "*.txt"')do (
for /f "tokens=2 delims=:" %%2 in ('type "%%1"^|findstr/n "."^|findstr "2"')do echo %%2>>"New folder\New.txt"
)
rem 2个for循环截取各个文件内容.一个负责查找文件,一个负责读取文件.给文件快速分行,快速确认目标行数,执行速度稍差.,是逐个文件读取,逐个输出

rem 方法2, 200~400毫秒处理完
@echo off&cd/d "d:\man"&md "New folder"
setlocal enabledelayedexpansion
for /f "delims=" %%1 in ('dir /b "*.txt"')do (set a=0
for /f "delims=" %%2 in ('type "%%1"')do (set/a a+=1
if !a!==2 echo %%2>>"New folder\New.txt"
))

rem 2个for循环截取各个文件内容.一个负责查找文件,一个负责读取文件.上面的!a!==2是第2行的意思,把每个文件第2行的内容输出到目标文件里,是逐个文件读取,逐个输出.
=====================
以上代码都是最快的算法
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-09
这个肯定最快,不过要用到一个第三方工具sed.exe
@echo off
del 2.txt 2>nul
for %%i in (d:\main\*.txt) do sed -n 2p "%%i">>2.txt

参考资料:百度搜索 “sed.exe 下载”

第2个回答  2012-05-09
版本一:忽略空行(注意:基于批处理的特殊性,^和!会被滤除)
优点:处理大的文本文件速度快。
@echo off&setlocal enabledelayedexpansion
for %%a in ("d:\man\*.txt") do set n=&call :sub "%%a"
goto :eof
:sub
for /f "usebackq delims=" %%i in ("%~1") do (
set /a n+=1
if "!n!"=="2" (
>>2.txt echo,%%i
goto :eof
))

版本二:计空行(不会滤除任何字符)
优点:处理大的文本文件速度快。
@echo off
setlocal enabledelayedexpansion
for %%a in ("d:\man\*.txt") do mshta vbscript:execute("set fs=CreateObject(""Scripting.FileSystemObject""):With fs.OpenTextFile(""%%~a"",1):.ReadLine:fs.OpenTextFile(""%cd%.\2.txt"",8,True).WriteLine(.ReadLine):End With:Window.Close")
第3个回答  2012-05-09
用load函数
相似回答