web-dev-qa-db-ja.com

ファイルとフォルダの構造を1つずつコピーし、結果を確認してレポートを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に正常にコピーされました"

等。

ログの終わりをマークし(======の1行など)、次の操作(sub_sub_sub_folderBのコンテンツとフォルダー構造のコピー)に進みます。コピー操作が正常に終了しなかった場合は、新しいログerror_sub_sub_sub_folderB.txtを作成し(次のログはerror_sub_sub_sub_folderZ.txtになります)、ログが作成された後でのみ次のsub_sub_sub_folderに移動します。

一言で言えば:システムやマシンのハードウェアリソースを殺さないコピーバッチを段階的にログに記録します。

1
Lucs

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

それ以外の場合、反復を自分でスクリプト化するには、次のような4つのネストされたループが必要になります。

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はディレクトリに対してのみ反復するため、上位レベルのフォルダー内のファイルはすべて無視されます。

1
Celery Man