批处理文件逐个复制文件和文件夹结构,验证结果并将报告保存为 txt

批处理文件逐个复制文件和文件夹结构,验证结果并将报告保存为 txt

我有超过 100 万个(小尺寸)文件(<500kB jpg),结构如下:

H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folder

每个 sub_sub_sub_folder 有 10-15 个文件,sub_sub_folder 可以是日期/时间戳,sub_folder 是机器名称,而文件夹是另一个递增的数字。

我需要一份具有相同结构的 main_folder 副本,但我需要验证我的副本是否与源 100% 相同。Windows 资源管理器将在约 1000 次复制后阻塞,甚至不显示属性(大小、磁盘大小、包含)。

我需要一个批处理来H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA读取并复制所有 14 个文件的属性并粘贴它们Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA,打开文件 log.txt,写入:

“file1.jpg 490kB 已从 H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA 成功复制到 Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_folder\sub_sub_sub_folderA ...”

“file15.jpg 470kB 已成功从 H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_folderA 复制到 Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_folderA”

ETC

标记日志的结尾(一行 ====== 或其他内容),然后才继续下一个操作(复制 sub_sub_sub_folderB 的内容和文件夹结构)。如果复制操作未成功终止,则创建一个新的日志 error_sub_sub_sub_folderB.txt(下一个日志将是 error_sub_sub_sub_folderZ.txt),并且只有在创建日志后才移动到下一个 sub_sub_sub_folder

简而言之:逐步记录复制批处理,不会破坏系统或机器硬件资源。

答案1

xcopy 和 robocopy 都可以完成这项工作,但是 robocopy 的输出更接近您所描述的。

xcopy src dst /i /e /f /v /c > log.txt

/F 将输出完整的源路径和目标路径。

/V 声称可以验证文件大小,但不会在输出中打印它们。

除了没有记录文件大小之外,这基本上实现了您所描述的内容。还有其他开关可以控制是否复制 ACL 和属性。作为本机 exe,它将比脚本循环更快。但您不会获得单独的错误日志,并且您无法在出现错误时中止子文件夹并继续下一个子文件夹(/C 在出现错误时继续所有文件)。

示例输出:

C:\Users\Celery\test>xcopy src dst /i /e /f /v /c
C:\Users\Celery\test\src\a\blah.txt -> C:\Users\Celery\test\dst\a\blah.txt
C:\Users\Celery\test\src\a\blah2.txt -> C:\Users\Celery\test\dst\a\blah2.txt
C:\Users\Celery\test\src\b\blah.txt -> C:\Users\Celery\test\dst\b\blah.txt
C:\Users\Celery\test\src\b\blah2.txt -> C:\Users\Celery\test\dst\b\blah2.txt
4 File(s)

Robocopy 会生成相当详细的日志,包括文件大小。尝试:

robocopy src dst /e /np /log:log.txt [/tee]

示例输出:

C:\Users\Celery\test>robocopy src dst /e

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows

-------------------------------------------------------------------------------

  Started : Thursday, 22 January 2015 10:58:55 PM
   Source : C:\Users\Celery\test\src\
     Dest : C:\Users\Celery\test\dst\

    Files : *.*

  Options : *.* /S /E /DCOPY:DA /COPY:DAT /R:1000000 /W:30

------------------------------------------------------------------------------

          New Dir          0    C:\Users\Celery\test\src\
          New Dir          2    C:\Users\Celery\test\src\a\
            New File                  17        blah.txt
            New File                  17        blah2.txt
          New Dir          2    C:\Users\Celery\test\src\b\
            New File                  17        blah.txt
            New File                  17        blah2.txt

------------------------------------------------------------------------------

               Total    Copied   Skipped  Mismatch    FAILED    Extras
    Dirs :         3         3         0         0         0         0
   Files :         4         4         0         0         0         0
   Bytes :        68        68         0         0         0         0
   Times :   0:00:00   0:00:00                       0:00:00   0:00:00


   Speed :                2193 Bytes/sec.
   Speed :               0.125 MegaBytes/min.
   Ended : Thursday, 22 January 2015 10:58:55 PM

否则,要自己编写迭代脚本,您将需要四个嵌套循环,例如:

for /d %%a in (main_folder\*) do (
  for /d %%b in (%%a\*) do (
    for /d %%c in (%%b\*) do (
      for /d %%d in (%%c\*) do (
        :: code to copy files and write logs goes here
      )
      echo ================= end of %%d =============== >> log.txt
    )
  )
)

这只会复制 sub_sub_sub_folders 中的文件:任何更高级别文件夹中的文件都将被忽略,因为for /d仅遍历目录。

相关内容