Board logo

标题: [文本处理] 批处理怎样将大量文件存放到新文件夹(同时备份目标文件)? [打印本页]

作者: purrpig    时间: 2011-3-16 12:05     标题: 批处理怎样将大量文件存放到新文件夹(同时备份目标文件)?

将一个文件夹:yyy…yyy\ ABC0_1100\xx\xx.xx(全部文件夹及子文件夹)
拷贝至:zzz…zzz\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\文件夹下(包括文件的路径),请问这个功能可以实现么?

比如E:\Test\AB\CD\ABCD_0102\...\...\...\config.xml,只有config.xml这样一个文件重复了,我只想备份这一个文件到E:\Backup\AB\CD\ABCD_0102\...\...\...\下


希望大家不吝指教。
作者: hanyeguxing    时间: 2011-3-16 13:03

  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. )
复制代码
测试时不使用rd,测试正常且符合目的后再使用
xcopy的参数根据需要选择组合

[ 本帖最后由 hanyeguxing 于 2011-3-16 13:07 编辑 ]
作者: purrpig    时间: 2011-3-16 13:21

本帖最后由 purrpig 于 2011-3-22 09:55 编辑

现在有个情况,就是我运行第二次,即要覆盖的时候,dos下会问我,改写……(YES/NO/ALL),怎样改写成默认直接覆盖

这个已经改好了,谢谢版主,我现在希望的是,在覆盖之前,备份这些文件以及路径。到E:\Backup\下
作者: purrpig    时间: 2011-3-22 10:04

希望大家能帮助我下,谢谢
作者: 随风    时间: 2011-3-22 11:06

第一个问题
"E:\Test\!a:~0,2!\!a:~2,2!\%%a\"

第二个问题
xcopy /cqisekrh "E:\Test" "E:\Backup\"
作者: purrpig    时间: 2011-3-22 11:12

本帖最后由 purrpig 于 2011-3-22 11:18 编辑

5# 随风


不需要加判断语句么?比如我要拷过去的文件有A、B、C,目标文件夹有C、D、E了,但我只想备份C,因为文件太多太大了,如果都备份,可能没有那么多资源。

什么exist之类的?

我现在大致样子是

@echo off&setlocal enableDelayedExpansion
cd/d "D:\Test"
for /d %%a in (*) do (
        set "a=%%a"
        for /f %%i in () do set num=%%i     ///////就是这里条件语句不知道怎么加,不知道怎么判断文件是否一样
        if %num% GEQ 1 goto planA
        if %num% LESS 1 goto planB
        :planA
        xcopy /c/q/i/s/e/k/r/h/y "%%b" "E:\Backup\%%b"
        xcopy /c/q/i/s/e/k/r/h/y "%%a" "E:\Test\!a:~0,2!\!a:~2,2!\%%a"
        goto end
        :planB
        xcopy /c/q/i/s/e/k/r/h/y "%%a" "E:\Test\!a:~0,2!\!a:~2,2!\%%a"
        goto end
        :end
        pause
        exit
)
作者: 随风    时间: 2011-3-22 11:23

运行 xcopy /? 看帮助
/D:m-d-y     复制在指定日期或指定日期以后更改的文件。
              如果没有提供日期,只复制那些源时间比目标时间新的文件。
作者: hbwazxf    时间: 2011-3-22 11:27

新手学习一下。
作者: purrpig    时间: 2011-3-22 13:05

运行 xcopy /? 看帮助
/D:m-d-y     复制在指定日期或指定日期以后更改的文件。
              如果没有提供日期,只复制那些源时间比目标时间新的文件。
随风 发表于 2011-3-22 11:23


/D:m-d-y  只是对源文件进行删选,我现在的情况是,对源文件不做判断,对目标文件夹的文件做判断,如果有名字一样的,直接备份。然后,源文件覆盖掉。
作者: caruko    时间: 2011-3-22 13:30

xcopy  /U           只复制已经存在于目标中的文件。:: 符合你的要求
xcopy  /L           显示要复制的文件。 ::这表示不是真的复制文件,只是显示出,如果复制将会复制那些文件。
xcopy /l /u  "源" "目标" ,也可以加上/d,只复制源文件比目标文件新的文件,可节省时间。
显示出来的,即是需要备份的文件。
作者: purrpig    时间: 2011-3-22 13:39

本帖最后由 purrpig 于 2011-3-22 13:42 编辑
xcopy  /U           只复制已嬖谟谀勘曛械奈募?: 符合你的要求
xcopy  /L           显示要复制的文件。 ::这表示不是真的复制文件,只是显示出,如果复制将会复制那些文件。
xcopy /l /u  "源" "目标" ,也 ...
caruko 发表于 2011-3-22 13:30


我不知道是不是我表达问题还是什么,我现在想要的情况是:

现在我在D:\Test\ABCD\...\...\...\下有1.txt、2.txt、3.txt这三个文件
在E:\Test\AB\CD\ABCD\...\...\...\下有3.txt、4.txt、5.txt这三个文件

我现在要达到的效果是,1.txt、2.txt、3.txt这三个文件复制到E:\Test\AB\CD\ABCD\...\...\...\并覆盖掉E盘下的3.txt文件(无论D盘的3.txt新旧、大小),并备份先前的E盘原有的3.txt到E:\Backup\日期\AB\CD\ABCD\...\...\...\(“日期”这一文件夹能自动生成么?    路径需要自己创建,并保持与E:Test后面一致)
作者: caruko    时间: 2011-3-22 13:49

备份
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%f in ('xcopy /L /U /D /F "源" "目标"')  do (
  3.         set "cp=%%f:->=◆"
  4.         for /f "tokens=2 delims=◆" %%a in ("!cp!") do copy /y "%%a" "备份目录"
  5. )
复制代码





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