Board logo

标题: [文件操作] 批处理遇到重复文件时不覆盖,而是继续复制 [打印本页]

作者: ww0000    时间: 2023-3-28 19:00     标题: 批处理遇到重复文件时不覆盖,而是继续复制

以下是:想要复制当前目录中(包含子目录)文件名中包含“总结”两字的doc文件到文件夹2
  1. @for /f %%a in ('dir *总结*.doc /s/b') do @copy /y "%%~fa" ".\文件夹2\"
复制代码
如何做到:遇到重复文件时不覆盖,而是继续复制,并在原文件名后加上1,2,3,等,
作者: 77七    时间: 2023-3-28 21:12

code 1
  1. @echo off
  2. rem 假设最多有20+1个重名文件
  3. for /f "delims=" %%i in ('dir /b /s /a-d *总结*.doc') do (
  4. if not exist "文件夹2\%%~nxi" (
  5. copy /y "%%i" "文件夹2\%%~nxi"
  6. ) else (
  7. set m=
  8. for /l %%l in (1,1,20) do (
  9. if not defined m (
  10. if not exist "文件夹2\%%~ni%%l%%~xi" (
  11. copy /y "%%i" "文件夹2\%%~ni%%l%%~xi"
  12. set m=1
  13. )
  14. )
  15. )
  16. )
  17. )
  18. pause
复制代码



code 2
  1. @echo off
  2. rem 文件名不含空格、特殊符号
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /s /a-d *总结*.doc') do (
  5. copy /y "%%i" "文件夹2\%%~ni!#%%~ni!%%~xi"
  6. set /a #%%~ni+=1
  7. )
  8. endlocal
  9. pause
复制代码

作者: 77七    时间: 2023-3-28 21:23

本帖最后由 77七 于 2023-3-28 21:28 编辑

code 2 如果操作之前文件夹2中已经存在文件
好像写多余了...既然是复制到同目录下...
  1. @echo off
  2. rem 文件名不含空格、特殊符号
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /s /a-d *总结*.doc') do (
  5.         if not exist "文件夹2\%%~nxi" (
  6.                 copy /y "%%i" "文件夹2\%%~nxi"
  7.         ) else (
  8.                 set /a #%%~ni+=1
  9.                 copy /y "%%i" "文件夹2\%%~ni!#%%~ni!%%~xi"
  10.         )
  11. )
  12. endlocal
  13. pause
复制代码

作者: ww0000    时间: 2023-3-28 22:42

回复 3# 77七


    谢谢,就是这个效果!!
作者: terse    时间: 2023-3-29 01:19

这个没处理重复文件加一后还有重复的情况吧
作者: qixiaobin0715    时间: 2023-3-29 08:21

terse提醒的对,以前我遇到类似的问题。
参考http://bbs.bathome.net/thread-57444-1-1.html中4楼的帖子。
作者: 77七    时间: 2023-3-29 09:45

回复 5# terse回复 6# qixiaobin0715

多谢两位大佬指点!
我写的时候确实没考虑过这种情况,添加序号后与原文件夹存在的文件重名,考虑不周。
不知道楼主的实际情况:是不是总结1已经是总结添加序号的结果,还是总结和总结1是“两类”。
如果存在两个总结1.doc,歧义就明显了,是重写代码重新命名为总结1-4,还是其它
假设原文件夹文件名中数字1不代表序号,在2楼代码2基础上修改,把set /a 行和copy行调换位置,直接给每个文件都添加序号(如下结果)。
rem 情况1
总结1.doc
总结.doc
总结.doc

rem 情况2
总结1.doc
总结1.doc
总结.doc
总结.doc

rem 情况2 结果
总结11.doc
总结12.doc
总结1.doc
总结2.doc

作者: qixiaobin0715    时间: 2023-3-29 10:30

复制文件到文件夹2肯定有个先后问题,最完美的做法是。
比如文件2中已有下列文件(后面顺序号最好带上括号,便于处理):
  1. 总结.doc
  2. 总结 (1).doc
  3. 总结 (3).doc
  4. 总结 (4).doc
  5. 总结 (6).doc
复制代码
如果后面复制时与上面文件重名的话,先按填补空缺号,再按顺序添加顺序号;如果这样不好处理,忽略空缺编号,按最大顺序号添加也可。
最终形成:
  1. 总结.doc
  2. 总结 (1).doc
  3. 总结 (2).doc
  4. 总结 (3).doc
  5. 总结 (4).doc
  6. 总结 (5).doc
  7. 总结 (6).doc
  8. 总结 (7).doc
  9. ...
复制代码
或者
  1. 总结.doc
  2. 总结 (1).doc
  3. 总结 (3).doc
  4. 总结 (4).doc
  5. 总结 (6).doc
  6. 总结 (7).doc
  7. 总结 (8).doc
  8. 总结 (9).doc
  9. ...
复制代码

作者: 77七    时间: 2023-3-29 11:25

回复 8# qixiaobin0715


   

先说一个前提,不知道有没有歧义,按楼主的代码,文件夹2 操作前是没有相关文件的。
大佬举的例子,不知道批处理执行前,原文件名是什么情况?
  1. 总结.doc
  2. 总结.doc
  3. 总结 (1).doc
  4. 总结 (1).doc
复制代码


如果执行前原文件名是像如上的情况,执行后是重新编号了吗,像如下这样。而不是只添加一个后缀序号
  1. 总结 .doc
  2. 总结 (1).doc
  3. 总结 (2).doc
  4. 总结 (3).doc
复制代码

作者: ww0000    时间: 2023-3-29 11:28

回复 2# 77七


    再问一下老师,如果不用重命名,而是把原文件所在的目录也一并复制过来,应该如何写呢?谢谢
作者: 77七    时间: 2023-3-29 11:42

回复 10# ww0000


  
  1. @echo off
  2. robocopy "文件夹1" "文件夹2" *总结*.doc /s
  3. pause
复制代码
试试这样行吗
作者: ww0000    时间: 2023-3-29 12:43

回复 11# 77七


    可以,谢谢您!
作者: qixiaobin0715    时间: 2023-3-29 15:05

回复 9# 77七
应当不会产生歧义吧。可以仔细看看6楼的链接,碰到重名文件本身就要求重命名,我想序号先到先得应当没毛病吧。




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