Board logo

标题: [文件操作] [已解决]批处理复制指定文件夹并跳过已存在的重复文件 [打印本页]

作者: Batcher    时间: 2009-5-30 02:18     标题: [已解决]批处理复制指定文件夹并跳过已存在的重复文件

在其他论坛看到一个批处理问题:

复制源文件夹C:\test\folder1中的所有文件(包括子文件夹,下同)到目标文件夹C:\test\folder2,复制到目标文件夹中的文件要与源文件夹在目录结构上保持一致。如果目标文件夹中已经存在某个文件,则跳过该文件不复制(而不是强行覆盖此文件)。

上面的源文件夹和目标文件夹路径只是个例子,实际代码中应该允许用户自己设定两者的路径(文件夹和目标文件夹可能位于不同的分区、不同的目录层次)。
作者: 随风    时间: 2009-5-30 07:00

for+dir/b/s再for分离出路径,copy前先 if exist 判断目标是否存在源文件,
似乎难度不大^_^ 关键是分离路径时要抛弃源文件夹的所有父目录,先获得源文件夹的全路径,再用set var=!var:*源文件夹的全路径=! 应该就可以解决了.
作者: zqz0012005    时间: 2009-5-30 13:33

还有一个方法是先将目标目录的所有文件移到同一分区的其他地方,将源目录文件全部xcopy后再move回来覆盖。当然如果已存在的文件很多很大则此法没什么意义。

结合xcopy的特点,使用临时文件也可以更简洁:
  1. @echo off
  2. set src=C:\test\folder1
  3. set dst=C:\test\folder2
  4. cd /d "%dst%"
  5. xcopy /l /s /e . \nul\ | sort /r | more +1 > "%temp%\exist~.txt"
  6. cd /d "%src%"
  7. xcopy /s /e /exclude:%temp\exist~.txt . "%dst%\"
  8. del "%temp%\exist~.txt"
复制代码

作者: zqz0012005    时间: 2009-5-30 13:42

xcopy的缺点是不认识带点的畸形目录。
作者: tireless    时间: 2009-5-30 20:26

1、2楼思路:
  1. @echo off
  2. :: 源路径中不能含有符号“!”;不能复制隐藏/系统属性文件
  3. set "Src=C:\test\folder1"
  4. set "Dest=C:\test\folder2"
  5. for /r "%Src%" %%S in (*) do (
  6.   set dp=%%~dpS
  7.   set nx=%%~nxS
  8.   setlocal enabledelayedexpansion
  9.   if not exist "!Dest!\!dp:%Src%=!\!nx!" (
  10.     md "!Dest!\!dp:%Src%=!" 2>Nul
  11.     copy "!dp!!nx!" "!Dest!\!dp:%Src%=!">nul
  12.   )
  13.   endlocal
  14. )
复制代码
2、xcopy "%Src%" "%Dest%" /sqih /EXCLUDE:Exist_Files
  1. @echo off
  2. :: 源路径中不能含有符号“!”;可以复制隐藏/系统属性文件
  3. set "Src=C:\test\folder1"
  4. set "Dest=C:\test\folder2"
  5. (for /f "delims=" %%S in ('dir/a-d/b/s "%Src%"') do (
  6.   set dp=%%~dpS
  7.   set nx=%%~nxS
  8.   setlocal enabledelayedexpansion
  9.   if exist "!Dest!\!dp:%Src%=!\!nx!" echo !dp!!nx!
  10.   endlocal
  11. ))>Exist_Files
  12. xcopy "%Src%" "%Dest%" /sqih /EXCLUDE:Exist_Files
  13. del Exist_Files
复制代码

作者: Batcher    时间: 2009-5-30 20:56     标题: 回复 3楼 的帖子

倒数第二行,temp后面少了个百分号^_^
作者: terse    时间: 2009-5-30 21:40

这样行不?
  1. @echo off
  2. set "a=C:\test\folder1"
  3. set "b=h:\test\folder2"
  4. xcopy /TY "%a%" "%b%"
  5. setlocal enabledelayedexpansion
  6. for /f "delims=" %%i in ('dir/b/s/a-d "%a%\"') do (
  7.    set str=%%i
  8.    set str=!str:%a%=%b%!
  9.    if not exist "!str!" copy "%%i" "!str!" >nul
  10. )
  11. pause
复制代码

作者: tireless    时间: 2009-5-30 22:18     标题: 回复 7楼 的帖子

行!for /f+dir 可以换成 for /r,因为 copy 不能复制隐藏/系统属性的文件。
作者: Batcher    时间: 2009-5-30 22:43     标题: 回复 7楼 的帖子

变量延迟扩展放在for外面会把路径中可能存在的感叹号搞丢吧?
作者: terse    时间: 2009-5-31 10:33

RE:  tireless 兄  
要是这样的话 FOR 里这样处理呢
另: 我觉得这里的 for /r  不如用 DIR....
  1. @echo off
  2. set "a=C:\test\folder1"
  3. set "b=h:\test\folder2"
  4. setlocal enabledelayedexpansion
  5. for /f "delims=" %%i in ('dir/a-d/b/s "%a%"') do (
  6.    set str=%%~dpi
  7.    set str=!str:%a%=%b%!
  8.    echo n|xcopy /HK "%%i" "!str!" >nul
  9. )
  10. pause
复制代码
RE:  Batcher兄
确实没考虑路径特殊字符问题  因为除了! 还有如 % 等特殊字符  所以也就不考虑吧

[ 本帖最后由 terse 于 2009-5-31 10:35 编辑 ]
作者: zwbposer    时间: 2011-2-13 19:26

如果用VBS怎么写呢,我很想知道啊,谁写个看看啊
作者: CrLf    时间: 2011-2-13 19:42

为什么这样不能复制部分含空格的文件?:
  1. for /r 1\ %%a in (*) do set /a n+=1
  2. (for /l %%a in (1 1 %n%) do echo n)|xcopy /e /r /h /-y a b\
复制代码

[ 本帖最后由 zm900612 于 2011-2-14 02:04 编辑 ]




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