定期的に同じフォルダをコピーするPowerShell処理では、処理済みファイルを識別する台帳を持たないと、毎回重複コピーや上書きが起こります。ファイル名だけでなく内容や処理状態を確認する運用が必要です。

「処理済み」を何で判定するか定義する

  • コピー先に同じ名前のファイルが既に存在するか確認します。
  • 同名でも内容が違う可能性があるため、サイズやハッシュを比較する必要があるか決めます。
  • 処理途中に停止した場合、台帳だけ更新される事故を避ける設計を確認します。
  • ファイルの識別キーをフルパス+SHA-256など、目的に合わせて決めます。

コピー履歴と実体の両方で重複を防ぐ

  1. コピー前に対象ファイル一覧を固定し、ID・元パス・ハッシュ・状態の台帳を作ります。
  2. 未処理行だけを抽出してコピー予定一覧を生成します。
  3. 本番コピー後にコピー先のファイルが一致するか確認します。
  4. 一致を確認できた行だけ状態をDONEへ更新します。
  5. 再実行時はDONEかつ内容一致の行をスキップし、内容が変わったファイルは別判断で扱います。

ファイル名だけの処理済み判定は不足

  • コピーに失敗したのに台帳だけDONEへ進むと、再実行でも処理されなくなります。
  • ファイル名を識別キーにすると同名別内容のファイルを誤判定する場合があります。
  • 台帳が壊れたときの復元用バックアップを用意します。

コピー先と台帳の状態を照合する

  • 同じ入力を2回実行しても、新規コピーの増加がないかを検証します。
  • 途中停止させたテストでも、未完の行だけ再処理できることを確認します。

ファイル名だけの処理済み台帳は危険

たとえば毎日report.csvをコピーする運用で、ファイル名だけを「処理済み」として保存すると、翌日に内容が更新されたreport.csvまでスキップする可能性があります。必要に応じ元パス・更新日時・サイズ・SHA-256などを組み合わせ、同じ版のファイルなのか判断します。

処理台帳の書き込みに成功していても、コピー先の保存が途中で失敗している場合があります。先にコピーを検証してから完了状態を記録し、次回起動時には台帳と実ファイルの両方を照合してください。共有ファイルの同時更新がある運用では、元ファイルがコピー中に変化していないかの確認も必要です。

台帳の最小構成例(設計例)

コピー対象ごとに、source_path、destination_path、source_sha256、status、last_checkedの列を持つCSV等の台帳を設計します。状態はPLANNED→COPYING→コピー先SHA一致を確認後にDONEとします。途中で落ちてCOPYINGのままの行は、自動でDONE扱いせず実ファイルを読み戻してください。

これはMicrosoftが提供する「二重コピー防止機能」ではなく、Copy-ItemとGet-FileHashを使う場合の業務側の設計案です。複数処理が同時に同じ台帳を書き換える場合は、CSVだけでは排他制御を保証できないため単一実行にするか、別のトランザクション管理を採用します。

参考資料

おすすめの記事