Windows Lab #1 ― フォルダー・ファイルのバックアップ

# Windows Lab #1 ― フォルダー・ファイルのバックアップ

robocopy コマンドで Windows PC の D: ドライブの任意のフォルダー・ファイルをバックアップするバッチ・ファイルを作成してみました。

::: note warn
バッチ・ファイルを書き間違えると、想定外の動きをします（書き間違えた通りに動作します）ので、バッチ・ファイルの作成および実行については、自己責任でお願いします。
:::

## このような方に向けて

このような方がいるのかどうか分かりませんが（私、一人だけだったりして...）。

* 基本は D: ドライブにファイルを保存している。“C:\Users\\{user-name\}\Documents” とか使用していない。

* USB ハードディスクにバックアップしたい。OneDrive などを使用したくない。

* 現状、エクスプローラーを使って、手で D: ドライブのフォルダーを選んでは USB ハードディスクにコピー、を繰り返している。面倒くさい...。

* エクスプローラーでフォルダーやファイルをコピーすると、コピー先のフォルダーやファイルの作成日付が、コピーを実施した日付になってしまう。大きな実害はないのだが、ちょっと気に入らない、だけど仕方ない...。

* もう少し良い方法はないのか？

**追記**

私と同じ考えの方がいて、私に近いものを開発されている方がいました。

https://qiita.com/fernet/items/ae40f34c851d4a47484f

## robocopy とは

“Windows の堅牢性の高いファイルコピー” だそうです。

* フォルダー内のファイルを、別のフォルダーにコピーします。
* ファイルの作成日付などの属性もマルっとコピーできます。
* robocopy にはたくさんのオプションがあります。過去にコピーしたディレクトリに上重ねする形で差分コピーとかもできるようです。

私は “バカの一つ覚え” で以下をよく使います。
フォルダー名には絶対パスを使用することが多いです。フォルダー名をミスると想定外のフォルダーから想定外のフォルダーへコピーすることになりますので。

```bat:コマンド・プロンプト
C:\Users\xxxx> robocopy {コピー元のフォルダー名} {存在しないコピー先のフォルダー名} /MIR /DCOPY:DAT
C:\Users\xxxx> exit
```

## バッチ・ファイル例

**バッチ・ファイルの処理概要**
1. robocopy で “D:\Developments” 配下および “D:\Documents” 配下を “E:\PC-Backup_yyyy.mm.dd”（注）の配下に複写します。
2. robocopy の標準出力を “E:\PC-Backup_yyyy.mm.dd” 配下の “backup-log.txt” に保存します。
3. “D:\backup.bat” を “E:\PC-Backup_yyyy.mm.dd” 配下の “backup.bat_” に複写します（バッチ・ファイルを誤って実行しないよう、拡張子は “.bat_” としておきます）。

注）yyyy.mm.dd は、バッチ・ファイルを実行した日付。

**バッチ・ファイルの内容**

```bat:backup.bat
@rem
@rem backup.bat
@rem

@echo off

echo ## backup - start ##
set today=%DATE:~0,4%.%DATE:~5,2%.%DATE:~8,2%
set home=E:\PC-Backup_%today%
set log=%home%\backup-log.txt

echo destination directory : %home%

if exist "%home%" (
  echo %home% already exists.
  goto :end
)

set /p yesno="Are you sure ? (y/n) : "
if "%yesno%" neq "y" goto :end

echo copy - start

@echo on

mkdir "%home%"
type nul > "%log%"
robocopy "D:\Developments" "%home%\Developments" /MIR /DCOPY:DAT /NP >> %log%
robocopy "D:\Documents" "%home%\Documents" /MIR /DCOPY:DAT /NP >> %log%
copy "D:\backup.bat" "%home%\backup.bat_"

@echo off

echo copy - end

:end
echo ## backup - end ##
pause
```

“rem” は、コメント行です。
“@” は、その行のコマンド・ラインをエコー・バックさせなくするものです。
 “echo off” は、以降の行のコマンド・ラインをエコー・バックさせなくすものです。

エコー・バックとは、コマンドを入力した画面に対し、コマンドを入力画面に送り返すこと。この仕組みにより、コマンドの内容が正しいかどうかを目視確認することができる。

## 使い方

**想定している環境**

* D: ドライブがある。
* E: ドライブがない。USB ディスクを差し込むと、USB ディスクが E: ドライブに割り当てられる。

**手順**
  1. ノートパッドを開き、上記のソースコードをコピー・ペーストして、“D:\” 直下にファイル名 “backup.bat” として保存してください。
  2. USB ハードディスクを差し込んでください。
  3. USB ハードディスクが E: ドライブになっていることを確認してください。
  4. エクスプローラーで “backup.bat” をダブルクリックしてください。
  5. “Are you sure ?(y/n)” で “y” ＋ “Enter” を入力するとバックアップを開始します。

```bat:コマンド・プロンプト
## backup - start ##
destination directory : E:\PC-Backup_2024.01.01
Are you sure ? (y/n) : y
copy - start

D:\>mkdir "e:\PC-Backup_2024.01.01"

D:\>type nul  1>"e:\PC-Backup_2024.01.01\backup-log.txt"

D:\>robocopy "D:\Developments" "E:\PC-Backup_2024.01.01\Developments" /MIR /DCOPY:DAT /NP  1>>E:\PC-Backup_2024.01.01\backup-log.txt

D:\>robocopy "D:\Documents" "E:\PC-Backup_2024.01.01\Documents" /MIR /DCOPY:DAT /NP  1>>E:\PC-Backup_2024.01.01\backup-log.txt

D:\>copy "d:\backup.bat" "e:\PC-Backup_2024.01.01\backup.bat_"
        1 個のファイルをコピーしました。
copy - end
## backup - end ##
続行するには何かキーを押してください . . .
```

## 注意

* バッチ・ファイルを書き間違えると、想定外の動きをします（書き間違えた通りに動作します）ので、バッチ・ファイルの内容をよく確認し、かつテストをしっかりやってください。

* 今回は、robocopy に全角文字を指定することを考慮していません。もし、robocopy に SHIFT-JIS の全角漢字を含むフォルダー名を指定したり、robocopy に UTF-8 の文字（例えば、中国語など）を含むフォルダー名を指定したりする場合は、なんらかの対処が必要です。考えられる方法は、以下です（試していません）：

  * SHIFT-JIS の全角漢字を含むフォルダー名があるなら、バッチ・ファイルを SHIFT-JIS で保存するとよい？
  * UTF-8 の文字（例えば、中国語など）を含むフォルダー名があるなら、バッチ・ファイルを UTF-8 で保存して、コマンド・プロンプトを起動して、“chpc 65001” してから、コマンド・プロンプト上でバッチ・ファイルを実行するとよい？

* なお、robocopy に半角英数字のフォルダー名を指定すれば、そのフォルダー配下に全角漢字や UTF-8 文字があっても問題なく動作します。

* コピー処理を早くするために、robocopy の標準出力をファイルに保存することにしました。標準出力に書き出す文字列が多いとき、コマンド・プロンプトへの書き出しに時間を使ってしまう可能性があるという経験に基づいています。

* 過去に USB ディスクをたくさん差し込んだことにより、1つだけ USB ディスクを差し込んだときに E: ドライブにならない（F: ドライブとかになってしまう）場合は、“ディスクの管理” を使って、ドライブ名を変更することができます。“ディスクの管理” は、[Windows] キーと “X” を同時に押し、コンテキスト・メニューから “ディスクの管理” を選択することで起動できます。

* バッチの実行中には、ノートパッド等で “backup.bat” を修正しないほうがよいです。バッチフ・ァイルは一行づつ読み込みながら実行するようなので、“backup.bat” が修正されると、実行結果がおかしくなるようです。

## 参考

https://qiita.com/kazu_kr/items/e54642d0b4ecb217e5a6

https://qiita.com/himrox/items/3dc7dec2c0e584a78e3d

https://qiita.com/tatsubey/items/4b3141375a9a539f3300