製造系SEのメモ

普段気になった内容をメモしていきます

xcopyでバックアップ取得(Windows)

f:id:asakat:20190413193345j:plain

バッチファイルとタスクスケジューラでバックアップを取ることになったので方法をメモします。

バックアップを取りたいファイル

バックアップ元フォルダには4つのテキストファイルが保存されています。

C:\backup\from>dir /b
file01.txt
file02.txt
file03.txt
file04.txt

バックアップ先フォルダは空です。

C:\backup\to>dir /b

C:\backup\to>

今回は「to」フォルダ内に以下の条件でバックアップを取ることにします。

  • バックアップは1日1回実行
  • 当日の日付の名前で新しいフォルダを作成してその中にバックアップを保存
  • 2世代前(今日と昨日)までのバックアップを保持(それ以前のものは自動的に削除)

バックアップ用バッチファイル

以下のように実現しました。

::日付フォルダ作成
mkdir C:\backup\to\%date:~0,4%%date:~5,2%%date:~8,2%

::日付フォルダにバックアップ対象ファイルをコピー
xcopy C:\backup\from C:\backup\to\%date:~0,4%%date:~5,2%%date:~8,2% /E


::バックアップ先フォルダに移動
cd C:\backup\to

::2世代前(一昨日)のバックアップを削除
for /F "skip=2" %%i in ('dir /b /o-D') do rd /s /q "%%i"

自分が忘れないためにも詳しく解説します。

まず、

mkdir C:\backup\to\%date:~0,4%%date:~5,2%%date:~8,2%

で日付フォルダを作成しています。
「%date%」で今日の日付を取得できますが、「2019/06/09」のように「/」が入る形式で取得されそのままファイル名には使えないため、「%date:~0,4%」、「%date:~5,2%」、「%date:~8,2%」で数字部分のみを抽出しています。

  • %date:~0,4%⇒1文字目から4文字(年部分)を抽出
  • %date:~5,2%⇒6文字目から2文字(月部分)を抽出
  • %date:~8,2%⇒9文字目から2文字(日部分)を抽出

次に、

xcopy C:\backup\from C:\backup\to\%date:~0,4%%date:~5,2%%date:~8,2% /E

でバックアップ対象ファイルを日付フォルダ内にコピーしています。「/E」オプションでバックアップ元フォルダ内が空であってもコピーするように指定しています。

ここからは古いバックアップを削除するための記述です。

cd C:\backup\to

でバックアップ先フォルダに移動し、

for /F "skip=2" %%i in('dir /b /o-D') do rd /s /q "%%i"

で今取得したバックアップと1つ前のバックアップ以外を削除しています。
削除の考え方は以下の通りです。

  1. 日付フォルダリストを取得して新しい日付順に並び替え
  2. リストから日付フォルダを1つ読み込み、削除(今日と昨日の日付フォルダは削除対象にしない)
  3. 今日と昨日の日付フォルダ以外が削除されるまで②を繰り返し

in ('dir /b /o-D')」部分で日付フォルダリストを取得して新しい日付順に並び替え、「/F "skip=2" %%i」と「do rd /s /q "%%i"」部分で今日と昨日以外日付フォルダを1つ読み込んでフォルダ内のファイルを含めて削除し、「for」で繰り返し実行しています。

バックアップ実行

バッチファイルを実行すると以下の通りです。

C:\backup>backup.bat

C:\backup>mkdir C:\backup\to\20190609

C:\backup>xcopy C:\backup\from C:\backup\to\20190609 /E
C:\backup\from\file01.txt
C:\backup\from\file02.txt
C:\backup\from\file03.txt
C:\backup\from\file04.txt
4 個のファイルをコピーしました

C:\backup>cd C:\backup\to

C:\backup\to>for /F "skip=2" %i in ('dir /b /o-D') do rd /s /q "%i"

C:\backup\to>dir /b
20190609

C:\backup\to>cd 20190609

C:\backup\to\20190609>dir /b
file01.txt
file02.txt
file03.txt
file04.txt

無事にバックアップが取れています。
ちなみに既に昨日と一昨日のバックアップが存在する場合、こんな動きになります。

C:\backup\to>dir /b
20190607
20190608

C:\backup\to>cd C:\backup

C:\backup>backup.bat

C:\backup>mkdir C:\backup\to\20190609

C:\backup>xcopy C:\backup\from C:\backup\to\20190609 /E
C:\backup\from\file01.txt
C:\backup\from\file02.txt
C:\backup\from\file03.txt
C:\backup\from\file04.txt
4 個のファイルをコピーしました

C:\backup>cd C:\backup\to

C:\backup\to>for /F "skip=2" %i in ('dir /b /o-D') do rd /s /q "%i"

C:\backup\to>rd /s /q "20190607"

C:\backup\to>dir /b
20190608
20190609

元々存在していた「20190607」フォルダが削除され、「20190609」フォルダが作成されています。無事に意図した動きになっています。

後はタスクスケジューラにバッチファイルを登録するだけです(以下参考です)。
asakat.hatenablog.com



以上です。