Board logo

标题: [文件操作] BAT怎样复制子文件夹下所有文件,重名文件自动重命名为“文件名1”“文件名2”? [打印本页]

作者: 86223125    时间: 2013-11-6 14:07     标题: BAT怎样复制子文件夹下所有文件,重名文件自动重命名为“文件名1”“文件名2”?

本帖最后由 86223125 于 2013-11-6 14:30 编辑
  1. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. ::功能简介:           
  3. ::搜索并复制一个或多个磁盘中的某一类型(后缀名)的文件
  4. ::搜索并复制某文件夹及其子文件夹下某类文件
  5. ::文件将被复制到本bat所在目录下的一新建文件夹中
  6. ::自动重命名同名文件,避免覆盖
  7. ::自动创建复制清单,记录复制路径,以及重命名文件的原文件名和新文件名
  8. ::自动计算复制文件数量,并保存于清单中,清单位于bat所在目录。
  9. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10. @echo off&setlocal enabledelayedexpansion
  11. title 【类文件提取】       测试环境: Windows XP SP3
  12. SET HardDisK=C D E F G H I J K L M N O P
  13. :str
  14. color !time:~7,1!!time:~9,1!
  15. set OUT=§&set REJ=&set DSK=&set DIS=&cls&set "LJ=%cd%"&echo.
  16. echo  ╭⌒╮ ╭ ﹌╮╭ ∽╮ oοО○               ¤ 色彩不理想?按两次ENTER键!
  17. echo   ︶︶  (o"."o)(o-.-o)                                  , ︶︶
  18. echo   ◤ ̄ ̄~~﹊︸ ̄︸ ̄︸ ̄ ̄◥※※※※※※※※※※※※※※※◣
  19. echo   ( ◆ ◆ ————本批处理可用于文件归类存档———— ◆ ◆ )
  20. echo   ( ◆ ◆                                            ◆ ◆ )
  21. echo   ( ◆ ◆ 文件将被拷贝到本批处理所在目录下并创建清单 ◆ ◆ )
  22. echo   ( ◆ ◆                                            ◆ ◆ )
  23. echo   ( ◆ ◆                  —— By:圖騰 2011-03-29  ◆ ◆ )
  24. echo   ╰◥※※※※※※※※※※◣_______________◢
  25. echo.
  26. for %%i in (%HardDisK%) do (if exist %%i: (set DSK=!DSK! %%i))
  27. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  28. echo  ★当前磁盘 "!DSK! " ——(请输入不需搜索的磁盘盘符)&echo.
  29. echo    (例:输入"CEF",即只对C、E、F以外的磁盘进行搜索和复制)&echo.
  30. echo   你可以将目标文件夹拖入本窗口,只在其目录下搜索。。。
  31. echo.&set/p OUT= (拖入文件夹到本窗口后需单击窗口,再按ENTER键确认):&cls
  32. set err=0&set fd=0
  33. if "!OUT!" neq "§" if exist !OUT! (
  34. cd !OUT!||echo  路径不正确,不能包含文件名!&&pause&&goto str
  35. set fd=1&set DIS= !OUT!&goto Suffix)
  36. for %%i in (!DSK!) do (
  37. if /i "!OUT:%%i=!" equ "!OUT!" (set DIS=!DIS! %%i)
  38. if /i "!OUT:%%i=!" neq "!OUT!" (set REJ=!REJ! %%i&set err=1))
  39. if !err!==1 (set REJ=,不搜索盘"!REJ! ") else (set DIS=!DSK!)
  40. :Suffix
  41. color 3f&set SUF=&set err=0&echo.&echo.
  42. if "!DIS!"=="" (color CF&set err=1&set DIS= 没有了,返回吧。。。)
  43. echo  确认搜索对象 "!DIS! " !REJ!&echo.
  44. echo  请输入文件后缀名(如 MP3、TXT、DOC,不区分大小写)&echo.
  45. set/p SUF= ——(不输入内容按ENTER键返回):
  46. if "!SUF!" neq "" set SUF=!SUF: =!
  47. if "!SUF!"=="" (goto str)
  48. if "!err!"=="1" goto str
  49. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  50. set ch=&set "tme="&set num=0&set "FL=*.!SUF!"
  51. for /f "tokens=1,* delims=. " %%i in ('echo !SUF!') do (
  52. if "%%j"=="" (set "SUF=!SUF:.=!"&set "FL=*.!SUF!" ) else (
  53. echo.&set/p ch=是要搜索文件“!SUF!”吗?(Y/N)[Y]:
  54. if /i "!ch!" neq "n" set "FL=!SUF!"))
  55. if exist File_!SUF! (set ch=&echo.
  56. set/p ch=“File_!SUF!”已存在,是否替换?(Y/N)[Y]:
  57. if /i "!ch!"=="n" (set tim=!time:.=!
  58. set dat=!date:~0,10!&set dat=!dat:-=!
  59. set "tme=_!dat!!tim::=!") else (
  60. rd /s /q File_!SUF! 2>nul
  61. del /q !SUF!_CopyList.TXT 2>nul))
  62. md "!LJ!\File_!SUF!!tme!"&cls
  63. set "FIL=!LJ!\File_!SUF!"&set "LIT=!LJ!\!SUF!_CopyList"
  64. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  65. if %fd%==0 (
  66. for %%i in (!DIS!) do ( CD/D %%i:&cd\&echo.
  67. echo   ◣正在搜索 %%i 盘下 "%SUF%" 文件。。。
  68. echo.&set cot=!num!&call :go)) else ( cd/d !DIS!
  69. echo.&echo   ◣正在搜索!DIS!下 "%SUF%" 文件。。。
  70. echo.&set cot=!num!&call :go)
  71. set ovr=!SUF!文件总数:!num!  日期:%date% %time:~0,8%
  72. (echo.&echo ——%ovr%)>>"!LIT!!tme!.TXT"
  73. if !num!==0 ( rd /s /q "!FIL!!tme!" 2>nul
  74. del /q "!LIT!!tme!.TXT" 2>nul
  75. echo.&echo  无此类型文件!&echo.)
  76. color 31&echo.
  77. if !num! neq 0 (echo 已复制到:"!FIL!!tme!"
  78. echo 复制清单:"!LIT!!tme!.TXT"&echo.)
  79. echo 复制文件总数:!num!,按任意键返回...
  80. pause>nul&cls&cd/d !LJ!&goto Suffix
  81. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  82. ::非清单文件?>>拷贝路径为不为存放路径?>>重名?[重命名预设]>>提取
  83. :go
  84. for /f "delims=" %%j in ('dir /a /s /b !FL!') do (
  85. set "lst=%%~nxj"&set "cpf=%%~dpj"
  86. if "!lst:_CopyList=!"=="!lst!" (
  87. if "!cpf:File_=!"=="!cpf!" (
  88. set rne=&set rea=&set rna=★
  89. if exist "!FIL!!tme!\%%~nxj" (
  90. set tim=!time:.=!&set tim=!tim::=!
  91. set rna=☆&set rea=  ★重命名:"%%~nj-☆!tim!%%~xj"
  92. set "rne=\%%~nj-★!tim!%%~xj")
  93. COPY /y "%%j" "!FIL!!tme!!rne!" >nul
  94. echo !rna!已复制:"%%j"&set/a num+=1
  95. echo !rna!"%%j"!rea!>>"!LIT!!tme!.TXT")))
  96. set/a cot=!num!-!cot!
  97. echo.&echo  %cd%目录下复制!SUF!文件数:!cot! "☆"表示已重命名文件
  98. echo ==============================================================
  99. goto :eof
  100. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
复制代码
重命名重名文件的规则如何改成自动重命名为“文件名1”“文件名2”?请大神赐教!感激不尽!
作者: DAIC    时间: 2013-11-6 17:20

先整理一下格式,改天有时间的话再改代码。
  1. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. ::功能简介:
  3. ::搜索并复制一个或多个磁盘中的某一类型(后缀名)的文件
  4. ::搜索并复制某文件夹及其子文件夹下某类文件
  5. ::文件将被复制到本bat所在目录下的一新建文件夹中
  6. ::自动重命名同名文件,避免覆盖
  7. ::自动创建复制清单,记录复制路径,以及重命名文件的原文件名和新文件名
  8. ::自动计算复制文件数量,并保存于清单中,清单位于bat所在目录。
  9. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  10. @echo off
  11. setlocal enabledelayedexpansion
  12. title 【类文件提取】       测试环境: Windows XP SP3
  13. SET HardDisK=C D E F G H I J K L M N O P
  14. :str
  15. color !time:~7,1!!time:~9,1!
  16. set OUT=§
  17. set REJ=
  18. set DSK=
  19. set DIS=
  20. cls
  21. set "LJ=%cd%"
  22. echo.
  23. echo  ╭⌒╮ ╭ ﹌╮╭ ∽╮ oοО○               ¤ 色彩不理想?按两次ENTER键!
  24. echo   ︶︶  (o"."o)(o-.-o)                                  , ︶︶
  25. echo   ◤ ̄ ̄~~﹊︸ ̄︸ ̄︸ ̄ ̄◥※※※※※※※※※※※※※※※◣
  26. echo   ( ◆ ◆ ————本批处理可用于文件归类存档———— ◆ ◆ )
  27. echo   ( ◆ ◆                                            ◆ ◆ )
  28. echo   ( ◆ ◆ 文件将被拷贝到本批处理所在目录下并创建清单 ◆ ◆ )
  29. echo   ( ◆ ◆                                            ◆ ◆ )
  30. echo   ( ◆ ◆                  —— By:圖騰 2011-03-29  ◆ ◆ )
  31. echo   ╰◥※※※※※※※※※※◣_______________◢
  32. echo.
  33. for %%i in (%HardDisK%) do (
  34.     if exist %%i: (
  35.         set DSK=!DSK! %%i
  36.     )
  37. )
  38. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  39. echo  ★当前磁盘 "!DSK! " ——(请输入不需搜索的磁盘盘符)
  40. echo.
  41. echo    (例:输入"CEF",即只对C、E、F以外的磁盘进行搜索和复制)
  42. echo.
  43. echo   你可以将目标文件夹拖入本窗口,只在其目录下搜索。。。
  44. echo.
  45. set/p OUT= (拖入文件夹到本窗口后需单击窗口,再按ENTER键确认):
  46. cls
  47. set err=0
  48. set fd=0
  49. if "!OUT!" neq "§" (
  50.     if exist !OUT! (
  51.         cd !OUT!||echo  路径不正确,不能包含文件名!&&pause&&goto str
  52.         set fd=1
  53.         set DIS= !OUT!
  54.         goto Suffix
  55.     )
  56. )
  57. for %%i in (!DSK!) do (
  58.     if /i "!OUT:%%i=!" equ "!OUT!" (
  59.         set DIS=!DIS! %%i
  60.     )
  61.     if /i "!OUT:%%i=!" neq "!OUT!" (
  62.         set REJ=!REJ! %%i
  63.         set err=1
  64.     )
  65. )
  66. if !err!==1 (
  67.     set REJ=,不搜索盘"!REJ! "
  68. ) else (
  69.     set DIS=!DSK!
  70. )
  71. :Suffix
  72. color 3f
  73. set SUF=
  74. set err=0
  75. echo.
  76. echo.
  77. if "!DIS!"=="" (
  78.     color CF
  79.     set err=1
  80.     set DIS= 没有了,返回吧。。。
  81. )
  82. echo  确认搜索对象 "!DIS! " !REJ!
  83. echo.
  84. echo  请输入文件后缀名(如 MP3、TXT、DOC,不区分大小写)
  85. echo.
  86. set/p SUF= ——(不输入内容按ENTER键返回):
  87. if "!SUF!" neq "" set SUF=!SUF: =!
  88. if "!SUF!"=="" (goto str)
  89. if "!err!"=="1" goto str
  90. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  91. set ch=
  92. set "tme="
  93. set num=0
  94. set "FL=*.!SUF!"
  95. for /f "tokens=1,* delims=. " %%i in ('echo !SUF!') do (
  96.     if "%%j"=="" (
  97.         set "SUF=!SUF:.=!"
  98.         set "FL=*.!SUF!"
  99.     ) else (
  100.         echo.
  101.         set/p ch=是要搜索文件“!SUF!”吗?(Y/N)[Y]:
  102.         if /i "!ch!" neq "n" set "FL=!SUF!"
  103.     )
  104. )
  105. if exist File_!SUF! (
  106.     set ch=
  107.     echo.
  108.     set/p ch=“File_!SUF!”已存在,是否替换?(Y/N)[Y]:
  109.     if /i "!ch!"=="n" (
  110.         set tim=!time:.=!
  111.         set dat=!date:~0,10!
  112.         set dat=!dat:-=!
  113.         set "tme=_!dat!!tim::=!"
  114.     ) else (
  115.         rd /s /q File_!SUF! 2>nul
  116.         del /q !SUF!_CopyList.TXT 2>nul
  117.     )
  118. )
  119. md "!LJ!\File_!SUF!!tme!"
  120. cls
  121. set "FIL=!LJ!\File_!SUF!"
  122. set "LIT=!LJ!\!SUF!_CopyList"
  123. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  124. if %fd%==0 (
  125.     for %%i in (!DIS!) do (
  126.         CD/D %%i:
  127.         cd\
  128.         echo.
  129.         echo   ◣正在搜索 %%i 盘下 "%SUF%" 文件。。。
  130.         echo.
  131.         set cot=!num!
  132.         call :go
  133.     )
  134. ) else (
  135.     cd/d !DIS!
  136.     echo.
  137.     echo   ◣正在搜索!DIS!下 "%SUF%" 文件。。。
  138.     echo.
  139.     set cot=!num!
  140.     call :go
  141. )
  142. set ovr=!SUF!文件总数:!num!  日期:%date% %time:~0,8%
  143. (echo.&echo ——%ovr%)>>"!LIT!!tme!.TXT"
  144. if !num!==0 (
  145.     rd /s /q "!FIL!!tme!" 2>nul
  146.     del /q "!LIT!!tme!.TXT" 2>nul
  147.     echo.
  148.     echo  无此类型文件!
  149.     echo.
  150. )
  151. color 31
  152. echo.
  153. if !num! neq 0 (
  154.     echo 已复制到:"!FIL!!tme!"
  155.     echo 复制清单:"!LIT!!tme!.TXT"
  156.     echo.
  157. )
  158. echo 复制文件总数:!num!,按任意键返回...
  159. pause>nul
  160. cls
  161. cd/d !LJ!
  162. goto Suffix
  163. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  164. ::非清单文件?>>拷贝路径为不为存放路径?>>重名?[重命名预设]>>提取
  165. :go
  166. for /f "delims=" %%j in ('dir /a /s /b !FL!') do (
  167.     set "lst=%%~nxj"
  168.     set "cpf=%%~dpj"
  169.     if "!lst:_CopyList=!"=="!lst!" (
  170.         if "!cpf:File_=!"=="!cpf!" (
  171.             set rne=
  172.             set rea=
  173.             set rna=★
  174.             if exist "!FIL!!tme!\%%~nxj" (
  175.                 set tim=!time:.=!
  176.                 set tim=!tim::=!
  177.                 set rna=☆
  178.                 set rea=  ★重命名:"%%~nj-☆!tim!%%~xj"
  179.                 set "rne=\%%~nj-★!tim!%%~xj"
  180.             )
  181.             COPY /y "%%j" "!FIL!!tme!!rne!" >nul
  182.             echo !rna!已复制:"%%j"
  183.             set/a num+=1
  184.             echo !rna!"%%j"!rea!>>"!LIT!!tme!.TXT"
  185.         )
  186.     )
  187. )
  188. set/a cot=!num!-!cot!
  189. echo.
  190. echo  %cd%目录下复制!SUF!文件数:!cot! "☆"表示已重命名文件
  191. echo ==============================================================
  192. goto :eof
  193. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
复制代码

作者: 86223125    时间: 2013-11-6 19:51

回复 2# DAIC


    坐等大神回复!
作者: 86223125    时间: 2013-11-14 14:56

大神去哪了?
作者: foxJL    时间: 2013-11-14 17:16

楼主有什么问题,直接把需求写出来吧,写代码比改别人的代码更轻松。




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