批次檔一一複製檔案和資料夾結構,驗證結果並將報告儲存到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 是 machine_name,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_sub_folderA ...”

“file15.jpg 470kB 從 H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA 成功複製到 Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_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只迭代目錄。

相關內容