こんにちは、Ryoです。
私は富士通のPRIMERGY TX1320 M3/M4をサーバーとして使用しているのですが、有事の際に持ち出しできるようバックアップとして外付けハードディスク(ELECOM ELD-2B060UBK)にデータを日々コピーしており、その処理はROBOCOPYコマンドで実行しています。今回は設定した際に困った事象(コピー先フォルダが非表示)や各コマンド内容などについて備忘録として書いておこうと思います。
1.使用機器(参考)
私が使用しているサーバーは富士通製のPRIMERGYですが、24時間365日稼働で約3年経過していますが特に故障等も無く快適に利用出来ています。
サーバー内のデータを全てコピーし日々保存する上で使用しているのはエレコム製の外付けHDDになりますが、持ち手が付いているので有事の際に持ち出しやすい点が良いと思っています。私自身、東日本大震災の時にデータが持ち出せずにかなり苦労したので、この点は気にかけるようにしています。
2.ROBOCOPYコマンド
上記機器に対し現在使用しているバッチファイルのコマンドは以下の通りです。ログファイルを作成してDドライブのデータをFドライブ(外付けHDD)にコピーし、Dドライブに付与されている隠し属性とシステム属性の削除を行っています。
@echo off cls set logfile="F:\Log\\%date:~0,4%-%date:~5,2%-%date:~8,2%_bkup.log" robocopy D:\ F:\backup /copy:DT /MIR /FFT /R:0 /W:0 /LOG+:"%logfile%" /NP /NDL /TEE /XJD /XJF attrib -h -s F:\backup
このコマンドをメモ帳などでテキストファイルに記述し、文字コードを「ANSI」または「Shift-JIS」形式で保存して拡張子を「.bat」とすることでバッチファイルとしています。
このバッチファイルを「Windoows管理ツール」にある「タスクスケジューラ」を使用して実行させ、日々深夜時間にデータをDからFへの複製を自動実行させています。
◆各コマンド内容
@echo off
コマンドプロンプト画面にバッチファイルに記述したコマンドを復唱させない(実行都度表示されると煩わしい為)
cls
画面表示のクリア
set logfile="F:\Log\\%date:~0,4%-%date:~5,2%-%date:~8,2%_bkup.log"
ログファイルの作成
date:~0,4 ⇒ 日付の先頭から4文字までを抜き取るので西暦部分(2020)
%-% ⇒ 日付データ間に-を挿入しているので、2020-12-18のようになる
date:~5,2 ⇒ 日付の5文字目から2文字を抜き取るので月の部分(01や11など)
date:~8,2 ⇒ 日付の8文字目から2文字を抜き取るので日の部分(05や31など)
それらの日付データと_bkup.logを付けるので生成されるログファイルは(例)2020-12-18_bkup.logとなる。
robocopy D:\ F:\backup /copy:DT /MIR /FFT /R:0 /W:0 /LOG+:"%logfile%" /NP /NDL /TEE /XJD /XJF
DドライブからFドライブへフォルダやファイルをコピーしログファイルに出力します。
このRobocopyはコピー先に同ファイルが存在する場合、更新されていればコピーしますので結果的に必要なファイルだけをコピーしてくれる為、作業効率が良いのですが「コピー元に存在せず」「コピー先に存在する」場合は「コピー先ファイルを削除する」という点は注意が必要です。
D:\ F:\backup ⇒ DドライブをF:\backupへコピー
≪コピー選択オプション≫
/copy:DT ⇒ D=データ T=タイムスタンプ
/MIR ⇒ ディレクトリツリーをミラー化
≪ファイル選択オプション≫
/FFT ⇒ FATファイル時間を仮定
FATファイルシステムでは、ファイルの作成や更新時刻などは2秒の精度でしか記録できないので、他のファイル・システムとの間でコピーさせると更新時刻が不一致になるという問題が発生する為、「/FFT」を指定することで2秒以内の誤差であれば時刻情報を一致とみなす設定が可能です。
≪再試行オプション≫
/R:0 ⇒ 失敗したコピーに対する再試行回数(この場合0設定なので実行しない)
/W:0 ⇒ 再試行と再試行間の待機時間(この場合0設定なので実行しない)
≪ログオプション≫
/LOG+:”%logfile%” ⇒ ログファイルに出力
/NP ⇒ コピーの完了率を表示しない
/NDL ⇒ ディレクトリ名をログに表示しない
/TEE ⇒ ログファイル出力時にコンソールウィンドウにも出力
≪ファイル選択オプション≫
/XJD ⇒ ディレクトリのジャンクションポイントとシンボリックリンクを除外
/XJF ⇒ ファイルのシンボリックリンク(システム属性)を除外
/XJD /XJFを設定しておかないとファイルやフォルダへのリンクを通常フォルダとしてコピーしてしまい無限コピーの状態になってしまうようなので、必ず設定します。
attrib -h -s F:\backup
このattribコマンドが最初に設定した際に抜けていたので、コピー先のフォルダが表示されずに困っておりました。
表示されない原因としては、Windowsが直接管理しているドライブの最上位フォルダ(ルートであるD:\ など)は、通常のフォルダとは異なりドライブ直下のフォルダやファイルが表示されるにもかかわらず、実は「隠し属性が付加」されています。
Robocopyコマンドはフォルダ属性まで忠実に継承してコピーしますので、そのルートフォルダの隠し属性を持ったままで処理を行い、結果コピー先のフォルダがその属性で上書きされてフォルダが表示されなくなるということのようです。
その為、隠し属性とシステム属性を削除して通常のフォルダとする為にファイル属性の表示と変更を行うattribコマンドを使用し、-h:隠し属性、-s:システム属性をそれぞれ削除しています。
これでDドライブから外付けHDDのFドライブへデータコピーをRobocopyコマンドで実行することができます。
3.まとめ
Robocopyコマンドによるバックアップ自体は簡単なコマンドで実行できるので扱いやすい反面、コマンドによる実行は一歩間違えると大惨事(例えば初回実行時にコピー先とコピー元指定を間違える=全て消える)になりかねないので今回設定した内容などを備忘録としてまとめてみました。
PCや記録媒体の故障、上にも書いた大震災などの災害は突然やってくるものなので備えあれば憂いなしという言葉を私のように痛感することのないよう、バックアップ作業は怠らないことが望ましいと思います。
以上、【Windows】ROBOCOPYコマンドによるバックアップ、備忘録などについてでした!今回の記事が何かの参考になれば幸いです。
Ryo