[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理复制指定文件夹并跳过已存在的重复文件

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

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

上面的源文件夹和目标文件夹路径只是个例子,实际代码中应该允许用户自己设定两者的路径(文件夹和目标文件夹可能位于不同的分区、不同的目录层次)。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

为什么这样不能复制部分含空格的文件?:
  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 编辑 ]

TOP

如果用VBS怎么写呢,我很想知道啊,谁写个看看啊

TOP

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 编辑 ]

TOP

回复 7楼 的帖子

变量延迟扩展放在for外面会把路径中可能存在的感叹号搞丢吧?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 7楼 的帖子

行!for /f+dir 可以换成 for /r,因为 copy 不能复制隐藏/系统属性的文件。

TOP

这样行不?
  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
复制代码

TOP

回复 3楼 的帖子

倒数第二行,temp后面少了个百分号^_^
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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
复制代码

TOP

xcopy的缺点是不认识带点的畸形目录。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

还有一个方法是先将目标目录的所有文件移到同一分区的其他地方,将源目录文件全部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"
复制代码
2

评分人数

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

for+dir/b/s再for分离出路径,copy前先 if exist 判断目标是否存在源文件,
似乎难度不大^_^ 关键是分离路径时要抛弃源文件夹的所有父目录,先获得源文件夹的全路径,再用set var=!var:*源文件夹的全路径=! 应该就可以解决了.
技术问题请到论坛发帖求助!

TOP

返回列表