【Windows】バッチ(bat)ファイルを使用して、WindowsOSのシステムバックアップを取得する！！！

# 1 はじめに
Windowsでは、フォルダやファイル等のリソースをディレクトリ単位でバックアップするだけではなく、OSそのもののシステムバックアップをWindows標準機能である"Windowsバックアップ"から取得することができます。
また、イメージファイルでしたら、リストアも簡単に行えることができます。
本記事では、batファイルからWindowsOSのシステムバックアップを取得する方法をご紹介致します。

# 2 概要

<b>● 機能要件</b>
・Windowsのシステムバックアップを"Windowsバックアップ機能"を使用して取得する
　※"Windowsバックアップ機能"についての詳細は、以下ドキュメントをご参照ください
　　[Windows バックアップ - パソコン初心者講座](https://www.pc-master.jp/backup/windows-backup.html)
　　[PC をバックアップおよび復元する - Microsoft Support](https://support.microsoft.com/ja-jp/windows/pc-%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%8A%E3%82%88%E3%81%B3%E5%BE%A9%E5%85%83%E3%81%99%E3%82%8B-ac359b36-7015-4694-de9a-c5eac1ce9d9c)
・"wenadmin"コマンドを使用してバックアップを取得する
　※ Webadminコマンドについての詳細は、以下ドキュメントをご参照ください
　　[Windows Server バックアップ コマンドのリファレンス](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/windows-server-backup-command-reference)
・イメージファイルは世代管理を行い、最大"2"世代まで保管する
・実行ログを別途ログファイルに出力する
・batファイルを使用する

<b>● 前提条件</b>
・ローカルドライブ(C:)とは別にバックアップイメージの保管先ドライブ/ストレージを用意する(例：外付けHDD,SDD、USB、ネットワークドライブ )
※システムバックアップはバックアップ元ドライブに作成することができない為
・バックアップ対象OSに"Windowsバックアップ"の機能がインストールされていること
※環境によって、システムバックアップ機能が搭載されていない場合があります

<b>● 動作確認環境</b>
Windows10
WindowsServer 2012/2016 

# 3 バックアップ処理
## 3.1 使用手順

<b>① batファイルの作成</b>
早速バックアップ処理を行うbatを作成します。
指定のフォルダ内にて、[メモ帳]を作成し、ファイル名を「Windows_SystemBackup.bat」に変更します。
続けて、以下コードをbatに貼り付けます。

```bat:Windows_SystemBackup.bat
@echo off

REM +--------------------------------------------------------------------+
REM | <スクリプトの説明>
REM | WindowsSystemBackupを取得する
REM |
REM | <更新日>
REM | 作成日：20211004
REM | 最終更新日：20211004
REM |
REM | <使用時における注意事項>
REM | ・本スクリプトの文字コードは「ANSI(SJIS)」を指定すること
REM | ・本スクリプトは<<<管理者権限>>>で実行すること
REM |
REM | <コメント>
REM | ・使用時の設定箇所 ⇒ [%drive%] [%BK_PATH%] [%LOG_PATH%] [%count%]
REM |   ※必要に応じて ⇒ [%username%] [%password%] [%dirlabel%]
REM +--------------------------------------------------------------------+


REM +--------------------------------------------------------------------+
REM | 事前準備
REM +--------------------------------------------------------------------+

REM +-- 管理者権限で実行しているか判定する --+
net session >nul 2>&1
if %ERRORLEVEL% equ 0 (
  echo バックアップ処理を実行中です...
) else (
  echo ##### エラー!!! #####
  echo 管理者権限で実行していません。
  echo 処理を中断します。
  echo 管理者権限で再度実行してください
  pause
  exit
)

REM +-- 現在の日付を取得(yyyy, mm, dd)を取得 --+
set YYYY=%date:~0,4%
set MM=%date:~5,2%
set dd=%date:~8,2%

REM +-- スクリプトの開始時刻を取得 --+
set time_tmp=%time: =0%
set now=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%



REM +--------------------------------------------------------------------+
REM | パラメータ設定
REM +--------------------------------------------------------------------+

REM
REM >>>>> [設定開始]
REM

REM +-- バックアップ先ドライブがローカルドライブの場合は<local>と指定する --+
REM +-- バックアップ先ドライブがネットワークドライブの場合は<network>と指定する --+
set drive=local

REM +-- バックアップ先ドライブが"ネットワークドライブ"の場合にユーザ名とパスワードを指定する --+
REM +-- ローカルの場合はデフォルト値で問題無い --+
set username=user
set password=passwd
set dirlabel=r

REM +-- バックアップイメージの出力先ドライブ(デフォルトではDドライブを指定) --+
REM +-- ネットワークドライブを指定する場合は[set BK_PATH=\\192.168.xx.xx\<ストレージ名>(\<ディレクトリ名>)]と指定する --+
set BK_PATH=d:

REM +-- 実行ログ保管ディレクトリ(デフォルトでは以下カレントディレクトリを指定) --+
set LOG_PATH=%CD%\

REM +-- バックアップ保存世代数 --+
REM +-- ※当日分を含めた過去分バックアップを保存する世代数 --+
REM +-- ※過去分バックアップを保存しない場合は1を指定する --+
set count=2

REM
REM <<<<< [設定終了]
REM

REM +-- ログディレクトリ名(yyyy) --+
set yyyy_DIR=%YYYY%\

REM +-- ログディレクトリ名(mm) --+
set mm_DIR=%MM%\

REM +-- ログファイル名 --+
set LOG_NAME=Windows10_SystemBackup_%YYYY%%MM%%dd%.log

REM +-- ログファイルフルパス --+
set LOG_FILE=%LOG_PATH%%yyyy_DIR%%mm_DIR%%LOG_NAME%

REM +-- バックアップイメージ出力先フルパス --+
set BK_DATA_before=%BK_PATH%\WindowsImageBackup

REM +-- バックアップイメージ移動後フルパス --+
set BK_DATA_after=%BK_PATH%\%COMPUTERNAME%\WindowsImageBackup_%YYYY%%MM%%dd%

REM +-- バックアップイメージ保管ディレクトリ --+
set backupdir=%BK_PATH%\%COMPUTERNAME%

REM +-- カレントディレクトリのパス --+
set cur=%CD%



REM +--------------------------------------------------------------------+
REM | 必要リソースの生成
REM +--------------------------------------------------------------------+

REM +-- ログディレクトリ(yyyy)を作成 --+
REM +-- チェック対象のディレクトリを指定 --+
set Check_yyyy_DIR=%LOG_PATH%%yyyy_DIR%
REM +-- ディレクトリが存在するかチェックする --+
if exist %Check_yyyy_DIR% goto CODE_OK_1
if not exist %Check_yyyy_DIR% goto Create_yyyy_DIR
:Create_yyyy_DIR
mkdir %Check_yyyy_DIR%
:CODE_OK_1
REM 処理無し

REM +-- ログディレクトリ(mm)を作成 --+
REM +-- チェック対象のディレクトリを指定 --+
set Check_mm_DIR=%LOG_PATH%%yyyy_DIR%%mm_DIR%
REM +-- ディレクトリが存在するかチェックする --+
if exist %Check_mm_DIR% goto CODE_OK_2
if not exist %Check_mm_DIR% goto Create_mm_DIR
:Create_mm_DIR
mkdir %Check_mm_DIR%
:CODE_OK_2
REM 処理無し



REM +--------------------------------------------------------------------+
REM | 実行前処理
REM +--------------------------------------------------------------------+

REM +-- バックアップ先ドライブが"ローカル"か"ネットワーク"かを判定する
if %drive% == network (
  REM "ネットワーク"の場合、ネットワークドライブへ接続する
  net use %dirlabel%: %BK_PATH% /user:%username% %password% > nul
) else if %drive% == local (
  REM 処理無し
) else (
  echo ##### エラー!!! #####
  echo %%drive%%の指定に誤りがあります
  echo 処理を中断します
  echo %%drive%%を"local"か"network"で再指定してください
  pause
  exit
)

REM +-- ログ見出し（開始時刻）出力 --+
Echo **************  Windows10_SystemBackup.bat %now% Start  ************** >> %LOG_FILE%



REM +--------------------------------------------------------------------+
REM | バックアップ処理
REM +--------------------------------------------------------------------+

REM +-- システムバックアップを取得する ⇒ 実行ログをログファイルへ出力する --+
wbadmin start backup -backupTarget:%BK_PATH% -allCritical -vssCopy -quiet >> %LOG_FILE%
REM mkdir %BK_PATH%\WindowsImageBackup



REM +--------------------------------------------------------------------+
REM | 世代管理
REM +--------------------------------------------------------------------+

REM +-- バックアップ先ドライブに合わせ、世代管理処理を実行する
if %drive% == local (
  REM +-- バックアップイメージを移動する --+
  move %BK_DATA_before% %BK_DATA_after%
  REM +-- 不要イメージの削除 --+
  for /f "skip=%count%" %%a in ('dir "%backupdir%" /B /O-N') do (
    rmdir /S /Q %backupdir%\%%a
  )
) else if %drive% == network (
  REM +-- ドライブ移動 --+
  %dirlabel%:
  REM +-- バックアップイメージを移動する --+
  move %BK_DATA_before% %BK_DATA_before%_%YYYY%%MM%%dd%
  REM +-- 不要イメージの削除 --+
  for /f "skip=%count%" %%a in ('dir "%BK_PATH%" /B /O-N') do (
    rmdir /S /Q %BK_PATH%\%%a
  )
  REM +-- ドライブ移動 --+
  cd /d %cur%
  REM +-- NWドライブを切断 --+
  net use %dirlabel%: /delete > nul
)



REM +--------------------------------------------------------------------+
REM | 実行後処理
REM +--------------------------------------------------------------------+

REM +-- ログ見出し（終了時刻）出力 --+
set time_tmp=%time: =0%
set end=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%
Echo **************  Windows10_SystemBackup.bat %end% End  ************** >> %LOG_FILE%

Pause
```

<b>② パラメータの修正</b>
作成したbatファイル内の以下変数値をご自身の環境に合わせ修正してください。

```:パラメータ修正箇所
修正必須 ⇒ [%drive%] [%BK_PATH%] [%LOG_PATH%] [%count%]
必要に応じて ⇒ [%username%] [%password%] [%dirlabel%]
```

<b>③ バックアップの実行</b>
作成したbatファイルにて、[右クリック] --> [管理者として実行する]をクリックし、バックアップ処理を開始します。
※システムバックアップは処理に時間がかかります。（目安 --> 20分～50分）

## 3.2 進行状況の確認</b>
ログファイルを参照することで現在の進行状況を確認することができます。

```:進行状況例
wbadmin 1.0 - バックアップ コマンドライン ツール
(C) Copyright Microsoft Corporation. All rights reserved.

ボリューム情報を取得しています...
これにより システムで予約済み (1.05 GB),(C:),(\\?\Volume{21cb76a2-0000-0000-0000-10d11b000000}\) が d: にバックアップされます。
D: へのバックアップ操作を開始しています。
バックアップに指定されたボリュームのシャドウ コピーを作成しています...
バックアップに指定されたボリュームのシャドウ コピーを作成しています...
バックアップに指定されたボリュームのシャドウ コピーを作成しています...
ボリューム システムで予約済み (1.05 GB) のバックアップを作成中に (0%) をコピーしました。
ボリューム システムで予約済み (1.05 GB) のバックアップを作成中に (100%) をコピーしました。
ボリューム システムで予約済み (1.05 GB) のバックアップは正常に完了しました。
ボリューム (C:) のバックアップを作成中に (0%) をコピーしました。
ボリューム (C:) のバックアップを作成中に (1%) をコピーしました。
ボリューム (C:) のバックアップを作成中に (1%) をコピーしました。
ボリューム (C:) のバックアップを作成中に (3%) をコピーしました。
ボリューム (C:) のバックアップを作成中に (5%) をコピーしました。
ボリューム (C:) のバックアップを作成中に (6%) をコピーしました。
ボリューム (C:) のバックアップを作成中に (8%) をコピーしました。
ボリューム (C:) のバックアップを作成中に (9%) をコピーしました。
ボリューム (C:) のバックアップを作成中に (11%) をコピーしました。
ボリューム (C:) のバックアップを作成中に (12%) をコピーしました。
ボリューム (C:) のバックアップを作成中に (13%) をコピーしました。
```


##3.3 動作確認
バックアップ先ディレクトリ、及びログファイルを参照しバックアップが無事完了しているか確認します。
※WindowsServerであれば、[Windosバックアップ]画面にてGUIで完了状況を確認することができます

<b>● バックアップ先ディレクトリの確認</b>
バックアップ先ディレクトリにて、以下階層、及びイメージファイルが作成されているかを確認します。

```:バックアップ先のフォルダ階層
WindowsImageBackup/
　　　　　　　　　├ <ホスト名>/
　　　　　　　　　　　　　　　├ Backup <作成日時>/
　　　　　　　　　　　　　　　├ Catalog/
　　　　　　　　　　　　　　　├ Logs/
　　　　　　　　　　　　　　　├ SPPMetadataCache/
　　　　　　　　　　　　　　　└ MediaId
```
![windowssystembackup_directory_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570694/840f8147-98ac-6eb6-780c-e170cd0062c7.png)

<b>● 実行ログの確認</b>
ログファイルを参照し、以下点を確認します。
・エラーが出力されていないこと
・最下行に処理の終了ログが出力されていること
※システムバックアップ処理のみでしたら、Windowsバックアップの標準機能により以下パスにログファイルが作成されます。
　"C:\Windows\Logs\WindowsBackup\<ログファイル>"

```:完了ログ
ボリューム (C:) のバックアップを作成中に (99%) をコピーしました。
ボリューム (C:) のバックアップは正常に完了しました。
ボリューム  (541.00 MB) のバックアップを作成中に (0%) をコピーしました。
ボリューム  (541.00 MB) のバックアップを作成中に (0%) をコピーしました。
ボリューム  (541.00 MB) のバックアップを作成中に (99%) をコピーしました。
ボリューム  (541.00 MB) のバックアップは正常に完了しました。
バックアップ操作の概要:
-----------------------

バックアップ操作が正常に完了しました。
ボリューム システムで予約済み (1.05 GB) のバックアップは正常に完了しました。
ボリューム (C:) のバックアップは正常に完了しました。
ボリューム  (541.00 MB) のバックアップは正常に完了しました。
正常にバックアップされたファイルのログ:
C:\Windows\Logs\WindowsBackup\Backup-11-10-2021_19-22-04.log
```
# 4 注意事項・ポイント
・バックアップ先ドライブには、Windowsが認識しているドライブのみ指定することができます。ローカルと同期しているドライブ(GoogleDrive等..)はバックアップ先として指定できませんのでご注意下さい

・バックアップ先ドライブにネットワークドライブを指定する場合、トラフィックによっては処理に時間がかかる場合があります。（平気で2~3時間かかる時があります）