标题: [文件操作] 批处理遇到重复文件时不覆盖,而是继续复制 [打印本页]
作者: ww0000 时间: 2023-3-28 19:00 标题: 批处理遇到重复文件时不覆盖,而是继续复制
以下是:想要复制当前目录中(包含子目录)文件名中包含“总结”两字的doc文件到文件夹2- @for /f %%a in ('dir *总结*.doc /s/b') do @copy /y "%%~fa" ".\文件夹2\"
复制代码
如何做到:遇到重复文件时不覆盖,而是继续复制,并在原文件名后加上1,2,3,等,
作者: 77七 时间: 2023-3-28 21:12
code 1- @echo off
- rem 假设最多有20+1个重名文件
- for /f "delims=" %%i in ('dir /b /s /a-d *总结*.doc') do (
- if not exist "文件夹2\%%~nxi" (
- copy /y "%%i" "文件夹2\%%~nxi"
- ) else (
- set m=
- for /l %%l in (1,1,20) do (
- if not defined m (
- if not exist "文件夹2\%%~ni%%l%%~xi" (
- copy /y "%%i" "文件夹2\%%~ni%%l%%~xi"
- set m=1
- )
- )
- )
- )
- )
- pause
复制代码
code 2
- @echo off
- rem 文件名不含空格、特殊符号
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /s /a-d *总结*.doc') do (
- copy /y "%%i" "文件夹2\%%~ni!#%%~ni!%%~xi"
- set /a #%%~ni+=1
- )
- endlocal
- pause
复制代码
作者: 77七 时间: 2023-3-28 21:23
本帖最后由 77七 于 2023-3-28 21:28 编辑
code 2 如果操作之前文件夹2中已经存在文件
好像写多余了...既然是复制到同目录下...
- @echo off
- rem 文件名不含空格、特殊符号
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /s /a-d *总结*.doc') do (
- if not exist "文件夹2\%%~nxi" (
- copy /y "%%i" "文件夹2\%%~nxi"
- ) else (
- set /a #%%~ni+=1
- copy /y "%%i" "文件夹2\%%~ni!#%%~ni!%%~xi"
- )
- )
- endlocal
- 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中已有下列文件(后面顺序号最好带上括号,便于处理):- 总结.doc
- 总结 (1).doc
- 总结 (3).doc
- 总结 (4).doc
- 总结 (6).doc
复制代码
如果后面复制时与上面文件重名的话,先按填补空缺号,再按顺序添加顺序号;如果这样不好处理,忽略空缺编号,按最大顺序号添加也可。
最终形成:- 总结.doc
- 总结 (1).doc
- 总结 (2).doc
- 总结 (3).doc
- 总结 (4).doc
- 总结 (5).doc
- 总结 (6).doc
- 总结 (7).doc
- ...
复制代码
或者- 总结.doc
- 总结 (1).doc
- 总结 (3).doc
- 总结 (4).doc
- 总结 (6).doc
- 总结 (7).doc
- 总结 (8).doc
- 总结 (9).doc
- ...
复制代码
作者: 77七 时间: 2023-3-29 11:25
回复 8# qixiaobin0715
先说一个前提,不知道有没有歧义,按楼主的代码,文件夹2 操作前是没有相关文件的。
大佬举的例子,不知道批处理执行前,原文件名是什么情况?
- 总结.doc
- 总结.doc
- 总结 (1).doc
- 总结 (1).doc
复制代码
如果执行前原文件名是像如上的情况,执行后是重新编号了吗,像如下这样。而不是只添加一个后缀序号
- 总结 .doc
- 总结 (1).doc
- 总结 (2).doc
- 总结 (3).doc
复制代码
作者: ww0000 时间: 2023-3-29 11:28
回复 2# 77七
再问一下老师,如果不用重命名,而是把原文件所在的目录也一并复制过来,应该如何写呢?谢谢
作者: 77七 时间: 2023-3-29 11:42
回复 10# ww0000
- @echo off
- robocopy "文件夹1" "文件夹2" *总结*.doc /s
- 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 |