标题: [文件操作] 批处理怎样大批量移动文件并备份目标文件夹? [打印本页]
作者: 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 编辑
前半段代码版主已经帮我改好了- @echo off&setlocal enableDelayedExpansion
- cd/d "D:\Test"
- for /d %%a in (*) do (
- set "a=%%a"
- xcopy /cqisekrh "%%a" "E:\Test\!a:~0,2!\!a:~2,2!\%%a"
- rd /s /q "%%a"
- )
复制代码
我想可能要在for里面嵌入一个判断语句
我自己瞎写的是这样的- @echo off&setlocal enableDelayedExpansion
- cd/d "D:\Test"
- for /d %%a in (*) do (
- set "a=%%a"
- 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"
- 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"
- pause
- )
复制代码
我知道错肯定是错的,但我想,大致样子应该是这样吧=。=|||
希望各位多多帮助下。
作者: 随风 时间: 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- @echo off&setlocal enableDelayedExpansion
- set "ylj=D:\Test"
- set "mb=E:\Test"
- set "mb2=E:\Backup"
- for /r %%i in (*) do (
- set "str=%%~dpi"
- set "str=!str:*%ylj%=!"
- set "var=!str:~0,2!\!str:~2,2!"
- if not exist "%mb%\!var!\!str!" md "%mb%\!var!\!str!"
- if not exist "%mb%\!var!\!str!%%~nxi" (
- copy /y "%%i" "%mb%\!var!\!str!%%~nxi"
- ) else (
- for %%a in ("%%i" "%mb%\!var!\!str!%%~nxi") do (
- set "num2=!num1!"
- set "num1=%%~ta"
- )
- if not "!num1!"=="!num2!" (
- if not exist "%mb2%\%date:~0,10%\!var!\!str!\" md "%mb2%\%date:~0,10%\!var!\!str!\"
- copy /y "%mb%\!var!\!str!%%~nxi" "%mb2%\%date:~0,10%\!var!\!str!\%%~nxi"
- copy /y "%%i" "%mb%\!var!\!str!%%~nxi"
- )
- )
- )
- pause
复制代码
作者: caruko 时间: 2011-3-23 19:25
xcopy /L /D /U /F 就能得到目标已存在的,需要更新的目标文件与源文件。
XCOPY /L 显示将会复制的文件,但并不真的复制,所以可以用来做判断。
作者: hanyeguxing 时间: 2011-3-23 19:31
代码未测试:- @echo off&setlocal enabledelayedexpansion
- set d=%time:~0,8%&set d=!d::=-!
- set "d=E:\Backup\%date:~0,10%-%d%\"
- for /r "D:\Test" %%a in (*) do (
- set "a=%%a"&set "a=!a:~8!"
- for %%b in ("E:\Test\!a:~0,2!\!a:~2,2!\!a!") do (
- if exist "%%~b" (
- set "b=%%~dpb"
- md "%d%!b:~8!" 2>nul
- copy "%%~b" "%d%!b:~8!"
- )
- md "!b!" 2>nul
- move "%%~a" "!b!"
- ))
复制代码
作者: purrpig 时间: 2011-3-24 09:08
8# hanyeguxing
我稍微改了下路径,如下:- @echo off&setlocal enabledelayedexpansion
- set d=%time:~0,8%&set d=!d::=-!
- set "d=D:\Backup\%date:~0,10%-%d%\"
- for /r "D:\Source" %%a in (*) do (
- set "a=%%a"&set "a=!a:~8!"
- for %%b in ("D:\Test\!a:~0,2!\!a:~2,2!\!a!") do (
- if exist "%%~b" (
- set "b=%%~dpb"
- md "%d%!b:~8!" 2>nul
- copy "%%~b" "%d%!b:~8!"
- )
- md "!b!" 2>nul
- move "%%~a" "!b!"
- ))
- 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
我自己写了一段……功能很简陋- @echo off&setlocal enableDelayedExpansion
- cd/d "D:\Source"
- for /d %%a in (*) do (
- set "a=%%a"
- for /d %%b in ("D:\Test\!a:~0,2!\!a:~2,2!\!a!") do (
- set "b=%%b"
- xcopy /c/q/i/s/e/k/r/h/y "%%b" "D:\Backup\%date:~0,10%%d%\!a!")
- xcopy /c/q/i/s/e/k/r/h/y "%%a" "D:\Test\!a:~0,2!\!a:~2,2!\!a!"
- )
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |