Windows TIPS
[Scripting]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

WSHで簡単なバックアップツールを作成する

解説をスキップして操作方法を読む

山田 祥寛
2003/09/13
 
対象OS
Windows NT
Windows 2000
Windows XP
Windows Server 2003
日々コンピュータ上で更新されるドキュメントやデータは、いずれも重要な資産である。
これらのデータを不測の事故によって消失させないためには、日々のバックアップ作業が重要である。
WSHを用いることで、特別なバックアップツールを用いなくても、指定したフォルダの内容を日単位でまとめてバックアップすることが可能になる。
 
解説

 ユーザーが日々コンピュータ上で作成・更新しているドキュメントやデータは、いずれも重要な資産である。多くのデスク・ワーカーにとって、それが自分たちの工数によって生み出された唯一の成果物であり、労働の代替である以上、障害によるデータの消失を未然に防ぐことは重要な業務の一環でもあろう。

 もっとも、ハードウェアやソフトウェアの障害は100%未然に防げるものではない。そうである以上、障害時にいかに迅速に、かつ正確にデータを復旧できるかという点――つまり、バックアップというアプローチが重要になってくるのである。

 通常、バックアップには専用のツールを使うことが多いが、本TIPSではWSHを利用してこれを実現してみることにする。本サンプルを利用することで、指定されたフォルダについて、日単位にバックアップを生成することが可能となる。単なるツールの理解という意味だけでなく、WSHでファイルやフォルダを操作する基本的な手法の学習という意味でも、重要であると思われる。


操作方法

手順1―テキスト・エディタでスクリプトのコードを入力する

 まずはテキスト・エディタ(メモ帳でも何でもよい)を開き、以下のコードを入力してほしい。なお、引用符(')で始まる行はコードの概要を解説するためのコメント部分なので、省略しても構わない。

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="MyBackUp">
<?job error="true" debug="true" ?>
<object id="objFs"  progid="Scripting.FileSystemObject" />
<resource id="backup_config">
D:\wsh_test
D:\wsh_test2
</resource>
<!--<resource>要素は、コードから切り離して管理されるべきデータを記述するのに用いる。ここではバックアップの対象となるフォルダ名を改行区切りで指定する-->
<script language="VBScript">
<![CDATA[
On Error Resume Next
  ' 実行時エラーが発生しても、処理を中断せずに以降の処理を継続する。
  ' これによって、<resource>要素で定義されたフォルダが存在しない場合なども、すべての処理を完了させることができる。
Const MYFLD="d:\MyBackUp"
  ' バックアップ先フォルダの名前を設定する。本フォルダ配下に日単位のバックアップデータが生成される。
  ' ユーザーの実行環境に応じて、適宜変更して欲しい。なお、ここで指定されたフォルダがあらかじめ環境上に設定されていない場合、バックアップ処理全体が失敗するので注意。
aryCnf=Split(getResource("backup_config"),Chr(13) & Chr(10))
  ' getResource関数は<resource>要素で指定されたデータを取得する。
  ' ここでは<resource>要素で指定されたデータを改行文字で分割し、配列aryCnfに格納する。以下のForループではここで生成された配列の全要素について繰り返し処理を行っている。
For i=0 To UBound(aryCnf)
  strPth=Trim(aryCnf(i))
  If Not IsNull(strPth) And strPth<>"" Then
    strDst=objFs.BuildPath(MYFLD,FormatDateTime(Date,1))
    If Not objFs.FolderExists(strDst) Then objFs.CreateFolder(strDst)
    aryDst=Split(Right(strPth,Len(strPth)-InStrRev(strPth,":")+1),"\")
    For j=1 To UBound(aryDst)
      strDst=objFs.BuildPath(strDst,aryDst(j))
      If Not objFs.FolderExists(strDst) Then objFs.CreateFolder(strDst)
    Next
    objFs.CopyFolder objFs.BuildPath(strPth,"*"),strDst,True
    objFs.CopyFile objFs.BuildPath(strPth,"*"),strDst,True
  End If
Next
  ' 配列aryCnfの要素が空でもNullでもない場合にバックアップ処理を行う。
  ' まず「YYYY年MM月DD日」のようなフォルダをMYFLD配下に作成した後、個々のフォルダ(サブフォルダ)、およびファイルをコピー処理する。
  ' この際、入れ子となったForループで上位フォルダから順にフォルダを生成している点に注意して欲しい。CreateFolderメソッドは存在しない上位フォルダも含めて、下位フォルダを生成することはできない。また同様に、CopyFolderメソッドは存在しない親フォルダが存在しないフォルダを指定した場合、エラーとなる。
WScript.Echo("バックアップ処理が完了しました。")
]]>
</script>
</job>
</package>
  • サンプル・ファイルのダウンロード
     注:サンプルMyBackUp.wsfをダウンロードするには、上のリンクを右クリックして、MyBackUp.wsfというファイル名で保存してください)

 WSHの実行ファイルは拡張子「.wsf」(Windows Scripting host File)とする必要がある。ファイル名自体は何でもよいが、ここでは「MyBackUp.wsf」という名前で保存しておく。

 なおスクリプト中には、ユーザーの環境に合わせて変更しなければならない部分が2カ所ある。1つは、バックアップ元のフォルダ名を指定している<resource>要素の内容である。<resource>要素を使うと、データをコードから分離させることができる(上記のコード中では、D:\wsh_testとD:\wsh_test2の2つのフォルダを指定している。複数のフォルダを指定する場合は、1行に1フォルダずつ記述すればよい)。もう1つは、バックアップ先のフォルダを指定する定数MYFLDである。いずれも、環境に応じて適切なフォルダ名に変更していただきたい。

手順2―WSHのコードを実行する

 MyBackUp.wsfを実行するには、エクスプローラなどからMyBackUp.wsfをダブルクリックするだけだ。その際、あらかじめスクリプト中の定数MYFLDで指定されたフォルダ、また、<resource>要素で指定されたリスト内のフォルダが実際に存在することを確認してほしい。特に定数MYFLDで指定されたフォルダが存在しない場合、MyBackUp.wsfは正常に動作しないので注意すること。実行後、「MYFLD\yyyy年mm月dd日\〜」フォルダ以下に指定したデータのバックアップが作成されていれば成功である。

 なお本稿では割愛するが、バックアップしたデータを指定するだけで元のフォルダに復元できるコードもあれば、ツールとして本格的になるであろうし、ある一定期間を過ぎたフォルダを自動的に削除するようにすれば、不必要にハードディスクを圧迫するようなこともなくなるであろう。

 また、本稿とは直接関係しないが、MYFLDで指定したフォルダは、圧縮属性を付けておくとよい。このような直接アクセスするケースの少ないデータについては、フォルダを圧縮することでハードディスクの容量を節約できる。フォルダに圧縮属性を設定するためには、エクスプローラでフォルダの[プロパティ]を表示させ、[詳細]ボタンを押して、[圧縮属性および暗号化属性]にある[内容を圧縮してディスク領域を節約する]というチェック・ボックスをオンにする。End of Article

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間