新しいサーバーの構築に伴い、ファイルサーバーのバックアップをシンプルにしたかったのと経費を節約したかったので、バッチファイルにて管理をしようと考えました。
- 世代管理を行い、一番古いフォルダーを削除
- 新しいフォルダーを作成し、ファイルサーバーをフルバックアップ
- 「2」のフォルダー名をバックアップ日付(YYYYMMDD)に変更
これをバッチファイル&タスクスケジューラーで自動化させようと考えていたところ、一部の方がものすごい階層のフォルダー&めちゃくちゃ長いファイル名&機種依存文字というコンボをしていたので、既存のコマンドプロンプトでは止まってしまいはまってしまったので、備忘録代わりのメモです。
長いパスのコピーと削除をバッチファイルで対応させたい
Windows系のファイルシステムは元々260文字を超えるパスを解決できないという問題を抱えています。
会社などで長いファイル名をつけられてしまい、にっちもさっちもいかなくなった場合はどうすればいいかというと、一般的にウェブでサーチすると
- ファイル名やフォルダー名を短くする
- ネットワークフォルダーの場合、接続場所を深い場所にする
- 8.3ファイル名に変更する。
- 「Windows10 1607以降」 若しくは 「Windows Server 2016」 の場合、グループポリシーかレジストリーエディタで設定を変更する。
私の環境の場合、バッチファイルで自動化したいので、「1」、「2」はNG。「3」も自動化させると長くなりそうなので、断念。
「4」についても設定はしたものの解決しませんでした。
結局「Fast Copy」のコマンドラインモードを利用することにより、解決しました。(記載は後述)
世代管理をコマンドラインで自動化
今回はファイルやフォルダーの更新日時ではなく、物理的なフォルダー名を見て、一番古い日付のフォルダーを削除することにしました。
ここで活躍するのが「for 文」です。
一般的な世代管理の構文としては以下の通りになります。
for /F "skip=2" %%A in ('dir /b /o-n') do 実行させたいコマンド %%A
あるディレクトリー配下のフォルダーをループで検索し、2世代を残して実行させたいコマンドで処理をする文になります。
実際に実行させているバッチファイルの構文
今回私が実施しているバッチファイルの構文は以下の通りとなります。
前提として…
- 世代管理は2世代で管理
- ネットワークフォルダー(ファイルサーバーとバックアップサーバーは別)越しにコピー
- コピー&削除ツールは「Fast Copy」を利用
REM 古い日付のバックアップフォルダーを削除 (直近1世代のみ残す)
cd /d d:\backup
for /F "skip=1" %%A in ('dir /b /o-n') do C:\bin\FastCopy\FastCopy.exe /bufsize=512 /disk_mode=diff /speed=full /cmd=delete /auto_close /no_confirm_del %%A
REM 仮フォルダーを作成
md d:\backup\backup_data
md d:\backup\backup_data\hoge1
md d:\backup\backup_data\hoge2
md d:\backup\backup_data\hoge3
REM fastcopyで各フォルダーをコピー
C:\bin\FastCopy\FastCopy.exe /bufsize=512 /disk_mode=diff /speed=full /cmd=diff /auto_close "\\servername\hoge1" /to="D:\backup\backup_data\hoge1"
C:\bin\FastCopy\FastCopy.exe /bufsize=512 /disk_mode=diff /speed=full /cmd=diff /auto_close "\\servername\hoge2" /to="D:\backup\backup_data\hoge2"
C:\bin\FastCopy\FastCopy.exe /bufsize=512 /disk_mode=diff /speed=full /cmd=diff /auto_close "\\servername\hoge3" /to="D:\backup\backup_data\hoge3"
REM 仮フォルダーを本日日付にリネーム
set BACKUPDATE=%DATE:/=%
ren backup_data %BACKUPDATE%
このサンプル記述で、「Fast Copy」を利用し、「高速」かつ「パスが長すぎる問題」を回避し、世代管理を自動化しつつ安価にバックアップを取得することが可能となります。