作業日記@HatenaBlog

各種の作業メモ

ROBOCOPYによるファイルバックアップ

WindowsNAS 等に D ドライブの内容をバックアップしたい。
既存のフリーウェアや xcopy ではロングファイル名で取りこぼしがあるため robocopyバッチ処理する。
以下、サンプルスクリプト

  • コピー元、コピー先は適宜変更のこと。
  • 除外ディレクトリ、除外ファイルも適宜変更のこと。
rem
rem ROBOCOPYによるバックアップ
rem

rem
rem タイムスタンプ生成
rem
set myTIME=%time: =0%
set myTIME=%myTIME::=%
set myTIME=%myTIME:~,6%
set myTIME=%date:/=%_%myTIME%

rem 1)システム関数 %time% で出力される文字列から空白を 0 に置換する
rem 2)コロン : を除去する
rem 3)先頭から 6 文字を取得する
rem 4)日付関数 %date% から / を除去し、3)の時間文字列と連結する

rem
rem LOGファイルの保管ディレクトリ
rem
set myPATH="C:\temp\log"

rem
rem LOGファイル指定
rem
set LOG="%myPATH%\%myTIME%_robocopy.log"

rem
rem 開始日時をログに記録
rem
echo **********>>%LOG%
echo Start...%date%, %time%>>%LOG%
echo **********>>%LOG%

rem
rem オプション指定
rem
set OPT=/ZB /DCOPY:T /MIR /XA:SH /XO /R:0 /W:0 /NP /NDL /V /TEE /LOG+:%LOG%
set OPT=%OPT% /XD "$RECYCLE.BIN" "RECYCLER" "System Volume Information" "Temp" "Temporary Internet Files" "Searches" ".*"
set OPT=%OPT% /XF "Thumbs.db" "desktop.ini" "ntuser.dat*" "*.tmp" ".*" "folder.ico" "*.*~" "*.search-ms" "~$*"

rem /ZB :: 再起動可能モードを使用します。アクセスが拒否された場合、バックアップ モードを使用します。
rem /DCOPY:T :: ディレクトリ タイムスタンプをコピーします。
rem /MIR :: ディレクトリ ツリーをミラー化します (/E および /PURGE と同等)
rem /XA:[RASHCNETO] :: 指定されたいずれかの属性が設定されているファイルを除外します。
rem     S システムファイル属性
rem     H 隠しファイル属性
rem /XO :: 古いファイルを除外します。(改変が無いファイルを除外する)
rem /R:n :: 失敗したコピーに対する再試行数: 既定値は 1,000,000
rem /W:n :: 再試行と再試行の間の待機時間: 既定値は、30 秒です。
rem /NP :: 進行状況なし - コピーの完了率を表示しません。
rem /NDL :: ディレクトリ名をログに記録しません。
rem /V :: スキップされたファイルを示す詳細出力を作成します。
rem /TEE :: コンソール ウィンドウとログ ファイルに出力します。
rem /LOG+:ファイル :: ログ ファイルに状態を出力します (既存のログファイルに追加します)。
rem /XD ディレクトリ [ディレクトリ]... :: 指定された名前/パスに一致するディレクトリを除外します。
rem /XF ファイル [ファイル]... :: 指定された名前/パス/ワイルドカードに一致するファイルを除外します。

rem
rem コピー元
rem
set ORG=D:\.

rem
rem コピー先
rem
set DST=X:\hoge

rem
rem コマンド実行
rem
robocopy %ORG% %DST% %OPT%

rem
rem 隠しフォルダ対策
rem
attrib -H -S %DST%

rem robocopyをするとコピー先フォルダが隠し属性となる不具合があるため、
rem 強制的に隠し属性を解除するもの

rem
rem 終了日時をログに記録
rem
echo **********>>%LOG%
echo End...%date%, %time%>>%LOG%
echo **********>>%LOG%


rem
rem ログローテート
rem

rem 残したいログの個数
set myNUM=5

rem 削除したいログファイル
set myDelFile=%myPATH%\*.log

rem 削除コマンドを実行
for /f "skip=%myNUM%" %%F in ('dir %myDelFile% /b /s /o-D') do del %%F

rem EOF