Board logo

标题: [文件操作] [已解决]批处理如何分类文件? [打印本页]

作者: qw8334936    时间: 2015-3-17 04:21     标题: [已解决]批处理如何分类文件?

我新手,不入流动,最近想给电脑中的文件分类。于是写了一下代码(就是满处抄的)
目前可以用,但是功能有个缺陷 它只能按扩展名分类。
所以在此我想求助大神们

1.可以不可以让他对 其他文件分类。就是指定扩展名以外的文件
2.可不可以在 上一个功能的基础上,再让其按照一定规律 或者说是 关键词分类!

例如: 某目录下, 电视剧 封神榜,01 02 03 04....  济公传 01 02 03 04....  均为.RMVB文件,
可不可以在其 按照扩展名分类的基础上 再检索关键字为 封神榜 自动对 封神榜   
减速关键字为 济公传 对济公传 进行归类
效果如下
自己满处抄来的代码 现在只能按扩展名分类。
如代码有什么不妥之处,也请大神们指出。我虚心接受!
PS 自己用,并非商业目的。感觉强大的批处理代码可以完成!

  这样表示应该清楚我想做什么了吧。就是文件太多。一个一个分太费劲!
  1. 执行前-----某目录\*\*\*\*\*.*  N多个
  2. 执行后-----某目录\完成\扩展名\关键字\*关键字*.*
  3. 执行后-----某目录\完成\扩展名\*.*(无关键字的)
  4. 执行后-----某目录\完成\其他\关键字\*关键字*.*
  5. 执行后-----某目录\完成\其他\*.*(无关键字的
复制代码
其实我用的代码就这一点儿,但是匹配关键字我不会了,也没找到。
感谢15楼 15# apang 的大神
读懂了我的要求,解决了我的问题!  当然也很感谢其他几位大神。也许你们把我的问题想复杂了。
现将我改动过的代码发出来以表敬意(由于需要改动)

成品代码
  1. @echo off&color 0a&title %~n0【高级版】by: 批处理之家大神【apang】  ^|当前时间:%time:~0,5%
  2. ::定义关键字和扩展名
  3. echo+
  4. echo+ 本程序由【批处理之家】大神【apang】制作。
  5. echo+
  6. set /p keyWord=<D:\备份\关键字.ini
  7. set "DstDir=完成"
  8. for %%a in (jpg bmp gif jpe png jpeg) do set ".%%a=图片"
  9. for %%a in (txt doc dot docx pdf ppt pot pps) do set ".%%a=其他\文本"
  10. for %%a in (wmv rmv rmvb rm mp4 mkv avi wm wmp) do set ".%%a=电影"
  11. for %%a in (flv 3gp ram mov mpg mpeg swf) do set ".%%a=电影\手机格式"
  12. set ".torrent=其他\种子"
  13. for %%a in (rar zip 7z) do set ".%%a=程序\压缩包"
  14. for %%a in (mp3 aac wav) do set ".%%a=音乐"
  15. for %%a in (ini gl) do set ".%%a=配置"
  16. set /p a=请选择是否整理可执行文件(整理请输入Y):
  17. if /i "%a%"=="Y" for %%a in (exe  bat) do set ".%%a=程序"
  18. if /i "%a%"=="y" for %%a in (exe  bat) do set ".%%a=程序"
  19. :Lp
  20. if exist "%DstDir%\" (set /p DstDir=目标目录已存在,请重新指定: & goto :Lp )
  21. ::执行分类
  22. for /f "delims=" %%a in ('dir /a-d /b /s') do (
  23.     if /i "%%a" NEQ "%~f0" (
  24. setlocal enabledelayedexpansion
  25.         set "fPath=%%a"
  26.         set "fName=%%~na"
  27. if defined %%~xa (
  28. for %%b in ( %keyWord% ) do (
  29. if "!fName:%%~nb=!" NEQ "!fName!" (
  30. md "%DstDir%\!%%~xa!\%%~nb\"
  31. move "!fPath!" "%DstDir%\!%%~xa!\%%~nb\"
  32. ) )
  33. md "%DstDir%\!%%~xa!\"
  34. move "!fPath!" "%DstDir%\!%%~xa!\"
  35. ) else (
  36. md "%DstDir%\其他\"
  37. move "!fPath!" "%DstDir%\其他\"
  38. )  
  39. endlocal
  40. ) ) 2>nul
  41. ::删除空目录
  42. cls&echo+&echo+ 分类完成,稍后自动退出
  43. for /f "tokens=*" %%i in ('dir/s/b/ad^|sort /r') do rd "%%i" >nul 2>nul
  44. ping -n 2 127.1 >nul
复制代码
再次感谢大姐的帮助。
作者: pcl_test    时间: 2015-3-17 13:47

本帖最后由 pcl_test 于 2015-3-17 13:48 编辑

回复 1# qw8334936
自动提取关键字是个难题,文件名如果杂乱无章,那就没得搞,如封神榜01、 封神榜02、xx济公传01、xx济公传02,那么怎么让程序截取文件名的关键字呢?只能分两次截取而且是要在代码中指定截取方法(如封神榜,截取文件名前三个字符为关键字,然后再去匹配其他文件,而济公传,截取文件名第3~5的字符为关键字,然后再去匹配其他文件文件越多),文件名越杂乱无章,就要在代码中指定多少种截取方法,因为没有截取的共同性,不能用同种截取方法去截取,截取不当,那么在匹配时又会有不同的结果,不过要是能提供关键字列表,让代码以列表里的关键字去匹配,那就容易很多
作者: CrLf    时间: 2015-3-17 14:14

回复 2# pcl_test


    换个方向思考
作者: CrLf    时间: 2015-3-17 15:58

试试:
  1. @echo off
  2. cd /d "某目录"
  3. for %%a in (*.*) do (
  4.    set "basename=%%~na"
  5.    set "extensionname=%%~xa"
  6.    setlocal enabledelayedexpansion
  7.    for /l (1 1 9) do if !basename:~-1! geq 0 if !basename:~-1! leq 9 basename=!basename:~,-1!
  8.    md "完成\!extensionname!\!basename!"
  9.    move /y "!basename!*!extensionname!" "完成\!extensionname!\!basename!\"
  10.    endlocal
  11. )
复制代码

作者: pcl_test    时间: 2015-3-17 19:29

本帖最后由 pcl_test 于 2015-3-17 19:35 编辑

回复 4# CrLf

这个只能匹配文件名后面是数字的,也不是精确匹配,如1封神榜01、2封神榜02、封神榜01A、封神榜01A应该移到同一文件夹的却分在四个不同文件夹,还是列出关键字列表(指定关键字)来进行匹配最好
作者: pcl_test    时间: 2015-3-17 19:30

回复 3# CrLf

求指点
作者: CrLf    时间: 2015-3-17 21:07

回复 5# pcl_test


    哦,我是按顶楼例子写的,要是什么都得考虑就没法做了,反正楼主必须提供一条明确的规律
    题外话,如果是个商业软件,其实也可以在线获取所有的电影电视剧作品名字(考虑到外国片,再考虑到别名,这个数量我就呵呵了),按长度逆序一下,然后再根据列表中的名字比对文件,这样应该是最通用的了
作者: pcl_test    时间: 2015-3-17 21:24

回复 7# CrLf
呵呵,所以才说“文件名如果杂乱无章,那就没得搞”
作者: CrLf    时间: 2015-3-17 21:36

回复 8# pcl_test


    嗯
作者: qw8334936    时间: 2015-3-18 08:52

回复 5# pcl_test

不用很具体,我那个代码不是已经可以把读取的文件名 按扩展名筛选了吗
我的意思是,在这个代码中,筛选过扩展名的 变量,再进行一下关键字筛选。 关键字范围搜索就行。
即 在已知的扩展名变量 内 搜索 含关键字 的文件 就行。  不用保证完全符合。


执行前-----某目录\*\*\*\*\*.*  N多个
执行后-----某目录\完成\扩展名\关键字\*关键字*.*
执行后-----某目录\完成\扩展名\*.*(无关键字的)
执行后-----某目录\完成\其他\关键字\*关键字*.*
执行后-----某目录\完成\其他\*.*(无关键字的
这样表示能理解了不

PS 就是我电脑里有些电影 2TB左右呢,N多文件夹,N层 每次进的麻烦。 所以想整理下。  
已经用我发的代码 分入扩展名了。  就是想可不可在一个批处理内 让这两种操作同时执行。
作者: CrLf    时间: 2015-3-20 13:29

目录是已经建好了就等着往里塞文件吗?
作者: qw8334936    时间: 2015-3-20 13:49

本帖最后由 qw8334936 于 2015-3-20 13:56 编辑

回复 11# CrLf
目录是代码自己建立的
  1. 定义关键字 变量gjz
  2. 定义扩扎名类型
  3. call :gl 文件夹名
  4. exit
  5. :gl
  6. echo+【%1】整理中,请稍后...
  7. for /r  %%i  in (%a%) do   (
  8.         If Not "%%~nxi"=="%~nx0" (
  9.         ::在这里加入搜索关键字的代码,符合就执行移动到        %b%\%1\关键字
  10.         ::不符合关键字的 继续执行下面的代码
  11.                 md %b%\%1  >nul 2>nul
  12.                 move /y  "%%i" "%b%\%1"  >nul 2>nul
  13.         )
  14. )        
复制代码

作者: qw8334936    时间: 2015-3-20 15:01

回复 13# tigerpower
这是帮我呢,还是广告呢。你难道没看到我的要求吗!

我就是把电影分类一下。而已。我觉得你不会手动去分类以TB为单位计算的电影资料吧。(虽然我是家用。但是我好收集电视剧)
作者: apang    时间: 2015-3-20 16:49

本帖最后由 apang 于 2015-3-22 21:51 编辑
  1. @echo off
  2. set "keyWord=济公传 xxx yyy"
  3. set "DstDir=完成"
  4. for %%a in (jpg bmp gif jpe png jpeg) do set ".%%a=图片"
  5. for %%a in (txt doc dot docx pdf ppt pot pps) do set ".%%a=其他\文本"
  6. for %%a in (wmv rmv rmvb rm mp4 mkv avi wm wmp) do set ".%%a=电影"
  7. for %%a in (flv 3gp ram mov mpg mpeg swf) do set ".%%a=电影\手机格式"
  8. set ".torrent=其他\种子"
  9. for %%a in (rar zip 7z) do set ".%%a=程序\压缩包"
  10. for %%a in (mp3 aac wav) do set ".%%a=音乐"
  11. for %%a in (ini gl) do set ".%%a=配置"
  12. set /p a=请选择是否整理可执行文件(整理请输入Y):
  13. if /i "%a%"=="Y" for %%a in (exe com bat) do set ".%%a=程序"
  14. :Lp
  15. if exist "%DstDir%\" (
  16.         set /p DstDir=目标目录已存在,请重新指定:
  17.         goto :Lp
  18. )
  19. for /f "delims=" %%a in ('dir /a-d /b /s') do (
  20.         if /i "%%a" NEQ "%~f0" (
  21.                 if defined %%~xa (
  22.                         set "fPath=%%a"
  23.                         set "fName=%%~na"
  24.                         setlocal enabledelayedexpansion
  25.                         set "fd=%DstDir%\!%%~xa!"
  26.                         for %%b in (%keyWord%) do (
  27.                                 if "!fName:%%b=!" NEQ "!fName!" set "fd=%DstDir%\!%%~xa!\%%b"
  28.                         )
  29.                         md "!fd!"
  30.                         move "!fPath!" "!fd!\"
  31.                         endlocal
  32.                 )
  33.         )
  34. ) 2>nul
  35. ::删除空目录
  36. for /f "tokens=*" %%i in ('dir/s/b/ad^|sort /r') do rd "%%i" >nul 2>nul
  37. pause
复制代码

作者: 523066680    时间: 2015-3-20 17:25

回复 14# qw8334936


    他是在帮你。
作者: qw8334936    时间: 2015-3-21 04:22

回复 15# apang

很感谢大神你懂我的意思,但是能再改一下吗?关键字可否支持多个?
  1. set gjz=三国  水浒 西游 聊斋 ********更多
复制代码

作者: qw8334936    时间: 2015-3-21 05:55

回复 16# 523066680

感谢版主大人光临




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2