palm84.com

革命的愛熊主義者同盟!

Robocopyコマンドでフォルダーのバックアップ

【2024.4.28】「ファイル属性変更」エラーについて追記

Robocopy はコマンド実行ということで最初は手間かかるけど、細かく指定できるのがええとこですよね。というわけで超私的自己流バックアップ方法を書いてみましたよん。う~んマニアック(笑)...

INDEX

about

誰でも知ってるような気もするので今更ですけど (´・ω・`) 、フォルダー(ディレクトリー)のバックアップの為に生まれたようなコマンドであります(笑)。

XCOPYコマンドとの大きな違いは、ミラーリングが可能なとこ。ミラーリングとは単一方向の同期っていうと難しそうですけど、FolderA から FolderB へバックアップする際、A側で無くなったファイルはB側でも削除されるってこと。

あと、多少手間は必要ですが、除外指定やログの記録、条件設定もいろいろ可能。

※ Windows 7 では少しオプションに違いがあるのでご注意。

ミラーリングの基本

超基本がこんな風

robocopy D:\FolderA Z:\FolderB /mir

初回の実行時(※ FolderB が空の場合とか)はこれだけでいいかもしれないです。

尚、上記では省いてますが、パスや変数はなるべく引用符(")で囲むようにしませう。(※ パス名にスペースを含む場合などは必須)

【追記】万が一、同名フォルダが存在する場合を考えて、初回だけは /mir ではなく /s /e オプションを使う方が安全かも。

  • /mir - ミラーリングされる為、コピー先にしかない既存ファイルはなくなる
  • /s /e - 上書きコピーなので既存ファイルは残る
2021.4.3 追記】フォルダを放り込みコピー

例えば、ファイラーでの操作と同様に Backup ディレクトリ内へ指定フォルダを放り込むかんじだと…

robocopy D:\hoge Z:\Backup\hoge /s /e

Backup 内に hoge がなくても新規作成されます。

コピーのオプション指定

私が使ってるのを列挙すると…

  • /MIR - ミラーリング
  • /DCOPY:DAT - ディレクトリのタイムスタンプもコピー
  • /FFT - FAT ファイル時間2秒の差を無視(※ FAT32を使ってないなら不要)
  • /XO - 古いファイルを除外(FolderAのファイルがFolderBの同名ファイルより古い場合)
  • /NP - 進行状況なし(※ あってもいいかも?)
  • /ETA - コピーするファイルの推定完了時刻を表示
  • 【追記】/TEE - ウィンドウとログ ファイルの両方に出力
  • /UNILOG+: - UNICODEでログを出力 (既存のログに追記)
  • /XF - 除外ファイルを指定
  • /XD - 除外ディレクトリ(フォルダー)を指定

【2024.4.28追記】「ファイル属性変更」エラーについて

あくまで一例ですが、NTFSフォーマットの簡易NASへのコピー時にこんなエラーが出ました。

2024/04/28 04:47:23 エラー 5 (0x00000005) ファイル属性を変更しています Z:\zzz_Backup\ アクセスが拒否されました。
30 秒間待機しています... 再試行しています...

NTFSファイル属性がコピーできないようです(※ 簡易NASのOSが非Windowsの為か?)。とりあえずの対処方法というか対症療法となりますが、2通りで

  1. ファイル属性を除外する
  2. エラーを無視、スキップする(※ リトライ回数を少なくする)

※【2】については後述

  • オプション指定 - ファイル属性を除外
/COPY:DT /DCOPY:DT

オプションの詳細は下記の通り

  • /copy:<copyflags>

コピーするファイルのプロパティを指定します。 このオプションの有効な値は次のとおりです。 D - データ A - 属性 T - タイム スタンプ X - 代替データ ストリームをスキップする S - NTFS アクセス制御リスト (ACL) O - 所有者情報 U - 監査情報 /COPY オプションの既定値は DAT (データ、属性、タイム スタンプ) です。 /B または /ZB のいずれかが使用されている場合、X フラグは無視されます。

Robocopy | Microsoft Learn
  • /dcopy:<copyflags>

ディレクトリで何をコピーするかを指定します。 このオプションの有効な値は次のとおりです。 D - データ A - 属性 T - タイム スタンプ E - 拡張属性 X - 代替データ ストリームをスキップする このオプションの既定値は DA (データと属性) です。

Robocopy | Microsoft Learn
  • /copyall

すべてのファイル情報のコピー (に相当 /copy:DATSOU)。

Robocopy | Microsoft Learn
エラーを無視、スキップする
  • リトライ3回待ち時間5秒
/r:3 /w:5

無指定(= デフォルト設定)でもリトライ後にスキップされるようですが、30秒おきにリトライ100万回ってひどすぎw

  • 再試行オプション

/r:<n> 失敗したコピーの再試行回数を指定します。 n の既定値は 1,000,000 (100 万回の再試行) です。 /w:<n> 再試行間の待ち時間 (秒) を指定します。 n の既定値は 30 (30 秒の待ち時間) です。

Robocopy | Microsoft Learn

他のエラー発生の可能性を考慮するとこちらも指定しておいた方がいいかもしれません。(※ エラー原因を無視できるなら)

簡単なバッチファイルを作る

ファイルの冒頭をこんなかんじで、実行するPCをここでは「dell」に限定してます

@echo off
title %~nx0
pushd %~dp0
set SourcePC=dell
if /i not "%ComputerName%"=="%SourcePC%" (
echo:
echo        ==============================================================
echo             %SourcePC% から実行するべし!
echo        ==============================================================
pause >nul
GOTO :EOF
)

フォルダ名、除外ファイル、除外フォルダー、コピー・オプションを指定…

set Source_01=D:\My_Files\Documents
set Target_01=Z:\Backup\Documents
set log=Robocopy-log.txt
set Ex_Folder_01=
set Ex_Folder_02=
set Ex_Folder_03=
set Ex_File_01=
set Ex_File_02=
set Ex_File_03=
robocopy "%Source_01%" "%Target_01%" /mir /DCOPY:DAT /FFT /xo /NP /ETA /TEE /UNILOG+:%log% /xf "%Ex_File_01%" "%Ex_File_02%" "%Ex_File_03%" /xd "%Ex_Folder_01%" "%Ex_Folder_02%" "%Ex_Folder_03%"

終了時に停止させる、何かキーを押せばコマンド窓を閉じる

:DONE
echo.
echo             Done !
echo.
pause >nul

はいはい、大したことなくてすみません… 。゚(゚´Д`゚)゚。

いろいろ

GUIでやりたい場合はこんなソフトもありますな...

もう一つ、双方向同期も可能です。まだ使いこなせてませんが期待大!


ほなまたー!