見出し画像

連載#03■個人向け|Windowsの標準機能だけでバックアップの仕組みをつくる

この記事は連載となっています。
前回の記事をご覧になってからお読みいただけると幸いです。

copyコマンドの拡張版 xcopy

前回までの記事では、copyコマンドを使ってファイルのコピーを体験しました。ところがcopyコマンドは、ファイルはコピーできますがフォルダのコピーには対応していませんでした。

そこでフォルダのコピーに対応したxcopyというコマンドが用意されているので紹介します。

現在の体験用のフォルダについてですが、「FolderA」と「BackupFolder」が用意されていて、現在「FolderA」には a.docx , b.xlsx , c.pptx の3つのファイルが入っている状態です。

FolderAの状態

もしも「BackupFolder」に何かファイルがあるようでしたら、今回の用途で作成したファイルであることを確認してすべて削除しておいてください。

ここで今回のテーマである、フォルダのコピーが体験できるように、「FolderA」内に新しく適当なフォルダを用意してください
ここでは「作業フォルダ」という名前のフォルダを用意しました。さらにその中に何かファイルを入れておいてください。ファイルは何個でも結構です。

  • x.docx

  • y.xlsx

  • z.pptx

現在 フォルダとファイルは、以下のようになっている状態です。

FolderAの状態
「作業フォルダ」内に3つのファイルが入っています。

xcopyの書式を組み立てる

すでにcopyの話で概要は学習しているので簡単に進めていきます。

まず、xcopyコマンドの書式は以下に記します。

xcopy [コピー元] [コピー先] スイッチ

copyコマンドと書式は同じになりますので、ここでは次の話に進めていきます。"スイッチ"という見慣れない言葉は後ほど説明します。

ではフォルダを含めたコピーのコマンドを組み立ててみましょう。
「FolderA」の中身をすべてxcopyによって「BackupFolder」にコピーするので以下のようになります。

xcopy C:\Users\Jimputer\Desktop\FolderA C:\Users\Jimputer\Desktop\BackupFolder /e /y

copyコマンドでは、ファイルしか対応していなかったので[送り元]で指定するパスは、以下のどちらでも可能でした。
C:\Users\Jimputer\Desktop\FolderA
C:\Users\Jimputer\Desktop\FolderA\*.*
xcopyはcopyコマンドと同様の書式で実行させることができます。違いとしては、[送り元]のフォルダにサブフォルダが存在すればそれらを含めて丸ごとコピーがでる機能が備わっていることです。

xcopyの実行の様子

1行目‥xcopyのコマンド(入力すべき部分)
2行目以降‥結果表示(自動的に表示されます)

C:\Users\Jimputer>xcopy C:\Users\Jimputer\Desktop\FolderA C:\Users\Jimputer\Desktop\BackupFolder /E /Y
C:\Users\Jimputer\Desktop\FolderA\a.docx
C:\Users\Jimputer\Desktop\FolderA\b.xlsx
C:\Users\Jimputer\Desktop\FolderA\c.pptx
C:\Users\Jimputer\Desktop\FolderA\作業フォルダ\x.docx
C:\Users\Jimputer\Desktop\FolderA\作業フォルダ\y.xlsx
C:\Users\Jimputer\Desktop\FolderA\作業フォルダ\z.pptx
6 個のファイルをコピーしました

BackupFolderには、コピー元のフォルダの構造を保ったままファイルがコピーされていることが確認できると思います。ファイルの数が少ないので一瞬でコピーが完了すると思います。

コマンドの"スイッチ"について

xcopy C:\Users\Jimputer\Desktop\FolderA C:\Users\Jimputer\Desktop\BackupFolder /e /y

コマンドを記述した最後のスイッチの意味をみていきましょう。
スイッチは「機能のオプション」と考えていただいて結構です。

今回は /e/y のスイッチを付けましたが、それぞれの意味を見ていきます。

/e ‥‥ サブフォルダが空(カラ)であっても、そのサブフォルダをコピーします。
※何もファイルが入っていないフォルダを事前に用意しておく場合などの用途に便利です。フォルダを丸ごとコピーすることがテーマなので対象としています。

/y ‥‥ [送り先]に[送り元]と同名のファイルがあったときに、確認をとらずに上書きします。
※確認をとらないことに不安があると思いますが、バックアップ用途ですので事前に記述に間違いがないことを確認しておくことで、コピーを円滑に実行することができます。
※このスイッチを付けない場合は、多数のファイルをバックアップする際に都度「(ファイル)を上書きしますか (Yes/No/All)?」とメッセージが表示され処理が一時停止されるので、今回の用途で使用するには向いていません。

/y スイッチをつけなかった場合の様子。
※各行で "y" , "n" , "a" を押すことで処理が継続します。ちなみに "a" は、以降の処理について「すべてYes」という意味になります。この一時停止をさせないスイッチとなります。

C:\Users\Jimputer\Desktop\BackupFolder\a.docx を上書きしますか (Yes/No/All)?
C:\Users\Jimputer\Desktop\BackupFolder\b.xlsx を上書きしますか (Yes/No/All)?
C:\Users\Jimputer\Desktop\BackupFolder\c.pptx を上書きしますか (Yes/No/All)?
:
:

xcopyにも弱点が‥

copyの記事と同じで、またか‥と思われるかもしれませんが、体験していただきたいので、できないことも お付き合いください。
xcopyの機能は、ファイルはもちろんサブフォルダも丸ごとコピーできるので、今回のバックアップのテーマの趣旨を考えると、ほぼxcopyの機能だけでニーズを満たします

xcopyだけで機能は十分なのですが、ここでバックアップについて考えてみたいと思います。

この連載ではFolderAを日々の業務で使用するフォルダと仮定して説明を進めていますが、フォルダ内で作成したファイルが不要になって削除した場合、バックアップの対象としてどのように処理が行われることが適切かということについて考えてみたいと思います。

xcopyでバックアップをとったとき、この削除する前の該当ファイルが存在していれば、当然BackupFilderに正しくコピーされます。
その後、日々の業務の中で このファイルが不要になって削除した場合について考えてみましょう。xcopyの処理とBackupFolderの中身はどのような差があるでしょうか。

xcopyコマンドは、BackupFolderがどのような状態になっているかは判定しません一方通行で[コピー元]にあるフォルダとファイルを[コピー先]に一気にコピーするだけです。

その様子を整理すると‥‥
[コピー元]でファイルAを作成する
[コピー先]にバックアップする(ファイルAがコピーされる)
[コピー元]で不要になってファイルAを削除する
[コピー先]にバックアップする(ファイルAはそのまま存在

つまり、FolderAにファイルは存在せず、BackupFilderには残り続けることになります
この方法でバックアップを繰り返すと、BackupFolderは肥大化していきます。特に写真や動画ファイルについてはファイルサイズが大きいため注意が必要です。

xcopyを使ったバックアップの2つの考え方

xcopyが不完全で使い物にならないかというと そうとはいえません。

【1】[コピー元]から削除されたファイルが、[コピー先]に残るメリット
⇒ファイルが増えていくことについては気にする必要がありますが、バックアップのタイミングによっては、"誤って" [コピー元]から削除した場合は、[コピー先]に残っている可能性があります。
このような観点でバックアップをとるのであれば、絶大な効果を発揮するものと思います。

【2】[コピー元]から削除されたファイルが、[コピー先]に残るデメリット
⇒「バックアップはある時点の状態を保存する処理」なので、[コピー元]と[コピー先]の状態に相違ないことが本来の姿です。
いつのバックアップなのか わからないような使わないデータが残り続けているのはあまり効率が良いとはいえません

このようにxcopyはcopyとは異なり、サブフォルダを扱うことができます。またcopyと同様に、[コピー先]のファイルの状態までは把握できないコマンドとなります。

次回ではその点を解消する方法と、いよいよバックアップの仕上げについてのお話をしたいと思います。

それではまたお会いしましょう。
次回は最終回として、バックアップの仕組みを仕上げたいと思います。

この記事が気に入ったらサポートをしてみませんか?