Windowsバッチファイルを使ったデータバックアップ方法(自分の備忘録)

Windowsのバッチファイルを使用して、Excelファイルの定期的なバックアップを作成し、古いバックアップを削除する方法について。

ChatGPTに聞きながら実行した備忘録

1.  シングルファイルバックアップ： 最初のスクリプトは、特定のExcelファイルのバックアップを作成するものです。バックアップの日付をディレクトリ名とし、コピーするファイルを新たなディレクトリに保存します。また、3ヶ月以上前のバックアップを削除する機能も備えています。

2.  ディレクトリ削除の改良： 2つ目のスクリプトは、最初のスクリプトを改良したもので、ディレクトリ内のファイルだけでなく、ディレクトリ自体も削除します。これにより、ディスクスペースの節約に更に寄与します。

3.  マルチファイルバックアップ： 3つ目のスクリプトは、2つの異なるExcelファイルをバックアップします。1つのバッチファイルで複数のファイルを管理するため、管理の手間が軽減されます。

4.  大量のファイルバックアップと遅延環境変数展開： 最後のスクリプトでは、10個の異なるファイルをバックアップします。forループを使用して、各ソースファイルを順にコピーします。このスクリプトでは、遅延環境変数展開を有効化し、ループ内で変数を正しく扱います。

それぞれコードは以下。

***

# シングルファイルバックアップ

このスクリプトは、Windowsのバッチファイルです。具体的には、特定のファイル（この場合は、Excelファイル「グラフ管理.xlsm」）のバックアップを取るためのものです。

その仕組みは次の通りです：

1.  バックアップ元のファイル（source）とバックアップ先のディレクトリ（dest）を設定します。

2.  現在の日付を取得し、それを yymmdd 形式に変換します。

3.  日付のディレクトリがバックアップ先ディレクトリに存在しない場合は、そのディレクトリを作成します。

4.  指定されたファイルをバックアップ先の新たなディレクトリにコピーします。コピーが失敗した場合は、エラーメッセージを表示します。

5.  バックアップ先ディレクトリにある、3ヶ月以上前に作成されたディレクトリを削除します。これも削除に失敗した場合はエラーメッセージを表示します。

<pre><code>@echo off
setlocal

:: バックアップ元のファイル
set "source=S:\*****\*****管理\グラフ管理.xlsm"

:: バックアップ先のディレクトリ
set "dest=C:\Users\*****\Documents\99.backup"

:: 現在の日付を yymmdd 形式で取得
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set "datetime=%%I"
set "datetime=%datetime:~2,6%"

:: バックアップ先のディレクトリに日付のディレクトリを作成
if not exist "%dest%\%datetime%" mkdir "%dest%\%datetime%"

:: ファイルのコピー
echo xcopy /Y /F "%source%" "%dest%\%datetime%"
xcopy /Y /F "%source%" "%dest%\%datetime%"
if errorlevel 1 echo xcopy failed with error %errorlevel%

:: 3ヶ月以上古いディレクトリの削除
forfiles /P "%dest%" /D -90 /C "cmd /c if @isdir==TRUE del /Q @path"
if errorlevel 1 echo forfiles failed with error %errorlevel%

endlocal
</code></pre>

以上の一連の操作を通じて、このスクリプトは定期的にバックアップを取り、古いバックアップを削除することで、ディスクの空き容量を一定に保つ効果があります。

***

# ディレクトリ削除の改良

このスクリプトも前回のものと同様に、特定のファイル（「グラフ管理.xlsm」）のバックアップを作成するためのWindowsバッチファイルです。

前回と異なる部分は、最後の古いディレクトリの削除のコマンドです。このスクリプトでは、del /Q @pathがrd /S /Q @pathに変わっています。

*   del /Q @path：このコマンドは指定したパスのファイルを削除します。しかし、ディレクトリを削除することはできません。
*   rd /S /Q @path：こちらのコマンドは指定したパスのディレクトリを削除します。/Sオプションはサブディレクトリやファイルも一緒に削除することを意味し、/Qオプションは削除操作の確認をスキップします。

したがって、このバッチファイルは、バックアップを作成し、古いバックアップ（3ヶ月以上前に作成されたディレクトリ）を削除する機能を持っています。このスクリプトの方が、ディレクトリ自体を削除する能力を持っているため、より完全に古いバックアップを削除することができます。

<pre><code>@echo off
setlocal

:: バックアップ元のファイル
set "source=S:\*****\管理\グラフ管理.xlsm"

:: バックアップ先のディレクトリ
set "dest=C:\Users\*****\Documents\99.backup"

:: 現在の日付を yymmdd 形式で取得
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set "datetime=%%I"
set "datetime=%datetime:~2,6%"

:: バックアップ先のディレクトリに日付のディレクトリを作成
if not exist "%dest%\%datetime%" mkdir "%dest%\%datetime%"

:: ファイルのコピー
echo xcopy /Y /F "%source%" "%dest%\%datetime%"
xcopy /Y /F "%source%" "%dest%\%datetime%"
if errorlevel 1 echo xcopy failed with error %errorlevel%

:: 3ヶ月以上古いディレクトリの削除
forfiles /P "%dest%" /D -90 /C "cmd /c if @isdir==TRUE rd /S /Q @path"
if errorlevel 1 echo forfiles failed with error %errorlevel%

endlocal
</code></pre>

***

# マルチファイルバックアップ

このスクリプトは、前回のものと似ていますが、1つのファイルではなく2つのファイル（「グラフ管理.xlsm」と「管理表.xlsm」）をバックアップするためのWindowsバッチファイルです。

以下にその機能を詳しく説明します：

1.  バックアップ元のファイル（sourceとsource2）とバックアップ先のディレクトリ（dest）を設定します。

2.  現在の日付を取得し、それを yymmdd 形式に変換します。

3.  日付のディレクトリがバックアップ先ディレクトリに存在しない場合は、そのディレクトリを作成します。

4.  指定された2つのファイルをそれぞれバックアップ先の新たなディレクトリにコピーします。コピーが失敗した場合は、エラーメッセージを表示します。

5.  バックアップ先ディレクトリにある、3ヶ月以上前に作成されたディレクトリを削除します。これも削除に失敗した場合はエラーメッセージを表示します。

<pre><code>@echo off
setlocal

:: バックアップ元のファイル
set "source=S:\*****\管理\グラフ管理.xlsm"
set "source2=S:\*****\管理表.xlsm"

:: バックアップ先のディレクトリ
set "dest=C:\Users\*****\Documents\99.backup"

:: 現在の日付を yymmdd 形式で取得
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set "datetime=%%I"
set "datetime=%datetime:~2,6%"

:: バックアップ先のディレクトリに日付のディレクトリを作成
if not exist "%dest%\%datetime%" mkdir "%dest%\%datetime%"

:: ファイルのコピー
echo xcopy /Y /F "%source%" "%dest%\%datetime%"
xcopy /Y /F "%source%" "%dest%\%datetime%"
if errorlevel 1 echo xcopy failed with error %errorlevel%

echo xcopy /Y /F "%source2%" "%dest%\%datetime%"
xcopy /Y /F "%source2%" "%dest%\%datetime%"
if errorlevel 1 echo xcopy failed with error %errorlevel%

:: 3ヶ月以上古いディレクトリの削除
forfiles /P "%dest%" /D -90 /C "cmd /c if @isdir==TRUE rd /S /Q @path"
if errorlevel 1 echo forfiles failed with error %errorlevel%

endlocal
</code></pre>

したがって、このスクリプトは、2つのファイルの定期的なバックアップを取り、古いバックアップを削除することで、ディスクの空き容量を一定に保つ効果があります。

***

# 大量のファイルバックアップと遅延環境変数展開

このスクリプトもWindowsのバッチファイルですが、10個の異なるファイルをバックアップします。それぞれのファイルは、異なるパス（source1からsource10まで）から取得します。

スクリプトの特徴的な部分は、forループを使用して各ファイルをコピーしています。for %%s in (source1 source2 ... source10)というコードは、ソースのリストから一つずつ取り出して、それぞれのファイルをコピーします。バックアップのソースが複数ある場合に、このようなループを使用するとコードが短くて済み、一つ一つのファイルを手作業でコピーする手間が省けます。

また、setlocal enabledelayedexpansionというコマンドは、遅延環境変数展開を有効にします。これは、forループ内で変数を使用する際に特に重要で、ループ内での変数の値の変化を確実に反映するために必要です。このコマンドがないと、forループ内の変数の値が正しく更新されない可能性があります。

このスクリプトも、それ以前のスクリプトと同じく、バックアップ先の新たなディレクトリを作成し、そこに各ファイルをコピーし、3ヶ月以上前のバックアップを削除するという機能を持っています。

<pre><code>@echo off
setlocal enabledelayedexpansion

:: バックアップ元のファイル
set "source1=S:\*****\管理\グラフ管理.xlsm"
set "source2=S:\*****\管理表.xlsm"
set "source3=S:\----\マクロ\リスト.xlsm"
set "source4=S:\----\マクロ\ﾃﾞｰﾀ.xlsm"
set "source5=S:\12345\記録\マクロ\集計.xlsm"
set "source6=S:\12345\記録\マクロ\ABC.xlsm"
set "source7=S:\12345\記録\マクロ\ABC集計.xlsm"
set "source8=S:\12345\記録\マクロ\保管\棚卸.xlsm"
set "source9=S:\12345\記録\記録管理表\管理記録表.xlsm"
set "source10=S:\12345\記録\歩留まり\集計.xlsm"

:: バックアップ先のディレクトリ
set "dest=C:\Users\*****\Documents\99.backup"

:: 現在の日付を yymmdd 形式で取得
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set "datetime=%%I"
set "datetime=%datetime:~2,6%"

:: バックアップ先のディレクトリに日付のディレクトリを作成
if not exist "%dest%\%datetime%" mkdir "%dest%\%datetime%"

:: ファイルのコピー
for %%s in (source1 source2 source3 source4 source5 source6 source7 source8 source9 source10) do (
    echo xcopy /Y /F "!%%s!" "%dest%\%datetime%"
    xcopy /Y /F "!%%s!" "%dest%\%datetime%"
    if errorlevel 1 echo xcopy failed with error %errorlevel%
)

:: 3ヶ月以上古いディレクトリの削除
forfiles /P "%dest%" /D -90 /C "cmd /c if @isdir==TRUE rd /S /Q @path"
if errorlevel 1 echo forfiles failed with error %errorlevel%

endlocal
</code></pre>

***

以上のように、Windowsのバッチファイルを活用することで、効率的かつ確実にデータのバックアップを取り、古いバックアップの削除によりディスクスペースを節約することができます。これらのスクリプトは、特定のファイルまたは複数のファイルの定期的なバックアップを作成し、ディスクの空き容量を一定に保つ効果があります。

***

# 追記 : バッチファイルの作成とWindowsタスクスケジューラーへの登録

## バッチファイルの作成:

1.  テキストエディタ（例えばNotepad）を開きます。
2.  バッチファイルのコードをエディタに入力します。
3.  ファイルを保存する際に、拡張子を.batにします。
    これで、バッチファイルが作成できます。ダブルクリックすると、記述されたコマンドが実行されます。

## Windowsタスクスケジューラーへの登録:

Windowsタスクスケジューラーを使うと、特定の時刻や特定のイベントに対応してバッチファイルを自動的に実行することができます。以下に、その手順を説明します。

1.  スタートメニューを開き、「タスクスケジューラー」を検索します。
2.  「タスクの作成」をクリックします。
3.  「全般」タブに名前と説明を入力します。
4.  「トリガー」タブをクリックし、「新規」をクリックします。開始日と時刻、そしてタスクの頻度（例えば、毎日、毎週など）を設定します。
5.  「操作」タブをクリックし、「新規」をクリックします。「プログラムの開始」を選択し、バッチファイルのパスを「プログラム/スクリプト」フィールドに入力します。
6.  「OK」をクリックしてタスクを保存します。

以上で、Windowsタスクスケジューラーにバッチファイルが登録され、指定したスケジュールで自動的に実行されるようになります。この機能を利用することで、例えば毎日自動的にデータのバックアップを取るなど、様々なタスクを自動化することが可能になります。