中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]遍历文件夹且将结果按顺序合并重命名输出文本
作者:
标题: [已结]遍历文件夹且将结果按顺序合并重命名输出文本 上一主题 | 下一主题
pkto
初级用户





积分 62
发帖 62
注册 2007-7-14
状态 离线
『楼 主』:  [已结]遍历文件夹且将结果按顺序合并重命名输出文本

如题:如何遍历文件夹,并且将遍历结果按顺序合并文件?
偶是个网文爱好者,经常将一些小说什么的下载,然后合并处理,最后放在电纸书或者手机上阅读,现就文本合并问题提以下要求,请达人帮助解决:

================================
1、下载的文件有各种格式,有php txt htm asp等,按各自小说名下载至小说名的文件夹下。如:《星际浪子》、《寻秦记》等,通通默认在“E:\黄易\”这个总文件夹内。要求:下载完后,遍历“黄易”这个文件夹,将所有不同扩展名的文件,全部更改为.txt为扩展名的文本文件;
  这个可用如下批处理解决:
for /r %%i in (.) do (
ren *.* *.txt)
exit
================================

2、遍历“黄易”总文件夹,将所有文本文件合并,合并要求:
  按1.txt,2.txt,3.txt,4.txt……10.txt,11.txt……20.txt……100.txt……如此顺序。(一般简单的bat合并顺序是1.txt,10.txt,2.txt,20.txt的顺序,这不符合要求);
  排序代码(是借鉴youxi01大大的):
@echo off
setlocal enabledelayedexpansion

if "%2"=="" (
    for /f "tokens=2 delims=#" %%i in ('"%~0" %1 OK^|sort') do echo %%i
) else (
    for /f %%i in (%1) do (
       call :CheckNum %%i Res
       echo !Res!#%%i)
    goto :eof)

pause>nul

:CheckNum num Res
   set/a Res=0
   for /l %%i in (0 1 1000) do (
      set "var=%~1"
      set tmp=!var:~%%i,1!
      if "!tmp!"=="" goto :eof
      set/a Res+=1
)
================================

3、将合并成的文件,自动命名为文件夹名称,如:《星际浪子》文件夹的的文本文件合并后,自动命名为:《星际浪子》.txt,并且自动move到“黄易”这个总文件夹根目录下。
  提供一下自动命名(假设合并后的文本文件为a.txt)并转移代码:
for /r %%i in (.) do (
cd.>"%%i\%%~ni.txt"
copy a.txt "%%i\%%~ni.txt"
del a.txt
move "%%i\%%~ni.txt"  E:\黄易\
)
exit
================================

以上需求要在一个批处理中(cmd环境下)解决,请各位版主、钻石、铂金、高人予以帮助!

[ Last edited by HAT on 2009-1-16 at 01:04 ]

2009-1-15 17:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  



  Quote:
请各位版主、钻石、铂金、高人予以帮助!

除了这些人,不接受其他人的帮助?



2009-1-15 22:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 3 楼』:  我可是新手

@echo off&setlocal enabledelayedexpansion
::本批处理可指定目录A下的所有子目录的文件,以最小目录为单位,合并到以最小目录为文件名的.txt文件
::放到批定的目录A内
if '%1'=='' echo 请把要处理的总目录拖到本批处理上!&echo 或在命令行指明总目录!&pause&exit
set sourcd=%cd%
pushd %1
set cdname=%cd%
echo.
for /f "tokens=* delims=" %%a in ('dir /ad /s /b') do (
        echo.
        setlocal enabledelayedexpansion
        set cucd=%%a
        set cucd=!cucd:\= !
        for %%d in (!cucd!) do set cucd=%%d
        pushd "%%a"
        echo 正在处理 %%a 目录。。。。。。
                for /f "tokens=* delims=" %%i in ('dir /b') do (
                        set na=1111111111111111111111111111112%%i
                        set na=!na:~-30!
                        set _!na!=a
                )
                        if exist %cdname%\!cucd!.txt (set /p in=!cucd!.txt已存在,按"0"回车跳过,其它忽略)
                        if not !in!=="0" (if not "!na!"=="" cd. >%cdname%\!cucd!.txt)

                for /f "tokens=* delims=" %%l in ('set _') do (
                        set fn=%%l
                        set fn=!fn:*2=!
                        set fn=!fn:~0,-2!
                        if not "!in!"=="0" type "!fn!" >>%cdname%\!cucd!.txt
                )
        if exist %cdname%\!cucd!.txt (echo    文件已经合并到%cdname%\!cucd!.txt) else (echo %%a 目录为空)
        echo.
        popd

        endlocal
)

pushd %sourcd%
cd
pause

[ Last edited by netbenton on 2009-1-16 at 22:34 ]

   此帖被 +9 点积分     点击查看详情   
评分人:【 HAT 分数: +2  时间:2009-1-16 01:04
评分人:【 moniuming 分数: +5  时间:2009-1-16 10:38
评分人:【 pkto 分数: +2  时间:2009-1-20 09:46




精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-15 23:54
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
pkto
初级用户





积分 62
发帖 62
注册 2007-7-14
状态 离线
『第 4 楼』:  



  Quote:
除了这些人,不接受其他人的帮助?  

呵呵,hat老大,高人,就是指的其他人了啦

2009-1-16 00:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pkto
初级用户





积分 62
发帖 62
注册 2007-7-14
状态 离线
『第 5 楼』:  

非常感谢netbenton兄,代码经验证,完全可行!而且很精练!兄台是高人哪!

2009-1-16 00:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: