标题: [文件操作] [已解决]批处理复制指定文件夹并跳过已存在的重复文件 [打印本页]
作者: 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的特点,使用临时文件也可以更简洁:- @echo off
- set src=C:\test\folder1
- set dst=C:\test\folder2
- cd /d "%dst%"
- xcopy /l /s /e . \nul\ | sort /r | more +1 > "%temp%\exist~.txt"
- cd /d "%src%"
- xcopy /s /e /exclude:%temp\exist~.txt . "%dst%\"
- del "%temp%\exist~.txt"
复制代码
作者: zqz0012005 时间: 2009-5-30 13:42
xcopy的缺点是不认识带点的畸形目录。
作者: tireless 时间: 2009-5-30 20:26
1、2楼思路:- @echo off
- :: 源路径中不能含有符号“!”;不能复制隐藏/系统属性文件
- set "Src=C:\test\folder1"
- set "Dest=C:\test\folder2"
-
- for /r "%Src%" %%S in (*) do (
- set dp=%%~dpS
- set nx=%%~nxS
- setlocal enabledelayedexpansion
- if not exist "!Dest!\!dp:%Src%=!\!nx!" (
- md "!Dest!\!dp:%Src%=!" 2>Nul
- copy "!dp!!nx!" "!Dest!\!dp:%Src%=!">nul
- )
- endlocal
- )
复制代码
2、xcopy "%Src%" "%Dest%" /sqih /EXCLUDE:Exist_Files- @echo off
- :: 源路径中不能含有符号“!”;可以复制隐藏/系统属性文件
- set "Src=C:\test\folder1"
- set "Dest=C:\test\folder2"
-
- (for /f "delims=" %%S in ('dir/a-d/b/s "%Src%"') do (
- set dp=%%~dpS
- set nx=%%~nxS
- setlocal enabledelayedexpansion
- if exist "!Dest!\!dp:%Src%=!\!nx!" echo !dp!!nx!
- endlocal
- ))>Exist_Files
-
- xcopy "%Src%" "%Dest%" /sqih /EXCLUDE:Exist_Files
- del Exist_Files
复制代码
作者: Batcher 时间: 2009-5-30 20:56 标题: 回复 3楼 的帖子
倒数第二行,temp后面少了个百分号^_^
作者: terse 时间: 2009-5-30 21:40
这样行不?- @echo off
- set "a=C:\test\folder1"
- set "b=h:\test\folder2"
- xcopy /TY "%a%" "%b%"
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir/b/s/a-d "%a%\"') do (
- set str=%%i
- set str=!str:%a%=%b%!
- if not exist "!str!" copy "%%i" "!str!" >nul
- )
- 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....
- @echo off
- set "a=C:\test\folder1"
- set "b=h:\test\folder2"
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir/a-d/b/s "%a%"') do (
- set str=%%~dpi
- set str=!str:%a%=%b%!
- echo n|xcopy /HK "%%i" "!str!" >nul
- )
- pause
复制代码
RE: Batcher兄
确实没考虑路径特殊字符问题 因为除了! 还有如 % 等特殊字符 所以也就不考虑吧
[ 本帖最后由 terse 于 2009-5-31 10:35 编辑 ]
作者: zwbposer 时间: 2011-2-13 19:26
如果用VBS怎么写呢,我很想知道啊,谁写个看看啊
作者: CrLf 时间: 2011-2-13 19:42
为什么这样不能复制部分含空格的文件?:- for /r 1\ %%a in (*) do set /a n+=1
- (for /l %%a in (1 1 %n%) do echo n)|xcopy /e /r /h /-y a b\
复制代码
[ 本帖最后由 zm900612 于 2011-2-14 02:04 编辑 ]
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |