中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创][BAT]DOS下的文本遍历和文件遍历代码(6个)
« [1] [2] »
作者:
标题: [原创][BAT]DOS下的文本遍历和文件遍历代码(6个) 上一主题 | 下一主题
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『楼 主』:  [原创][BAT]DOS下的文本遍历和文件遍历代码(6个)


:: VisitF.bat - 对指定路径指定文件进行遍历的程序
:: 第一参数为要遍历的文件(支持通配符),第二参数为要遍历的路径(缺省为C盘根)
@echo off

:main
if [%1]==[] if not exist filelist.txt goto end

:init
if exist filelist.txt if exist xset.asd goto loop
set file=%1
set base=%2
if [%2]==[] set base=c:
dir %base%\%file% /s /a /b > filelist.txt
echo e 100 ''set file='' > xset.asd
echo w >> xset.asd
echo q >> xset.asd

:loop
fc filelist.txt nul /n | find " 1:" > setfile.bat
if errorlevel 1 goto restore
debug setfile.bat  nul
call setfile.bat
echo Visiting the file: %file%
:: User specified visit code replace this line
find "%file%" /v  filelist.tx2
copy filelist.tx2 filelist.txt > nul
goto loop

:restore
if exist filelist.txt del filelist.txt
if exist xset.asd del xset.asd
if exist filelist.tx2 del filelist.tx2
if exist setfile.bat del setfile.bat

:end
[ Last edited by willsort on 2006-7-29 at 20:51 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-2-11 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 2 楼』:  


:: VisitD.bat - 对指定路径指定目录进行遍历的程序
:: 第一参数为要遍历的目录(支持通配符),第二参数为要遍历的路径(缺省为C盘根)
@echo off

:main
if [%1]==[] if not exist dirlist.txt goto end

:init
if exist dirlist.txt if exist xset.asd goto loop
set dir=%1
set base=%2
if [%2]==[] set base=c:
dir %base%\%dir% /s /ad /b > dirlist.txt
echo e 100 'set  dir=' > xset.asd
echo w >> xset.asd
echo q >> xset.asd

:loop
fc dirlist.txt nul /n | find " 1:" > setdir.bat
if errorlevel 1 goto restore
debug setdir.bat  nul
call setdir.bat
echo Visiting the dir: %dir%
:: User specified visit code replace this line
find "%dir%" /v  dirlist.tx2
copy dirlist.tx2 dirlist.txt > nul
goto loop

:restore
if exist dirlist.txt del dirlist.txt
if exist xset.asd del xset.asd
if exist dirlist.tx2 del dirlist.tx2
if exist setdir.bat del setdir.bat

:end
[ Last edited by willsort on 2006-7-29 at 20:46 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-2-11 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 3 楼』:  


:: VisitL.bat - 对指定文件列表中的文件进行遍历的程序
:: 参数为要遍历的文件列表
@echo off

:main
if [%1]==[] if not exist filelist.txt goto end

:init
set filelist=%1
if [%1]==[] set filelist=filelist.txt
if not exist %filelist% goto end
copy %filelist% filelist.tx1 > nul
if exist xset.asd goto loop
echo e 100 'set file=' > xset.asd
echo w >> xset.asd
echo q >> xset.asd

:loop
fc filelist.tx1 nul /n | find " 1:" > setfile.bat
if errorlevel 1 goto restore
debug setfile.bat  nul
call setfile.bat
echo Visiting the file: %file%
:: User specified visit code replace this line
find "%file%" /v  filelist.tx2
copy filelist.tx2 filelist.tx1 > nul
goto loop

:restore
if exist xset.asd del xset.asd
if exist filelist.tx1 del filelist.tx1
if exist filelist.tx2 del filelist.tx2
if exist setfile.bat del setfile.bat

:end
[ Last edited by willsort on 2006-7-29 at 20:47 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-2-11 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
Kinglion
铂金会员

痴迷DOS者


积分 5792
发帖 1921
注册 2003-6-20
来自 金獅電腦軟體工作室
状态 离线
『第 4 楼』:  

楼主真是批处理高手,也可以称为批处理专家了。佩服!佩服!



熟能生巧,巧能生精,一艺不精,终生无成,精亦求精,始有所成,臻于完美,永无止境!
金狮電腦軟體工作室愿竭诚为您服务!
QQ群:8393170(定期清理不发言者)
个人网站:http://www.520269.cn
电子邮件:doujiehui@vip.qq.com
微信公众号: doujiehui
2004-2-12 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (79207959)  编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 5 楼』:  


:: VisitI.bat - 对指定路径指定DIR信息的文件进行遍历操作的的程序
:: 第一参数为指定的DIR信息项,第二参数为要遍历的路径(缺省为当前路径)
:: 注意:DIR信息项可以是文件名,扩展名,日期,时间等DIR命令提供的目录信息项
::          可以同时使用多项,但必须加一对引号,参数格式也须严格符合DIR的信息格式
@echo off

:main
if [%1]==[] goto end

:init
if exist filelist.txt if exist xset.asd goto loop
set info=%1
set base=%2
if [%2]==[] set base=.
dir %base%\. /s /a /b > filelist.txt
echo e 100 ''''set file='''' > xset.asd
echo w >> xset.asd
echo q >> xset.asd

:loop
fc filelist.txt nul /n | find " 1:" > setfile.bat
if errorlevel 1 goto restore
debug setfile.bat  nul
call setfile.bat
dir "%file%" | find %info% > nul
if not errorlevel 1 echo Visit file: "%file%"
:: if not errorlevel 1
find "%file%" /v  filelist.tx2
:: "%file%" 参数决定了所匹配的子目录下的所有文件和目录均不会再次匹配
copy filelist.tx2 filelist.txt > nul
goto loop

:restore
if exist filelist.txt del filelist.txt
if exist xset.asd del xset.asd
if exist filelist.tx2 del filelist.tx2
if exist setfile.bat del setfile.bat
set info=
set file=
set base=

:end

[此贴子已经被作者于2004-2-26 5:14:59编辑过]



[ Last edited by willsort on 2006-7-29 at 20:47 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-2-26 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
笑傲江湖
初级用户

鹰击长空


积分 271
发帖 61
注册 2003-8-20
状态 离线
『第 6 楼』:  

请教:
if exist filelist.txt if exist xset.asd goto loop
set info=%1
set base=%2
是什么意思?哪里可找到的关批处理操作的资料?



适合的,就是最好的!
DOS,永远的初恋情人。
2004-2-26 00:00
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 7 楼』:  

Re 笑傲江湖:

    if exist filelist.txt if exist xset.asd goto loop
    rem 如果同时存在文件 filelist.txt 和 xset.asd 则转向 loop 开始循环

    set info=%1
    rem 将第一参数 %1 赋给环境变量 info

    set base=%2
    rem 将第二参数 %2 赋给环境变量 base

  批处理操作的资料,基础知识可以从网络上的dos教程中找到,中级和高级技巧则必须依靠多看多改多编来获得。从99年以前的旧电脑杂志上应该可以找到不少关于批处理编程的技巧,本站以及一些dos论坛也往往有很多经典的批处理程序可供研摩参考。先给你一个链接吧。

    http://model.chinajewelry.net/dos/dosbbs/dispbbs.asp?boardID=12&ID=8905



[此贴子已经被作者于2004-2-27 13:50:18编辑过]






※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-2-27 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
龙王
银牌会员




积分 1186
发帖 334
注册 2003-5-30
状态 离线
『第 8 楼』:  

很有用的批处理
通过这个帖子跟楼主学到不少技巧
不过有些明白
有些命令行不是很懂
还要多看几遍
如果都象你对笑傲江湖解释的那样
简直是经典教程菜鸟的福音
尽管如此还是太感谢了



2004-4-20 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (3113983)  编辑帖子
Kinglion
铂金会员

痴迷DOS者


积分 5792
发帖 1921
注册 2003-6-20
来自 金獅電腦軟體工作室
状态 离线
『第 9 楼』:  

7 楼的地址现在应该是:
http://dos.e-stone.cn/dosbbs/dispbbs.asp?boardID=12&ID=8905
欢迎大家支持楼主。



熟能生巧,巧能生精,一艺不精,终生无成,精亦求精,始有所成,臻于完美,永无止境!
金狮電腦軟體工作室愿竭诚为您服务!
QQ群:8393170(定期清理不发言者)
个人网站:http://www.520269.cn
电子邮件:doujiehui@vip.qq.com
微信公众号: doujiehui
2004-4-21 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (79207959)  编辑帖子
龙王
银牌会员




积分 1186
发帖 334
注册 2003-5-30
状态 离线
『第 10 楼』:  



  Quote:
以下是引用Kinglion在2004-4-21 16:16:08的发言:
7 楼的地址现在应该是:
http://dos.e-stone.cn/dosbbs/dispbbs.asp?boardID=12&ID=8905
欢迎大家支持楼主。

太好了
感谢

2004-4-21 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (3113983)  编辑帖子
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 11 楼』:  

Re WillSort:我在Windows 20003的dos方式下试验第一个程序不能通过,但原理基本上是搞明白了。通过fc提取出第一个文件,然后通过debug修改setfile.bat第一行文件名前面的字符为set file=,然后执行该批处理获得需要的环境变量。但在2003下有这样两个问题:1、fc不能将文件与nul设备进行比较,因此可以用另一个空文件来代替。2、debug不能正确修改setfile.bat,我找不到解决办法,因为对debug太不熟悉了。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-10-15 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 12 楼』:  


:: Visit.bat - 文件遍历批处理程序
:: Will Sort - 10/17/2004 - V2
::
:: 程序用途:
::     对指定文件集/目录集/文件列表执行指定操作
::
:: 命令行说明:
::     1. VISIT 文件集/目录集 [参数]
::        对文件集/目录集执行指定操作
::     2. VISIT @ 文件列表
::        对指定文件列表中的文件执行指定操作
::         
:: 注意事项:
::     - 文件集/目录集 中可包含有效路径和通配符
::     - 路径缺省为当前路径,文件集缺省为 *.* (并非所有文件)   
::     - 文件集/目录集 含空格时需用双引号引起
::     - [参数] 支持的DIR开关: /S /A /O /L等不与 /B 冲突者
::     - [参数] 不支持的DIR开关: /W /P /V 等与 /B 冲突者
::     - [操作] 由调用者预先写入 visitcmd.bat 中
::     - [操作] 中使用 %VisitFile% 引用遍历文件
::     - 程序检查检查 [文件列表] 是否存在,但不检查它是否有效
::     - 不遍历隐藏/系统目录下的目录和文件(在命令行中指定时例外)
::
:: 用法示例:
::     visit c:\ /ad /s             遍历C盘所有目录,包含子目录
::     visit "C:\My document" /a-d  遍历"C:\My document"下所有文件
::     visit C:\*.zip /a /s         遍历C盘所有.zip压缩包,包含子目录
::     如想遍历多个文件/目录集,可多次使用"DIR 文件集 /a /s>>文件列表"
:: 生成一个完整的文件列表,再使用文件列表进行遍历;或者使用VisitCE.Bat
::     在遍历未显式指定的隐藏/系统目录时,可以用"attrib 文件集 /s"生成
:: 文件列表,然后在visitcmd.bat的代码中引用%VisitFile%第三至最后的串,
:: 再使用文件列表进行遍历
::
:: 测试报告:
::     在 Win98 命令行方式下有限黑箱测试通过
::     性能仍然是最大的瓶颈
::         
@echo off
if "%1"=="@" goto CopyList

:MakeList
dir /b %1 %2 %3 %4 %5 %6 > ~visit.lst
find "~visit.lst" /v < ~visit.lst > ~visit.tmp
if not errorlevel 1 copy ~visit.tmp ~visit.lst>nul
goto MakePreLine

:CopyList
if not [%2]==[] if exist %2 copy %2 ~visit.lst>nul
if not exist ~visit.lst goto End

:MakePreLine
echo set VisitFile=> ~visit.pre
for %%c in (rcx e w q) do echo %%c>> ~visit.asd
debug ~visit.pre < ~visit.asd > nul
if [%OS%]==[Windows_NT] chcp 936 > nul

:LoopVisit
copy ~visit.pre+~visit.lst ~visit.tmp > nul
find "set VisitFile=" < ~visit.tmp > ~visit.bat
call ~visit.bat
if "%VisitFile%"=="" goto Clear
if not exist visitcmd.bat echo Visiting %VisitFile%
if exist visitcmd.bat call visitcmd.bat
find "set VisitFile=" /v < ~visit.tmp > ~visit.lst
goto LoopVisit

:Clear
del ~visit.*
set VisitFile=

:End
[ Last edited by willsort on 2005-8-14 at 22:44 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-10-18 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 13 楼』:  


:: VisitCE.bat - 文件遍历批处理程序命令行增强版
:: Will Sort - 10/17/2004 - V2CE
::
:: 程序用途:
::     对指定路径/文件列表下的指定文件/目录集执行指定操作
::
:: 命令行说明:
::     1. VISIT [路径1 路径2...] [开关1 开关2...] [文件集1 文件集2...]
::        对 [路径] 和 [开关] 限定下的 [文件集] 执行指定操作
::     2. VISIT @ 文件列表1 [文件列表2...]
::        对指定 [文件列表] 中的文件执行指定操作
::         
:: 注意事项:
::     - [路径] [参数] [文件集] 均可不选或多选
::     - [路径] 中不可包含通配符,[文件集] 中可包含有效路径和通配符
::     - [路径] 缺省为当前路径,[文件集] 缺省为 *.* (并非所有文件)   
::     - [路径] [文件集] 含空格时需用双引号引起
::     - [参数] 支持的DIR开关: /S /A /O /L等不与 /B 冲突者
::     - [参数] 不支持的DIR开关: /W /P /V 等与 /B 冲突者
::     - [操作] 由调用者预先写入 visitcmd.bat 中
::     - [操作] 中使用 %VisitFile% 引用遍历文件
::     - 程序检查检查 [文件列表] 是否存在,但不检查它是否有效
::     - 不遍历隐藏/系统目录下的目录和文件(在命令行中指定时例外)
::
:: 用法示例:
::     visit c:\ /ad /s             遍历C盘所有目录,包含所有子目录
::     visit "C:\My document" /a-d  遍历"C:\My document"下所有文件
::     visit c:\ d:\ e:\ /s /a /on  遍历C,D,E中所有文件,并按文件名排序
::     visit \ /a                   遍历当前盘根目下所有文件和目录
::     在遍历未显式指定的隐藏/系统目录时,可以用"attrib 文件集 /s"生成
:: 文件列表,然后在visitcmd.bat的代码中引用%VisitFile%第三至最后的串,
:: 再使用文件列表进行遍历
::
:: 测试报告:
::     在 Win98 命令行方式下有限黑箱测试通过
::     性能仍然是最大的瓶颈
::         
@echo off
if "%1"=="$" goto MakeList
if "%1"=="@" goto CopyList
if "%1"=="" goto End

set VisitCommand=%0
:GetArgu
:GetPath
    if not exist %1.\nul goto GetSwitch
    set VisitPath=%VisitPath% %1
    goto GetNext
:GetSwitch
    echo %1 | find "/" > nul
    if errorlevel 1 goto GetFilter
    set VisitSwitch=%VisitSwitch% %1
    goto GetNext
:GetFilter
    echo %1 | find "*" > nul
    if not errorlevel 1 goto SetFilter
    echo %1 | find "?" > nul
    if errorlevel 1 goto End
    :SetFilter
        set VisitFilter=%VisitFilter% %1
:GetNext
    shift
if not [%1]==[] goto GetArgu

%VisitCommand% $ %VisitFilter%

:MakeList
if not [%VisitPath%]==[] goto ForMake
:DirMake
    dir %2 /b %VisitSwitch% >> ~visit.lst
    goto MakeNext
:ForMake
    for %%p in (%VisitPath%) do dir %%p.\%2 /b %VisitSwitch% >> ~visit.lst
:MakeNext
    shift
if not [%2]==[] goto MakeList
find "~visit.lst" /v < ~visit.lst > ~visit.tmp
if not errorlevel 1 copy ~visit.tmp ~visit.lst>nul
goto MakePreLine

:CopyList
if not [%2]==[] if exist %2 type %2>>~visit.lst
shift
if not [%2]==[] goto CopyList

:MakePreLine
if not exist ~visit.lst goto End
echo set VisitFile=> ~visit.pre
for %%c in (rcx e w q) do echo %%c>> ~visit.asd
debug ~visit.pre < ~visit.asd > nul
if [%OS%]==[Windows_NT] chcp 936 > nul

:LoopVisit
copy ~visit.pre+~visit.lst ~visit.tmp > nul
find "set VisitFile=" < ~visit.tmp > ~visit.bat
call ~visit.bat
if "%VisitFile%"=="" goto Clear
if not exist visitcmd.bat echo Visiting %VisitPath% %VisitSwitch% %VisitFilter% - %VisitFile%
if exist visitcmd.bat call visitcmd.bat
find "set VisitFile=" /v < ~visit.tmp > ~visit.lst
goto LoopVisit

:Clear
for %%f in (~visit.*) do del %%f
for %%e in (Command Path Switch Filter File) do set Visit%%e=

:End
[ Last edited by willsort on 2005-8-14 at 22:48 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-10-18 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 14 楼』:  

Re Climbing:

  在2000sp4 下出现类似的问题,第二个问题实际上也是fc的不兼容问题,他在按行
号显示时,每行文字前有8 个字节位,而不是dos6和win9x 下的9 个,所以解决起来也
很简单,将debug 脚本中的 e 100 'set file='改为 e 100 'set fil=' 即可。


  但是,这只是就事论事而已,以上的提到的三个批处理,只是我在dos6.22 下练兵
用的试验原型,做得很粗糙,自从今年3 月份正式转向win98 之后,使用中遇到了很多
新问题,比如文件名包含空格的问题,系统/ 隐藏属性目录的问题;在nt下使用,又遇
到了中文文件名的问题;而且由于循环体中使用了过多的文本流控制,导致了效率的严
重低下;另外,三个程序功能上和实现上并没有太大的差别,没有拆分的必要。

  综所上述,将以上代码重写就成为必须。合并代码,弥补漏洞,改善性能,书写文
档,就出现了所谓的 V2 版,这中间其实并没有花很多功夫。

  然而,一个偶然的下午,突然心血来潮,何不将visit 的命令行功能做一下增强,
比如支持多个路径、多个过滤器(filter)、多个文件列表,原想只是加一个命令行参数
分析循环,然而真正实现起来,却再次体会到了命令行的复杂,if for嵌套时冲定向输
出,判定目录时根目录与子目录的不同,for 对过滤器的低能替换(win9x/dos) ,一个
个新问题摩肩接踵,层出不穷,竟然整整耗了我大半个工作日的时间,才勉强实现了一
个粗糙的版本,这就是所谓的 V2CE 版,对与严格的测试我没有多大的信心。

  现在,再回头看我的工作,其实那个 V2CE 版其实是没有多大的应用价值。多个路
径和过滤器,完全可以通过多次调用visit 来实现,而且实际上,我们大多数情况下只
用一个路径和过滤器;而且,多参数控制带来了易用度的下降,用户总是对参数繁多的
程序有一定的心理障碍,我个人对dos 压缩软件的爱好,从高到低依次是rar,zip,arj,
易用度就是第一靠量;另外,最重要的是,多参数控制导致了代码量和复杂性的大幅提
升,这个程序一度让我钻进了if for构建的幽魂迷宫而不知南北西东,程序的可读性越
来越差,调试起来也越来越困难,同时兼容性上拉上了更多的绊马索。

  这些,就是功能提升所付出的代价,虽然这只是一个比较极端的例子,但是功能与
简洁的平衡在程序设计的其重要性可见一斑。亲和性的界面并不意味着亲和性的代码,
人性化的需求并不意味着人性化的实现,一味将使用方的复杂性转嫁给设计者(比如
Windows), 并不是一个很聪明的主意,反之亦然(比如Linux ),这尚不考虑代码功
能增强对设计方和使用方的双重施压。

  “复杂创造简单(complex makes simple)”,诚然!


[ Last edited by willsort on 2005-8-14 at 22:53 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-10-18 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子
hq1966
新手上路





积分 2
发帖 1
注册 2005-12-4
来自 hn
状态 离线
『第 15 楼』:  

  好厉害,存下来认真学习。
  谢谢willsort版主。

2005-12-4 22:19
查看资料  发送邮件  发短消息 网志   编辑帖子
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: