Board logo

标题: [文件操作] 批处理怎样大批量移动文件并备份目标文件夹? [打印本页]

作者: purrpig    时间: 2011-3-23 14:55     标题: 批处理怎样大批量移动文件并备份目标文件夹?

将一个文件夹:D:\Test\ ABC0_1100\xx\xx.xx(全部文件夹及子文件夹)
拷贝至:E:\Test\AB\C0\ABC0_1100\xx\xx\xx.xx(其中\AB\C0\ABC0_1100\这个不是一定的,只是配合拷贝源)

就是说,自动创建AB和C0文件夹。

文件名是不固定的,但是字符长度是固定的。如D:\Test\下,我有ABCD_0102、ABEF_0102、EFGH_0102、EFCD_0102四个文件夹,里面有很多文件夹及目录。

现在,我需要把这些文件夹移动到E:\Test\下,并依次创建各自匹配的文件夹放入AB\CD\ABCD_0102、AB\EF\ABEF_0102、EF\GH\EFGH_0102、EF\CD\EFCD_0102中。

因为需要每周都处理这些文件的转移,所以,可能涉及到备份的问题。

因为要多次转移,可能目标文件夹:E:\Test\已经有了,但是为了防止文件丢失、出错,我想将要被覆盖的文件备份,备份到E:\Backup\文件夹下(包括文件的路径),请问这个功能可以实现么?

比如我要复制过来的文件是D:\ABCD_0102下的文件,我希望批处理能自己判断,是否E:\Test\AB\CD\有没有这个文件夹,如果有,先把E:\Test\AB\CD\ABCD_0102下的文件备份至E:\Backup\日期(这个要自动生成)\AB\CD\ABCD_0102,再将D:\ABCD_0102复制过去
作者: purrpig    时间: 2011-3-23 15:24

本帖最后由 purrpig 于 2011-3-23 15:25 编辑

前半段代码版主已经帮我改好了
  1. @echo off&setlocal enableDelayedExpansion
  2. cd/d "D:\Test"
  3. for /d %%a in (*) do (
  4.         set "a=%%a"
  5.         xcopy /cqisekrh "%%a" "E:\Test\!a:~0,2!\!a:~2,2!\%%a"
  6.         rd /s /q "%%a"
  7. )
复制代码
我想可能要在for里面嵌入一个判断语句
我自己瞎写的是这样的
  1. @echo off&setlocal enableDelayedExpansion
  2. cd/d "D:\Test"
  3. for /d %%a in (*) do (
  4.         set "a=%%a"
  5. if exist "E:\Test\!a:~0,2!\!a:~2,2!\%%a" (xcopy /c/q/i/s/e/k/r/h/y "E:\Test\!a:~0,2!\!a:~2,2!\%%a" "E:\Backup\%date:~0,10%\%%a"
  6. xcopy /c/q/i/s/e/k/r/h/y "%%a" "E:\Test\!a:~0,2!\!a:~2,2!\%%a" ) else xcopy /c/q/i/s/e/k/r/h/y "%%a" "E:\Test\!a:~0,2!\!a:~2,2!\%%a"
  7. pause
  8. )
复制代码
我知道错肯定是错的,但我想,大致样子应该是这样吧=。=|||

希望各位多多帮助下。
作者: 随风    时间: 2011-3-23 15:54

xcopy 可以只复制更新的文件,但是我们无法预知它到底要复制哪个文件
如果改用copy的话,又无法只复制更新后的文件,全部覆盖复制无疑将要牺牲大量效率,即使通过文件修改时间来判断也同样对效率是个挑战,貌似 for 的 %%~ti 好像是修改时间吧,记不太清了。。。
作者: CrLf    时间: 2011-3-23 16:05

大量的判断还是交给“专业人士”比较好,for虽然强大,但它在某些领域比起专门的命令只算是业余了。
思路:
通过xcopy /l /u或者dir /s|sort|more +7筛选,再通过for执行复制
作者: purrpig    时间: 2011-3-23 17:07

3# 随风


我已经不考虑效率问题,现在想要的就是实现上述功能……
作者: 随风    时间: 2011-3-23 19:08

本帖最后由 随风 于 2011-3-23 19:17 编辑

代码未作测试,有问题跟帖。。。
功能:
复制D:\Test内所有文件到E:\Test(含子文件夹),若E:\Test不存在该文件直接复制
若已存在则比较其与源文件的修改时间,若一致则不复制,若不一致则先将E:\Test下的该文件复制到E:\Backup下新创建的日期文件夹下,再复制。
复制时先将D:\Test下第一级子目录的文件名前4个字符拆分为2个一组创建新文件夹
如:ABC0_1100 则创建 AB\CD 文件夹
不复制D:\Test下的文件。
exit
  1. @echo off&setlocal enableDelayedExpansion
  2. set "ylj=D:\Test"
  3. set "mb=E:\Test"
  4. set "mb2=E:\Backup"
  5. for /r %%i in (*) do (
  6.    set "str=%%~dpi"
  7.    set "str=!str:*%ylj%=!"
  8.    set "var=!str:~0,2!\!str:~2,2!"
  9.    if not exist "%mb%\!var!\!str!" md "%mb%\!var!\!str!"
  10.    if not exist "%mb%\!var!\!str!%%~nxi" (
  11.         copy /y "%%i" "%mb%\!var!\!str!%%~nxi"
  12.       ) else (
  13.      for %%a in ("%%i" "%mb%\!var!\!str!%%~nxi") do (
  14.      set "num2=!num1!"
  15.      set "num1=%%~ta"
  16.   )
  17.   if not "!num1!"=="!num2!" (
  18.      if not exist "%mb2%\%date:~0,10%\!var!\!str!\" md "%mb2%\%date:~0,10%\!var!\!str!\"
  19.            copy /y "%mb%\!var!\!str!%%~nxi" "%mb2%\%date:~0,10%\!var!\!str!\%%~nxi"
  20.      copy /y "%%i" "%mb%\!var!\!str!%%~nxi"
  21.   )
  22. )
  23. )
  24. pause
复制代码

作者: caruko    时间: 2011-3-23 19:25

xcopy /L /D /U /F 就能得到目标已存在的,需要更新的目标文件与源文件。

XCOPY /L  显示将会复制的文件,但并不真的复制,所以可以用来做判断。
作者: hanyeguxing    时间: 2011-3-23 19:31

代码未测试:
  1. @echo off&setlocal enabledelayedexpansion
  2. set d=%time:~0,8%&set d=!d::=-!
  3. set "d=E:\Backup\%date:~0,10%-%d%\"
  4. for /r "D:\Test" %%a in (*) do (
  5.     set "a=%%a"&set "a=!a:~8!"
  6.     for %%b in ("E:\Test\!a:~0,2!\!a:~2,2!\!a!") do (
  7.         if exist "%%~b" (
  8.             set "b=%%~dpb"
  9.             md "%d%!b:~8!" 2>nul
  10.             copy "%%~b" "%d%!b:~8!"
  11.         )
  12.         md "!b!" 2>nul
  13.         move "%%~a" "!b!"
  14. ))
复制代码

作者: purrpig    时间: 2011-3-24 09:08

8# hanyeguxing


我稍微改了下路径,如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. set d=%time:~0,8%&set d=!d::=-!
  3. set "d=D:\Backup\%date:~0,10%-%d%\"
  4. for /r "D:\Source" %%a in (*) do (
  5.     set "a=%%a"&set "a=!a:~8!"
  6.     for %%b in ("D:\Test\!a:~0,2!\!a:~2,2!\!a!") do (
  7.         if exist "%%~b" (
  8.             set "b=%%~dpb"
  9.             md "%d%!b:~8!" 2>nul
  10.             copy "%%~b" "%d%!b:~8!"
  11.         )
  12.         md "!b!" 2>nul
  13.         move "%%~a" "!b!"
  14. ))
  15. pause
复制代码
结果,D:\Source下的文件没有复制到D:\Test下,而是所有文件直接被复制到了D:\根目录下,对D:\Source下的文件夹没有操作。

运行第二遍的时候,我重新创建了新的文件试一下,名字与之前的一样,结果,文件直接覆盖,且没有备份
作者: purrpig    时间: 2011-3-24 09:18

6# 随风


我将路径
set "ylj=D:\Test"

set "mb=E:\Test"

set "mb2=E:\Backup"

改成

set "ylj=D:\Source"

set "mb=D:\Test"

set "mb2=D:\Backup"

别的无改动,运行没有通过,截图如下:
作者: purrpig    时间: 2011-3-24 14:44

大家一起帮帮我,谢谢啦!!!
作者: purrpig    时间: 2011-3-24 16:55

我自己写了一段……功能很简陋
  1. @echo off&setlocal enableDelayedExpansion
  2. cd/d "D:\Source"
  3. for /d %%a in (*) do (
  4.         set "a=%%a"
  5. for /d %%b in ("D:\Test\!a:~0,2!\!a:~2,2!\!a!") do (
  6. set "b=%%b"
  7. xcopy /c/q/i/s/e/k/r/h/y "%%b" "D:\Backup\%date:~0,10%%d%\!a!")
  8.         xcopy /c/q/i/s/e/k/r/h/y "%%a" "D:\Test\!a:~0,2!\!a:~2,2!\!a!"
  9. )
  10. pause
复制代码





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