Update: 2011/06/01 USBメモへリのバックアップに「デスクトップ」を追加しました。

XCOPY-ディスク丸ごとバックアップ

自動バックアップで安心、便利!?

バックアップは大切だ!

あなたは、パソコンを使っていてトラブルに遭遇したことは、ありませんか?
誰でも、長期にわたってパソコンを使っていると必ず何らかのトラブルに遭遇します。
例えば、ハードディスクやメモリー、CPU、マザーボードなど部品の故障やWord、Excel、Windowsなどソフトウェアの不調が代表的なトラブルとしてあげられます。

そして、こうしたトラブルが発生するごとに、データのバックアップやプログラムの入れ替えといった長時間の復旧作業をしなければなりません。
場合によっては、仕事で使う重要書類やデジカメで取った記念写真などのデータが消失するといった被害をこうむることもあるのです。
プログラムやOSは、インストールしなおせばよいのですが、一度失った個人のデータは、二度と元には戻せません。
バックアップの話をしていると、「私のパソコンには重要なデータなんか入っていないから大丈夫。」といったことをよく聞くのですが、メールアドレスの設定(メールサーバーやメールパスワード)や、インターネットでサービスを受けるためのログインID・パスワードなどメモに残していない情報が消失してしまって困ることも多いのです。
そこで、こうしたトラブルに対処するために日ごろから「バックアップ」をとるようにするわけです。

じつは、バックアップ自体は、主に個人が作った書類やデジカメの画像などを中心にバックアップ用のフォルダーやCD−R/DVD−Rなどにコピーするだけの簡単な作業です。
でも現実には、コピーをとるという一手間がなかなかできないことも事実なのです。
よく、日時を決めて作業をすればよいとかいわれるのですが、忘れたり面倒だったりして結局「バックアップをとっていない」ということになりがちです。

今なら、安価な市販のバックアップソフトであってもスケジュール機能がついていたり、ハードディスク全体のドライブイメージを丸ごとコピーして、トラブル時の復旧作業が簡単にできるようになっていたりします。

バックアップソフトの例)
プラットフォーム: Windows
----------------------------
参考価格: ¥ 6,720 (税込)

(機能・特徴)
通常使用するシステム用とバックアップ用の2台のハードディスクを使いシステムの2重化を図ります。
システムディスクの内容は、バックアップディスクにそのまま(非圧縮)で記録されるため、ハードディスクの使用効率は悪くなります。
その反面、システムダウン時には、起動ディスクをバックアップディスクに切り替えることでダウン時間を最小化することができます。

プラットフォーム: Windows
----------------------------
参考価格: ¥ 10,290 (税込)

(機能・特徴)
ハードディスク上にバックアップ用のシャドウエリアを作成し、ここにシステムのバックアップをとります。
システムダウン時には、シャドウエリアのバックアップ情報をシステムエリアに戻すことで起動します。
このソフトでは、1台のハードディスクでバックアップがとれますが、ハードディスクの物理的な障害には対応できない場合があります。

プラットフォーム: Windows
----------------------------
参考価格: ¥ 3,970 (税込)

(機能・特徴)
バックアップ、パーティション管理、データ消去ツール、操作履歴消去の4つのソフトをまとめたお得なパックです。
システム障害の復旧というよりも、大事なデータを消失しないため、あるいはデータの流出を防ぐためのソフトです。

どのソフトも実績に定評がありますが、それぞれ特徴がありますので必要な機能を確認して選択しましょう。

カスタム検索

無料でバックアップをとるには

このように市販ソフトでバックアップをとる方法は、お手軽で大変よい方法なのですが、バックアップのためにわざわざソフトを買うのはいやだという人も居るでしょう。
※例えば私のように...σ(^_^;

で、登場するのが無料でバックアップをとる方法なのですが...

じつは、これにもフリーソフトを使う方法とマザーボードの機能を利用したRAIDあるいは、XCOPY・バックアップなどWindows付属のユーティリティを利用する方法など多くの選択肢があります。
どの方法を使うかは好みで決めてよいと思いますが、

  • フリーソフトの場合、使うソフトの選択肢が多い反面、期待する機能・動作の保証が無い。
    参考)Vector バックアップソフト
  • マザーボードの機能を利用したRAIDでは、マザーボードがRAIDに対応していなければなりません。
     参考)マザーボードの情報
  • XCOPYはお手軽だが、システムの完全なコピーは取れない
  • バックアップユーティリティは、バックアップを専用ファイルとして保存するため扱いにくい
     参考)WindowsXP Home版

といった長所と欠点があるのです。

またこれらのバックアップ作業については、ソフトウェアRAIDか自動バックアップ機能のついたフリーソフトでない場合、基本的に手動で実行しなければなりません。
そこで、バックアップを自動的に行うために工夫をする必要があります。
ここでは、一番お手軽なXCOPYを使った「ハードディスクの丸ごとバックアップ」と「バックアップの自動化方法」を紹介することにします。

ページの先頭へ戻る

システムをバックアップするには

XCOPYは、先ほど紹介した通り、単純にファイルをコピーするDOS用のコマンドです。
使い方は、
XCOPY 送り側 [受け側] [/A | /M] [/D[:日付]] [/P] [/S [/E]] [/V] [/W]
                      [/C] [/I] [/Q] [/F] [/L] [/H] [/R] [/T] [/U]
                      [/K] [/N] [/Z]
                      [/EXCLUDE:ファイル1[+ファイル2][+ファイル3]...]

  送り側      コピーするファイル (複数可) を指定します。
  受け側      新しいファイルの位置や名前を指定します。
  /A          アーカイブ属性のファイルのみをコピーし、属性は変更しません。
  /M          アーカイブ属性のファイルのみをコピーし、アーカイブ属性を解除します。
  /D:月-日-年 指定された日付以降に変更されたファイルをコピーします。
              日付が指定されなかったときは、送り側の日付が受け側の日付より新しいファイルだけ
              をコピーします。
  /EXCLUDE:ファイル1[+ファイル2][+ファイル3]...
              文字列を含むファイルの一覧を指定します。
              文字列がコピーされるファイルの絶対パスの一部と一致した場合、
              そのファイルはコピーから除外されます。
  /P          受け側のファイルを作成する前に確認のメッセージを表示します。
  /S          空の場合を除いて、サブディレクトリをコピーします。
  /E          サブディレクトリが空であってもコピーします。
              /S /E と同じ意味です。/T と同時に指定できます。
  /V          書き込んだ各ファイルを検証します。
  /W          キー入力があるまでコピー開始を待ちます。
  /C          エラーが発生してもコピーを続けます。
  /I          受け側がなく複数のファイルをコピーする場合、受け側をディレクトリとしてコピーします。
  /Q          コピー中ファイル名を表示しません。
  /F          コピー中送り側と受け側の全ファイル名を表示します。
  /L          コピーされるファイル名を表示します。
  /H          隠しファイルやシステム ファイルもコピーします。
  /R          読み取り専用ファイルを上書きします。
  /T          ファイルはコピーせずにディレクトリのみを作成します。
               ディレクトリまたはサブディレクトリが空の場合は除きます。
               /E と使用すればディレクトリやサブディレクトリが空でも作成されます。
  /U          受け側に既に存在するファイルだけをコピーします。
  /K          属性をコピーします。通常の XCOPY は読み取り専用属性を変更します。
  /N          生成された短い名前を使用してコピーします。
  /O          ファイルの所有権と ACL 情報をコピーします。
  /X          ファイル監査設定をコピーします ( /O を含む)。
  /Y          受け側の既存のファイルを上書きする前に確認のメッセージを表示しません。
  /-Y         受け側の既存のファイルを上書きする前に確認のメッセージを表示します。
  /Z          再起動可能モードでネットワーク ファイルをコピーします。
となっています。
OS付属のコピーコマンドにしてはかなり高機能な仕様です。
単純なデータのコピーだけならUSBメモリとXCOPYだけで用は
足りてしまうでしょう。

それではここで、バックアップのための条件を考えておくことにしましょう。

バックアップのための条件)
基本的にバックアップすべき最低限の情報は、業務ソフトを使っている場合「業務ソフトのデータ」、次に「メール」、「メールアドレスと設定情報」、「マイドキュメント」フォルダー内のデータ、ということになります。
そのほか、インターネットの設定情報や「お気に入り」に登録してあるホームページのアドレス(URL)およびログインID・ログインパスワードとなります。
そして、これら業務・個人データ以外のプログラムやOSの設定などは、復旧作業で時間をかければ元の状態に近づけることができます。
しかし、障害からの復旧やバックアップをとるたびに複雑で面倒な作業が発生するのは嫌なので、ハードディスクを2台用意し、1台を通常使用するハードディスク、もう1台をバックアップ用に使うことにします。
システム障害時には、バックアップディスクを起動ドライブとして、切り替え運転ができるようにします。
(HD革命/Clone Diskと同等の運用を考えるわけですね。)
この場合、マザーボードに付属のRAIDでも同等のことが可能で、はじめから全自動バックアップになるわけですが、原則的にハードディスクは同機種、同容量でなければ動作は保証されません。
(というか、バックアップ用のディスクは元のディスクと同等以上の容量があればいいのですが、元のディスク容量以上は使われない状態になるのです。)
したがって障害時には、個別にハードディスクを交換することが困難となり、セットでの交換を考えざるおえません。

その点、ハードディスクの容量について自由度が高い「HD革命/Clone Disk」やXCOPYでのハードディスクコピーは扱いやすいといえるでしょう。
当然ですが、ハードディスクの丸ごとコピーを行うわけですから、まったく同じファイルが2台のハードディスクに書き込まれることになり、記憶容量の利用効率は悪くなります。
まあ、これは記憶領域の利用効率よりもデータのバックアップとシステム運用の利便性を優先しているわけですからあきらめるより仕方ありません。

※ハードディスクの寿命は、通常2年程度と考えられますが、運が悪いと半年も持たずに壊れる場合があります。
 できれば、1年ごとに新しいハードディスクに交換することをおすすめします。
 

さて、この条件を満たすためにはどうすればいいかを考えます。

XCOPYコマンドでは、起動ドライブのシステムファイルを完全にコピーすることができません。
※起動ドライブ以外のハードディスク(HDD)でも、Windowsが使用中であるシステムファイル(System Volume Informationなど)は正常にコピーできないようです。
そこで、システムファイルを少しでも完全に近い形でコピーするために、1台目(通常使用)のハードディスク(HDD)と2台目(バックアップ)のハードディスク(HDD)ともに、最低2つのパーティション(区画)に分けておきます。
まず、1台目のハードディスクをパソコンにつなぎ、1番目のパーティション(ドライブC)を平常使用するものとしてWindowsをインストールします。
当然、ワードやエクセルなどのアプリケーションもドライブCにインストールして使うことになります。
1台目ハードディスクの2番目のパーティション(ドライブD)は、バックアップのときあるいは緊急起動時のみ使うパーティションとしてWindowsをインストールします。
ドライブDは、バックアップ専用なので、領域は10GB(ギガバイト)もあれば十分でインストールするソフトもテキストエディターがあれば便利かな(?)という程度です。
つぎに、1台目のハードディスクを外して2台目のハードディスクをつなぎます。
2台目のハードディスクでは、1台目のクローン(コピー)とするために、パーティション(区画)を作っておきます。
2台目ハードディスクの1番目のパーティション(ドライブE)は、1台目の1番目のパーティションをコピーするための領域としてWindowsをインストールしておきます。
このインストールは、Windowsの起動システムがXCOPYではコピーされないため必ず行わなければなりません。
2台目ハードディスクの2番目のパーティション(ドライブF)は、1台目、2番目のパーティション(ドライブD)をコピーする領域になります。
こちらも、さきのドライブEと同様、Windowsのインストールが必要です。
結果として、ハードディスクの構成は、
 1台目:ドライブC(通常使用する領域)、ドライブD(Cドライブのバックアップ作業を実行するための領域)
 2台目:ドライブE(ドライブCのコピー領域)、ドライブF(ドライブDのコピー領域)
となります。

(注意)
Windowsのシステムをインストールするときは、ハードディスクを1台づつ接続してそれぞれのC、D領域にWindowsをインストールしてください。
2台のハードディスクを同時にパソコンにつないで、C、D、E、Fの領域でWindowsをインストールすると、障害復旧時のシステム起動に失敗することがあります。

障害復旧時に交換したハードディスクからのシステム起動に失敗した場合は、Windowsの修復インストールを行ってみてください。


「Dドライブから起動して、C:\をE:\にバックアップします。」

ハードディスクのコピーをとるXCOPYコマンドは、自動実行するため、バッチファイルで使います。

それでは準備として、バックアップで使うバッチファイルを保管しておくフォルダー(ディレクトリー)を作っておきましょう。
このフォルダー(ディレクトリー)は、「マイ ドキュメント」フォルダーよりもドライブDのルート(直下)に作っておいたほうが都合が良いのでスタートメニューまたは、デスクトップの「マイ コンピューター」をクリックし、さらにドライブ(D)をクリックします。
ドライブDの表示が出たらメニューバーの「ファイル」から「新規作成」→「フォルダ」で新規フォルダーを作成します。
新規フォルダーの名前は半角英数字であれば自由に設定してもらってかまいませんが、ここでは、説明の都合上「back」という名前を使うことにします。

XCOPYの記述は、こんな感じです。
XCOPY C:\*.* E:\ /C /E /R /H /K < all.txt
 C:\*.* :ドライブCのすべてのフォルダとファイルをコピー元に指定します。
 E:\ : ドライブEのルート(直下)をコピー先に指定します。
 /C:エラーが発生しても中断せず最後までコピーを続けます。
 /E:フォルダー(ディレクトリー)ごとコピーをとります。
 /R:読み取り専用ファイルもコピーします。
 /H:隠しファイルやシステムファイルもコピーします。
 /K:ファイルの属性もコピーします。
 < all.txt :半角文字「A」のみ記入したファイル「all.txt」をつくり、
       XCOPYの上書きのメッセージに自動応答させます。

 
 ※けっこう「重要」かも? 私の使用環境に特有なのかもしれませんが、
 xcopy /E /R /H /C /Y /EXCLUDE:xxx.txt "c:\source\" "d:\dist\"
 という記述では、「無効なパスの指定です。」というメッセージが出て
 正常にコピーができませんでした。
 コピーの記述を
 xcopy /E /R /H /C /Y /EXCLUDE:xxx.txt "c:\source" "d:\dist\"
 「c:\source」のように、コピー元のフォルダー名にある最後の「\」を
 除くか、「c:\source\*.*」とするとうまくコピーが行われます。
 ちなみに、コピー先フォルダーの最後の「\」はあっても無くても同じです。  

ページの先頭へ戻る

起動ドライブの変更と再起動の方法


通常起動時は、ドライブCからでいいのですが、バックアップを取るときはドライブDから起動しなければならないため、起動ドライブを変更するための処理を作ります。
Windows2000やXPは、起動時にboot.iniというシステムファイルを読み取って、OS選択画面の表示や起動ドライブの選択をするようになっています。
通常使用するハードディスクに2つのパーティション(区画)を作って、2つのWindows2000/XPをインストールすると、
【boot.ini】
Windows2000の場合

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating system]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect
multi(0)disk(0)rdisk(0)partition(2)\WINNT="Microsoft Windows 2000 Professional" /fastdetect
WindowsXPの場合

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating system]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=OptIn
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=OptIn
※ここでは、Windows 2000 Professionalまたは、Windows XP Professionalをインストール対象と考えています。
 Windows XP Home の場合は、表示が違っていることがあります。

のように設定されていると思います。

[boot loader]では、
timeout=30・・・起動OSの選択待ち時間です。
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
または
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
で起動待ちの間にOSの選択が無かった場合の既定の起動OSを設定しています。

[operating system]の項目では、
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect
multi(0)disk(0)rdisk(0)partition(2)\WINNT="Microsoft Windows 2000 Professional" /fastdetect
あるいは、
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=OptIn
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=OptIn
では、multi(0)→SCSI以外のINT15でアクセスできるハードディスクの0番目ということらしいです。
disk(0) → ハードディスクの0番目というとこのようです。
rdisk(0) → RAIDを使っている場合のドライブ0らしいです。
partition(1) → パーティション(区画)番号1のようです。
\WINNT → システムフォルダの指定です。
="Microsoft Windows 2000 Professional" → OS選択画面で表示されるOSの名前です。
/fastdetect → よく分かりませんが、検出されたOSという意味のようです。
/NoExecute=OptIn → 意味が分かりません。

このboot.iniファイルでポイントとなるのは
[boot loader]の項にある
  default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
  または
  default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS

  default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
  または
  default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
に変更することで起動ドライブを変更(ドライブCからドライブDに)できることです。
また、Windows2000/XPの再起動は、VBscriptを使うことで自動化できます。

では、このboot.iniファイルを変更してパソコンを再起動する手順を示します。

1.先ほどドライブDに作った「back」フォルダーを開きます。
  次に、別ウィンドーでドライブCのルート(直下)フォルダーを表示します。
  ここから、ドライブCの「boot.ini」をドライブDのbackフォルダーにコピーします。
  
  もし「boot.ini」ファイルが表示されていない場合、
  ウィンドウのメニューバーにある「ツール」 → 「フォルダーオプション」から「表示」タブを選択し、
  詳細設定を表示します。
  次に「ファイルとフォルダの表示」で「すべてのファイルとフォルダを表示する」にチェックを
  入れます。
  さらに、「保護されたオペレーティング システム ファイルを表示しない(推奨)」のチェックを
  はずします。
  これで、boot.iniファイルが(薄く)表示されるようになりましたから、ドライブDのbackフォルダー
  にコピーしてください。
  
  もし、ドライブCのboot.iniファイルの拡張子が表示されず「boot」のみの表示であった場合には、
  ウィンドウのメニューバーにある「ツール」 → 「フォルダーオプション」から「表示」タブを選択し、
  詳細設定を表示します。
  次に、詳細表示の「登録されているファイルの拡張子は表示しない」のチェックをはずしてください。

  ※以下のバッチファイルやVBscriptファイルを作成するには、
   「back」フォルダーのメニューバーから「ファイル」 → 「新規作成」 → 「テキストドキュメント」
   の順にメニューをたどり、backフォルダーに「新規テキスト ドキュメント.txt」を作ります。
   このファイルをメモ帳などのテキストエディターで開いて、バッチファイルやVBscriptの内容を
   コピー&ペーストで複写します。
   この後、メモ帳のメニューバーから「ファイル」 → 「名前を付けて保存」を選択し、ファイル名の
   欄にそれぞれの名前を記入して保存を行います。
   保存が終わったら、再び「back」フォルダーを見て、ファイル名が正しく付けられていることを
   確認してください。
   正しく名前がついていない場合は、対象のファイルを右クリックして、「名前の変更」を選択し
   ファイル名を付け替えます。

2.ドライブDから起動するboot用ファイルを「back」フォルダーに作ります。
  ファイル名:boot_d.txt
  【WindowsXPの場合】
    [boot loader]
    timeout=30
    default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
    [operating system]
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional (1)" /fastdetect /NoExecute=OptIn
    multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional (2)" /fastdetect /NoExecute=OptIn

  【Windows2000の場合】
    [boot loader]
    timeout=30
    default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
    [operating system]
    multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional (1)" /fastdetect
    multi(0)disk(0)rdisk(0)partition(2)\WINNT="Microsoft Windows 2000 Professional (2)" /fastdetect

3.起動ドライブをドライブCに戻すためのbootファイルを「back」フォルダーに作ります。
  ファイル名:boot_c.txt
  【WindowsXPの場合】
    [boot loader]
    timeout=30
    default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
    [operating system]
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=OptIn
    multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /NoExecute=OptIn

  【Windows2000の場合】
    [boot loader]
    timeout=30
    default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
    [operating system]
    multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Professional" /fastdetect
    multi(0)disk(0)rdisk(0)partition(2)\WINNT="Microsoft Windows 2000 Professional" /fastdetect

4.起動ドライブをCからDに変更して再起動させるためのバッチファイルを「back」フォルダーに作ります。
  ファイル名:boot_d.bat
    ATTRIB c:\boot.ini -s -h -r
    DEL c:\boot.ini
    COPY d:\back\boot_d.txt c:\boot.ini
    ATTRIB c:\boot.ini +s +h +r
    START reboot.bat

5.パソコンを再起動をさせるためのバッチファイルを「back」フォルダーに作ります。
  バッチファイル名:reboot.bat
    cscript reboot.vbs

6.パソコンを再起動をさせるためのVBscriptファイルを「back」フォルダーに作ります。
  VBscriptファイル名:reboot.vbs
  'Win32_OperatingSystem object の Win32ShutDown method を使ってWindowsの終了、ログオフ、再起動、電源オフを行います。
  '
  'システムの実行特権を与えるための数値
  ' wbemPrivilegeLocal = 18
  ' wbemPrivilegeRemote = 23
  
  '動作と値の対応
  ' ログオフ : Log Off = 0
  ' Windowsの終了 : Shutdown = 1
  ' 再起動 : Reboot = 2
  ' 電源オフ : Power Off = 8
  ' 強制ログオフ : Forced Log Off = 0 + 4 = 4
  ' Windowsの強制終了 : Forced Shutdown = 1 + 4 = 5
  ' 強制終了と再起動 : Forced Reboot = 2 + 4 = 6
  ' 強制終了と電源オフ : Forced Power Off = 8 + 4 = 12
  
   Const wbemPrivilegeLocal = 18
   Const wbemPrivilegeRemote = 23
   Const LogOff = 0
   Const Shutdown = 1
   Const Reboot = 2
   Const PowerOff = 8
   Const ForcedLogOff = 4
   Const ForcedShutdown = 5
   Const ForcedReboot = 6
   Const ForcedPowerOff = 12
  
   Dim Connection, WQL, SystemClass, System, toDo
  
   'ここで終了動作を選択できます。
   'toDo = LogOff
   'toDo = ForcedLogOff
   'toDo = Shutdown
   'toDo = ForcedShutdown
   toDo = Reboot
   'toDo = ForcedReboot
   'toDo = PowerOff
   'toDo = ForcedPowerOff
  
   '自マシン上の 「wmi」 に接続
   Set Connection = GetObject("winmgmts:root\cimv2")
  
   '自マシン上でシステムの実行特権を許可する
   Set Security = Connection.Security_
   Security.Privileges.Add wbemPrivilegeLocal
  
   'Get Win32_OperatingSystem objects - このコレクションは1つのオブジェクトのみ
   WQL = "Select Name From Win32_OperatingSystem"
   Set SystemClass = Connection.ExecQuery(WQL, , 0)
  
   'システムオブジェクトを取り出してシャットダウン処理を実行
   For Each System In SystemClass
     System.Win32ShutDown (toDo)
   Next

7.起動ドライブをDからCに変更して再起動させるためのバッチファイルを「back」フォルダーに作ります。
  ファイル名:boot_c.bat
    ATTRIB c:\boot.ini -s -h -r
    DEL c:\boot.ini
    COPY d:\back\boot_c.txt c:\boot.ini
    ATTRIB c:\boot.ini +s +h +r
    START reboot.bat

8.これで起動ドライブを変更して再起動ができるようになりました。
  ドライブDの「back」フォルダーから「boot_c2d.bat」や「boot_d2c.bat」を起動して、
  ブートドライブ変更後に、再起動できるか確認してください。

ここまでで、やっと起動ドライブの選択が行えるようになりました。
ちょっと一息入れましょう。

ハードディスク故障の原因
ハードディスクが壊れる原因はたくさんありますが、以前は多くの場合、回転軸の摩耗・摩滅による機械的な寿命と人為的なミスや雷などで発生する電源断による事故が原因でした。
最近では、回転軸をベアリングでなく粘性流体で支えるものが多くなったことから回転軸の機械的寿命による故障は少なくなったのですが、パソコンの高性能化による供給電力の不安定さから来る故障が増えてきています。
ハードディスクは、高速回転する円盤に高密度でデータを書き込むために安定した電力供給が不可欠です。
しかし、最近の安価なパソコンでは、価格を下げるために電源の電力供給力をぎりぎりに設定してあることも多く、パソコンのグレードアップのために高性能なハードディスクや、グラフィック部品に換装すると電源に過負荷がかかって電力供給が不安定になる現象が発生します。
また、オフィスや家庭で起こりがちな人為的ミスとしては、電源コードを足に引っ掛けてコンセントが抜けてしまう事故、電力の使いすぎでブレーカーが落ちてしまうなどがあげられます。
パソコンの故障の多くは、電源ユニットやメインボード(マザーボード)の故障(電解コンデンサーという電気部品の消耗など)であるようです。

ページの先頭へ戻る

バックアップ用のバッチファイル

それでは、いよいよ本番のディスクコピーです。

ディスクコピー用のバッチファイルは、
ファイル名:copy_c2e.bat

IF NOT EXIST c:\windows GOTO NT
IF NOT EXIST e:\windows MKDIR e:\windows
XCOPY c:\*.* e:\ /C /E /H /R /K <all.txt
GOTO REBOOT
:NT
IF NOT EXIST c:\winnt GOTO REBOOT
IF NOT EXIST e:\winnt MKDIR e:\winnt
XCOPY c:\*.* e:\ /C /E /H /R /K <all.txt
:REBOOT
START boot_c.bat

XCOPYの上書き問い合わせのメッセージに自動応答するためのファイルは、
ファイル名:all.txt

a

とします。
※ XCOPYのオプションスイッチ /Y を指定しておけば必要ありません。

ドライブDをドライブFにコピーするバッチファイルは、 ファイル名:copy_d2f.bat

IF NOT EXIST d:\windows GOTO NT
IF NOT EXIST f:\windows MKDIR f:\windows
XCOPY d:\*.* f:\ /C /E /H /R /K <all.txt
GOTO EXIT :NT
IF NOT EXIST d:\winnt GOTO EXIT
IF NOT EXIST f:\winnt MKDIR f:\winnt
XCOPY d:\*.* f:\ /C /E /H /R /K <all.txt
:EXIT

となります。
※こちらは、コピー終了後の再起動は必要ないので「start boot_c.bat」の行が入っていません。

さて、これでコピーはできるのですが、バックアップを自動的に実行させるためには、WindowsをドライブDから起動してスタートメニューの「スタートアップ」に、このバッチファイルを登録しなければなりません。
【スタートアップへの登録手順】
(0.動作確認をかねて、「boot_d.bat」をダブルクリックし、ドライブDから起動させます。)
1.ドライブDから起動後、ドライブDのルート(直下)にあるフォルダー「back」を開きます。
2.バッチファイル「copy_c2e.bat」を右クリックして、ドロップダウンメニューを表示します。
3.ドロップダウンメニューにある「送る」 → 「デスクトップ(ショートカットを作成)」でデスクトップに
 ショートカットを作っておきます。
4.スタートメニューをクリックして、「すべてのプログラム」または「プログラム」から「スタートアップ」
 を選択します。
5.「スタートアップ」にマウスアイコンをあわせて、右クリックでドロップダウンメニューを表示します。
6.メニューの中段付近にある「エクスプローラー All Users(X)」を選択します。
7.「スターアップ」フォルダーが表示されたら、デスクトップにある「copy_c2e.bat」へのショートカットを
 スタートアップフォルダーに移動(ドラッグアンドドロップ)します。
8.作業が終了したら、「boot_c.bat」をダブルクリックし、ドライブCから再起動することを確認しま
 しょう。
ここまでで、ドライブDから起動すると自動的にドライブCをドライブEにコピーできるようになりました。

ドライブCからの起動が終わったら、もう一度「boot_d.bat」をダブルクリックします。
1.再起動がかかって、ドライブDから起動します。
2.起動後、ドライブCのフォルダー/ファイルをドライブEにコピーします。
3.今度はドライブCから再起動します。

ここまでは、うまく動作したでしょうか?
バッチファイルの作業が途中で止まった場合は、入力のミスがありますから慎重に入力した文字をチェックしてください。
※バッチファイルでは、コマンドはすべて半角文字を使うようになっています。全角文字が入ってないか確認してください。

これで、ドライブCをシステムごとドライブDにコピーができるようになって、幸せな気分に浸っているのですが、
このままではドライブDから起動するたびに、ドライブCをコピーして再びドライブCから再起動してしまいます。
これは、正しい動作ですが、純粋にドライブDから起動して作業したい場合には困ります。
 ※バッチファイルを強制終了させてもよいのですが、システムファイルのコピー中に
  「強制終了」をかけるのは、ちょっと気持ちが悪いものです。
そこで、起動ドライブの変更用バッチファイル「boot_d.bat」とシステムコピー用バッチファイル「copy_c2e.bat」に工夫をして、「boot_d.bat」を実行したときだけディスクのコピーを行うようにコマンドを追加します。

「boot_d.bat」変更分
ファイル名:boot_d.bat

  ATTRIB c:\boot.ini -s -h -r
  DEL c:\boot.ini
  COPY d:\back\boot_d.txt c:\boot.ini
  ATTRIB c:\boot.ini +s +h +r
  REM バックアップを開始するように「backup_start.txt」を作成する。 ← この行は無くても動作します。
  COPY d:\back\all.txt d:\back\backup_start.txt
  START reboot.bat

「copy_c2e.bat」変更分
ファイル名:copy_c2e.bat

  REM 「backup_start.txt」がなければバックアップを中止 します。← この行は無くても動作します。
  IF NOT EXIST d:\back\backup_start.txt GOTO EXIT
  DEL d:\back\backup_start.txt
  IF NOT EXIST c:\windows GOTO NT
  IF NOT EXIST e:\windows MKDIR e:\windows
  XCOPY c:\*.* e:\ /C /E /H /R /K <all.txt
  GOTO REBOOT
  :NT
  IF NOT EXIST c:\winnt GOTO REBOOT
  IF NOT EXIST e:\winnt MKDIR e:\winnt
  XCOPY c:\*.* e:\ /C /E /H /R /K <all.txt
  :REBOOT
  START boot_c.bat
  :EXIT

さあこれで、「ディスク丸ごとバックアップ」の仕掛けができました。
あとは、「タスク」に登録して、自動実行させるだけです。

タスクを使ってバックアップを完全自動化

タスクへの登録は、
スタートメニューから「コントロールパネル」を表示して、「パフォーマンスとメンテナンス」→「タスク」
または、
スタートメニューから「設定」→「コントロールパネル」→「タスク」
で「タスク」のウィンドーを表示します。
「スケジュールされたタスクの追加」をダブルクリックします。
タスクウィザードが起動するので、「参照」ボタンを使ってドライブDの「D:\back\boot_d.bat」を選択します。
バックアップをとりたい日付・時刻を入力します。
プログラム(バッチファイル)を誰の権限で実行するか指定するために、ユーザー名/パスワードを入力します。
タスクへの登録が完了したら、動作確認のために、タスクを右クリックして「タスクの実行」を選択します。

うまくバッチファイルが起動できないときは、ユーザー名/パスワードが間違っているか、ユーザーがパスワードを設定していない、あるいは、設定したユーザー名にシステムファイルのコピーなどを行う権限がないなどの理由が考えられます。
ユーザーのパスワードを設定・変更するには、netコマンドを使うと便利です。
ネットコマンドの操作)
  スタートメニューからコマンドプロンプト(コマンドボックス)を表示します。
  net user ユーザー名 パスワード[enter]
  とします。([enter]は、enterキーの入力を表します。)
  ここでは、ユーザー名を administrator
  パスワードを pass
  として設定してみます。
net user administrator pass[enter]
ユーザー:administrator は、Windowsが標準で用意するユーザー名でシステム管理者の権限を持っています。
通常のWindows利用ではほとんどこのユーザー名を気にする必要はないのですが、Windowsのシステムにかかわる操作をするときに、お世話になる場合もあるので覚えておくと良いでしょう。

うまくタスクが起動しない場合は、netコマンドで administrator にパスワードを設定したあと、タスクのユーザー/パスワードを administrator に変更して実行してみてください。

同様にドライブDをドライブFにコピーするバッチファイル「copy_d2f.bat」も月1回程度実行するようにタスクへ登録しておきましょう。


これで、めでたく「ディスク丸ごとバックアップ」を自動的に行えるようになりました。
 
完成したプログラムの実行順序は、以下のようになります。
 1.タスクに登録されている「d:\back\boot_d.bat」が起動されます。
 2.ブートドライブをDドライブに変更して、再起動をかけます。
   「boot_d.txt」でboot.iniを置き換え
   「d:\back\backup_start.txt」ファイルを作成
   reboot.bat→reboot.vbsで再起動をかける。
 3.DドライブからWindowsが起動し、スタートアップに登録されている「copy_c2e.bat」が起動されます。
   「d:\back\backup_start.txt」ファイルがあればコピー処理を開始。(ファイルがなければ、5.再起動へ)
   「d:\back\backup_start.txt」ファイルを削除する。
 4.CドライブのファイルをEドライブにコピー(バックアップ)します。
   「c:\windows」フォルダーがあれば、「c:\windows」とCドライブのファイルをコピー
   「c:\winnt」フォルダーがあれば、「c:\winnt」とCドライブのファイルをコピー
 5.ドライブのコピー終了後「d:\back\boot_c.bat」を起動し、ブートドライブをCドライブに変更して再起動をかけます。
   「boot_c.txt」でboot.iniを置き換え
   reboot.bat→reboot.vbsで再起動をかける。
 6.CドライブからWindowsが起動し、処理が終了します。
 ※ファイルリスト
  boot_d.bat・・・ドライブDからWindowsを起動するバッチファイル
  boot_d.txt・・・ドライブDからWindowsを起動させるためのboot.iniのデータ(XP)
  reboot.bat・・・再起動用のバッチファイル
  reboot.vbs・・・再起動用のVBSファイル(reboot.batから呼び出される)
  copy_c2e.bat・・CドライブのファイルをEドライブにコピーするためのバッチファイル
  copy_d2f.bat・・DドライブのファイルをFドライブにコピーするためのバッチファイル(単独で使います。)
  all.txt・・・・すべてのファイルをコピーするためのXCOPYコマンドへの応答ファイル
  boot_c.bat・・・ドライブCからWindowsを起動するバッチファイル
  boot_c.txt・・・ドライブCからWindowsを起動させるためのboot.iniのデータ(XP)

  drv_cpy.zip・・・バックアッププログラムを1つにまとめたダウンロード用ZIPファイル。(XP用)
  drv_cpy_2k.zip・・・バックアッププログラムを1つにまとめたダウンロード用ZIPファイル。(2000用)

動作確認環境
  ・パソコン機種名:自作DOS/Vマシン
  ・CPU:AMD K6−450MHz
  ・MEM:384MB
  ・VGA:S3 Sarvage 2MB
  ・M/B:Aopen AX59Pro
  ・HDD:Hitachi DeskStar 82.3GB×2台(E-IDE)
   HDDラック2基装着にてプライマリーマスター+セカンダリーマスターにて運用
  ・CD/DVD:Mitsumi CD−ROM FX240S 24倍速
  ・筐体:ミドルタワータイプ(5インチベイ×3+3.5インチベイ×2)
  ・電源:450W(Pentium4対応)
  ・OS:WindowsXP SP2
  ・セキュリティソフト:KingSoft 無料版Internet Security
  ・使用目的:ファイルサーバー及びバックアップサーバー

ディスク故障時の対応方法

ここまででバックアップの自動化はOKなのですが、実際にハードディスク(HDD)が故障したときの対応を考えておきましょう。
バックアップはあるが、いざ故障というときにはあせってしまって「なかなか復旧がはかどらない。」ということもよくあります。
事前に、復旧作業を手順化して紙に書いておけば、比較的短時間に作業を終えることができます。
標準的な復旧方法は、次の通りです。

1)パソコンの動作異常や故障を確認します。
2)実行中の処理を終了し電源を切断(シャットダウン)します。
3)故障していると思われるハードディスク(通常は1番目のドライブ)を外します。
4)正常なハードディスク(通常は2番目のドライブ)の(SATA:シリアルATA)ケーブルを1番目のものと差し替えます。
 (パラレル)ATA(IDE)接続の場合、ハードディスクにあるマスター/スレーブのジャンパースイッチを(MASTER側に)
  変更してケーブルをつなぎます。
5)正常なハードディスク(通常は2番目)をパソコンに戻します。
6)パソコンの電源を投入し、正常にOSが起動できればOK。
7)適当な時期にハードディスクを購入し、再度バックアップ体制を整えましょう。
(注意)
障害復旧時に交換したハードディスクからのシステム起動に失敗した場合は、Windowsの修復インストールを試してみてください。
また、Windowsのシステムをインストールするときは、ハードディスクを1台づつ接続してそれぞれのC、D領域にWindowsをインストールしてください。
2台のハードディスクを同時にパソコンにつないで、C、D、E、Fの領域でWindowsをインストールすると、障害復旧時のシステム起動に失敗することがあります。


 

丸ごとバックアップの使い勝手と問題点

【使い勝手】
タスクを利用することで、バックアップ作業を忘れたり手間を感じることもなくなりました。
また、レジストリーを変更しないフリーソフトや一部の市販ソフトはバックアップドライブからの起動でもそのまま使えるようになります。
しかし、さすがに元のドライブとまったく同一とはならず、例えば、Microsoft Officeなどは、正常に起動させることはできませんでしたし、WindowsUPDATEもバックアップでは反映されませんでした。
とはいえ、無料でできるバックアップとしては、そこそこの機能を持っていると思いますし、システムダウン後の復旧作業も比較的らくだと思います。
それに、なんといってもデータ消失の危険が回避できる安心感は重要なポイントでしょう。

【問題点】

このバックアップ方法での1番の問題点は、バックアップドライブから起動できない場合があることです。 この現象は、ディスクフォーマットがNTFSで、OSがWindows2000または、Windows2000からXpへアップグレードした場合に発生する問題のようです。
Microsoftのサポートhttp://support.microsoft.com/kb/249321/ja)を参照
対応策は、こちら→http://support.microsoft.com/kb/223188/
操作は結構面倒なのですが、落ち着いてやればそれほど難しくはありません。

2番目には、やはりXCOPYのバックアップは完全なコピーではないという点でしょう。
これは、XCOPY を使ってバックアップを取っていることが原因ですので、他のファイルコピープログラムに差し替えることで回避できる可能性が高いと思います。
技術的には、WindowsAPIなどを使わない、BIOS直アクセスでのファイルコピープログラムに変更すればよさそうに感じます。
ただこの場合、フォルダー単位やドライブ全体を一括でコピーできるようにするためには、それなりの手間がかかりそうです。

3番目の問題点としては、たとえ無料であったとしても、これだけの手間をかけることが経済的に妥当かどうかです。
つまり、この手間と時間、動作の保証などを金額に換算したときに市販ソフトの方が安いと感じるなら「市販ソフトを購入すべき」ということです。
そして、コンピューターを専門としない多くの方は、市販ソフトを買ったほうが経済的だと思います。
※私にとって、この程度の手間は3000円以下(市販ソフトを購入するより安価)と考えているわけです。

(余計な一言)
ちなみに、高額な業務用バックアップソフトであっても、通常は完全なデータの保障がなされているわけではありません。
使用条件や許諾書などを確認すると、たいてい「このソフトウェアを使用することによって発生する責任や損害は、ソフトウェアの利用者がその一切を負担する」といった条項が書いてあります。
さらに、補償条件としては、「当該ソフトウェアを原因とする損害・損失については、その購入額を上限として補償を行うものとする。」などと書かれていたりします。
これは、プログラムの開発・販売会社が無条件・無制限に損害の責任を負わされることを回避する目的なのですが、宣伝文句やセールスマンの説明との差はどう解釈するんでしょうね。
とりあえず、「実用上差し支えのない安全性をもって比較的お手軽にデータのバックアップがとれる」という認識でいいんでしょうね。

ページの先頭へ戻る

【VBscriptのおまけ技】

Windows2000/XPでの電源オフ
Windows95/98/MEなどは、比較的簡単なコマンドで電源オフを呼び出せたのですが、Windows2000/XPなどのNT系OSではちょっと面倒です。
ここでは、VBscriptを使った電源オフの方法を紹介します。
とはいっても、reboot.vbsを手直しするだけなのでとても簡単です。

パソコンの電源を切るVBscriptファイル
  VBscriptファイル名:shutdown.vbs
  'Win32_OperatingSystem object の Win32ShutDown method を使ってWindowsの終了、ログオフ、再起動、電源オフを行います。
  '
  'システムの実行特権を与えるための数値
  ' wbemPrivilegeLocal = 18
  ' wbemPrivilegeRemote = 23
  
  '動作と値の対応
  ' ログオフ : Log Off = 0
  ' Windowsの終了 : Shutdown = 1
  ' 再起動 : Reboot = 2
  ' 電源オフ : Power Off = 8
  ' 強制ログオフ : Forced Log Off = 0 + 4 = 4
  ' Windowsの強制終了 : Forced Shutdown = 1 + 4 = 5
  ' 強制終了と再起動 : Forced Reboot = 2 + 4 = 6
  ' 強制終了と電源オフ : Forced Power Off = 8 + 4 = 12
  
   Const wbemPrivilegeLocal = 18
   Const wbemPrivilegeRemote = 23
   Const LogOff = 0
   Const Shutdown = 1
   Const Reboot = 2
   Const PowerOff = 8
   Const ForcedLogOff = 4
   Const ForcedShutdown = 5
   Const ForcedReboot = 6
   Const ForcedPowerOff = 12
  
   Dim Connection, WQL, SystemClass, System, toDo
  
   'ここで終了動作を選択できます。
   'toDo = LogOff
   'toDo = ForcedLogOff
   'toDo = Shutdown
   'toDo = ForcedShutdown
   'toDo = Reboot
   'toDo = ForcedReboot
   toDo = PowerOff
   'toDo = ForcedPowerOff
  
   '自マシン上の 「wmi」 に接続
   Set Connection = GetObject("winmgmts:root\cimv2")
  
   '自マシン上でシステムの実行特権を許可する
   Set Security = Connection.Security_
   Security.Privileges.Add wbemPrivilegeLocal
  
   'Get Win32_OperatingSystem objects - このコレクションは1つのオブジェクトのみ
   WQL = "Select Name From Win32_OperatingSystem"
   Set SystemClass = Connection.ExecQuery(WQL, , 0)
  
   'システムオブジェクトを取り出してシャットダウン処理を実行
   For Each System In SystemClass
     System.Win32ShutDown (toDo)
   Next

変更点は、プログラムの赤文字2行で
toDo = Reboot → 'toDo = Reboot
'toDo = PowerOff → toDo = PowerOff
これだけです。
余りにも簡単ですが、きちんと動作することを確認してみてください。
終了動作を選択する部分を変更することで、望みの動作に変えられます。
タスクに登録すれば、指定の時刻に自動でパソコンを終了することができます。


Windows2000/XPでのサスペンド(休止)

調子に乗ってもう1つ
VBscriptを使ってパソコンの休止(サスペンド)方法を紹介します。
これは、reboot.vbsとは別のスクリプトを書かなければなりませんが、たった3行の短いスクリプトですので、ぜひお試しください。

パソコンを休止(サスペンド)するVBscriptファイル
  VBscriptファイル名:suspend.vbs
  Dim WShell
  Set WShell = WScript.CreateObject("WScript.Shell")
  WShell.Run("rundll32.exe powrprof.dll,SetSuspendState")

これだけです。
簡単ですが、きちんと動作することを確認してみてください。
もちろん、「タスク」に登録して実行できます。

ページの先頭へ戻る

-------------------------------------------------------------------

2011/04/22 追記

 別ページ「コマンドプロンプトの覚え書き」「バッチで使うVBscript」のスクリプトを修正して、ドキュメントフォルダーの内容をUSBメモリーにバックアップコピーするバッチファイルとVBscriptを作成したので公開します。
 USBメモリにこのバッチ(「backup.bat」)とVBS(「msgbox.vbs」「read_reg.vbs」)を入れておいて、バックアップ時にUSBメモリーから起動すれば簡単にドキュメントのバックアップが出来ると思います。
このスクリプトでは、Windows2000/xpを対象(vista/7での動作は未確認です。)にドキュメントフォルダーの内容だけをバックアップします。
(2011/05/25 バックアップ対象に「デスクトップ」を追加しました。)
インターネットの接続情報や電子メール、電子メールのアカウント情報、ホームページのアドレス(お気に入り)などはバックアップされませんので注意してください。
なお、バックアップしたファイルは、「restore.bat」で復元できます。
バッチファイル - ファイルバックアップ [ backup.bat ]

@title バックアップ
@ECHO off
SET tm=%date%-%time%
PUSHD ..
CD "%~dp0"
echo バックアップのプロセス開始時刻:%tm%
SET str="ドキュメントにあるファイルをバックアップしますか?crlf「はい/いいえ」                                 "
SET btn=36
SET title="ドキュメントのバックアップ            "
REM str、titleなどの文字列の後ろにある半角スペースは、Windows2000を使うときに発生する文字切れの対策です。
for /f "usebackq tokens=* delims=" %%D in (`call cscript //Nologo %~dp0msgbox.vbs %str% %btn% %title%`) do SET res=%%D
IF "%res%" == "Yes" SET yes="y"
IF NOT "%res%" == "Yes" (
    IF NOT "%res%" == "Ok" (
    echo.
    echo 「いいえ」が選択されました。処理を終了します。
    pause
    exit /b
    )
)

REM %OS% はOS名
SET os-name=%OS%
ECHO os=%os-name%

REM %USERNAME% はユーザー名
SET usr=%USERNAME%
ECHO user=%usr%

REM コピー先ドライブを設定
SET drv=%~d0

REM 「xcopy」を使って、マイ ドキュメントをUSBメモリーにコピーします。
REM xcopy のオプション、/E は子フォルダも丸ごとコピーします。
REM /R は読み取り専用(ReadOnly)のファイルやフォルダもコピーします。
REM /H は隠し(Hidden)ファイルやシステムファイル、フォルダも丸ごとコピーします。
REM /C はエラーが発生してもコピーを続行します。
REM /Y はコピー先に同一名のファイルやフォルダがあっても確認なしに上書きします。
REM /EXCLUDE: はここで指定されたファイルに含まれる行単位の文字列がファイルのフルパス名に含まれるときにコピーを行わないようにします。
REM /EXCLUDE:without.txt とした場合、without.txtに「.obj」の文字列(行)が含まれていれば、test.objやmain.objなどのファイルはコピーされません。
REM また、without.txtに「\bin\」の文字列(行)が含まれていれば、〜\bin\フォルダはコピーされません。
FOR /F "usebackq tokens=*" %%I IN (`call cscript //nologo %~dp0read_reg.vbs 0`) DO SET ret_value=%%I&SET tp=%%~nxI
REM マイ ドキュメントのコピー先を設定
SET dist=%drv%\%tp%\
IF NOT "%ret_value%" == "NOT EXIST" (
    ECHO ユーザー「%usr%」のマイ ドキュメントへのパスは「%ret_value%」です。
    ECHO 「%ret_value%」 を「%dist%」にコピーします。
    XCOPY /E /R /H /C /Y /EXCLUDE:dll.txt+sys.txt "%ret_value%" "%dist%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、マイ ドキュメントは登録されていません。
    ECHO.
)

FOR /F "usebackq tokens=*" %%I IN (`call cscript //nologo %~dp0read_reg.vbs 1`) DO SET ret_value=%%I&SET tp=%%~nxI
SET dist=%drv%\%tp%\
IF NOT "%ret_value%" == "NOT EXIST" (
    ECHO ユーザー「%usr%」のマイ ピクチャーへのパスは「%ret_value%」です。
    ECHO 「%ret_value%」 を「%dist%」にコピーします。
    XCOPY /E /R /H /C /Y /EXCLUDE:dll.txt+sys.txt "%ret_value%" "%dist%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、マイ ピクチャーは登録されていません。
    ECHO.
)

FOR /F "usebackq tokens=*" %%I IN (`call cscript //nologo %~dp0read_reg.vbs 2`) DO SET ret_value=%%I&SET tp=%%~nxI
SET dist=%drv%\%tp%\
IF NOT "%ret_value%" == "NOT EXIST" (
    ECHO ユーザー「%usr%」のマイ ミュージックへのパスは「%ret_value%」です。
    ECHO 「%ret_value%」 を「%dist%」にコピーします。
    XCOPY /E /R /H /C /Y /EXCLUDE:dll.txt+sys.txt "%ret_value%" "%dist%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、マイ ミュージックは登録されていません。
    ECHO.
)

FOR /F "usebackq tokens=*" %%I IN (`call cscript //nologo %~dp0read_reg.vbs 3`) DO SET ret_value=%%I&SET tp=%%~nxI
SET dist=%drv%\%tp%\
IF NOT "%ret_value%" == "NOT EXIST" (
    ECHO ユーザー「%usr%」のマイ ビデオへのパスは「%ret_value%」です。
    ECHO 「%ret_value%」 を「%dist%」にコピーします。
    XCOPY /E /R /H /C /Y /EXCLUDE:dll.txt+sys.txt "%ret_value%" "%dist%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、マイ ビデオは登録されていません。
    ECHO.
)

FOR /F "usebackq tokens=*" %%I IN (`call cscript //nologo %~dp0read_reg.vbs 5`) DO SET ret_value=%%I&SET tp=%%~nxI
SET dist=%drv%\Share\%tp%\
IF NOT "%ret_value%" == "NOT EXIST" (
    ECHO ユーザー「%usr%」の共有ドキュメントへのパスは「%ret_value%」です。
    ECHO 「%ret_value%」 を「%dist%」にコピーします。
    XCOPY /E /R /H /C /Y /EXCLUDE:dll.txt+sys.txt "%ret_value%" "%dist%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、共有ドキュメントは登録されていません。
    ECHO.
)
SET dist=%drv%\デスクトップ\ set src=%HomeDrive%%HomePath%\デスクトップ IF EXIST "%src%" (     ECHO ユーザー「%usr%」のデスクトップへのパスは「%src%」です。     ECHO 「%src%」 を「%dist%」にコピーします。     REM echo     XCOPY /E /R /H /C /Y /EXCLUDE:dll.txt+sys.txt "%src%" "%dist%"     ECHO. ) ELSE (     SET ret_value=     ECHO フォルダ、デスクトップは登録されていません。     ECHO. ) SET dist=%drv%\Desk Top\ set src=%HomeDrive%%HomePath%\Desk Top IF EXIST "%src%" (     ECHO ユーザー「%usr%」の Desk Top へのパスは「%src%」です。     ECHO 「%src%」 を「%dist%」にコピーします。     REM echo     XCOPY /E /R /H /C /Y /EXCLUDE:dll.txt+sys.txt "%src%" "%dist%"     ECHO. ) ELSE (     SET ret_value=     ECHO フォルダ、Desk Top は登録されていません。     ECHO. ) POPD
echo バックアップのプロセス終了時刻:%date%-%time%
SET str="ファイルのバックアップが終了しました。 "
SET btn=0
for /f "usebackq tokens=* delims=" %%D in (`call cscript //Nologo %~dp0msgbox.vbs %str% %btn% %title%`) do SET res=%%D
exit /b

REM 参考URL
REM バッチ変数について http://www.ne.jp/asahi/hishidama/home/tech/windows/bat.html
REM バッチ処理とVBスクリプトとの連携について http://q.hatena.ne.jp/1271062046
コピーしないファイルの一覧1 [dll.txt]

コピーしないファイルのディレクトリ(フォルダー)や名前を指定します。
ファイルの指定にはワイルドカード(?や*)も使えます。
コピーしないファイルの一覧2 [sys.txt]

コピーしないファイルのディレクトリ(フォルダー)や名前を指定します。
ファイルの指定にはワイルドカード(?や*)も使えます。
VBscript - メッセージボックス [msgbox.vbs]

Option Explicit
REM ------------------------------------------------------
REM msgbox.vbs str1 , str2 [,str3]
REM     str1:表示するメッセージ
REM     str2:表示するボタンの選択
REM     str3:メッセージボックスのタイトル
REM (動作)
REM メッセージボックスを表示し、クリックされたボタンを
REM 返します。
REM str1 中の 「crlf」という文字列は改行に変換します。
REM ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
REM ボタンの表示選択と動作などの設定(ボタン表示や動作などの値を合計します。)
REM 0 [OK] ボタンのみを表示します。
REM 1 [OK] ボタンと [キャンセル] ボタンを表示します。
REM 2 [中止]、[再試行]、および [無視] の 3 つのボタンを表示します。
REM 3 [はい]、[いいえ]、および [キャンセル] の 3 つのボタンを表示します。
REM 4 [はい] ボタンと [いいえ] ボタンを表示します。
REM 5 [再試行] ボタンと [キャンセル] ボタンを表示します。
REM 16 警告メッセージ アイコンを表示します。
REM 32 問い合わせメッセージ アイコンを表示します。
REM 48 注意メッセージ アイコンを表示します。
REM 64 情報メッセージ アイコンを表示します。
REM 0 第 1 ボタンを標準ボタンにします。
REM 256 第 2 ボタンを標準ボタンにします。
REM 512 第 3 ボタンを標準ボタンにします。
REM 768 第 4 ボタンを標準ボタンにします。
REM 0 アプリケーション モーダルに設定します。メッセージ ボックスに応答するまで、現在選択中のアプリケーションの実行を継続できません。
REM 4096 システム モーダルに設定します。メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。
REM ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
REM 戻り値となる文字列
REM ボタンの名前        -> respondの戻り値
REM     [OK]             -> Ok
REM     [キャンセル]    -> Cancel
REM     [中止]             -> Stop
REM     [再試行]         -> Retry
REM     [無視]             -> Ignore
REM     [はい]             -> Yes
REM     [いいえ]         -> No
REM ------------------------------------------------------
Dim args, arg(99), v, cnt
Dim str1, str2
Dim mode
Dim respond, eLevel
Dim CRLF
REM 改行符号を設定します。
CRLF = chr(13) & chr(10)
Set args = WScript.Arguments
cnt = 1
For Each v In args
    arg(cnt) = v
    cnt = cnt + 1
Next

REM 改行文字の置き換え
arg(1) = RepExAll (arg(1), "crlf", CRLF)

eLevel = 0
Select Case args.Count
    Case 0: mode = 0: eLevel = 1
    Case 1: mode = MsgBox (arg(1))
    Case 2: mode = MsgBox (arg(1), arg(2))
    Case Else: mode = MsgBox (arg(1), arg(2), arg(3))
End Select
Select Case mode
    Case 0: respond = ""
    Case 1: respond = "Ok"
    Case 2: respond = "Cancel"
    Case 3: respond = "Stop"
    Case 4: respond = "Retry"
    Case 5: respond = "Ignore"
    Case 6: respond = "Yes"
    Case 7: respond = "No"
End Select

REM 結果の表示
WScript.Echo respond
WScript.Quit (eLevel)

REM ====ここからサブルーチン======================================================
REM 原稿文字列を正規文字列で検索し、一致する文字をすべて置換文字列に置き換えます。
REM s : 原文字列
REM t : 正規文字列
REM d : 置換文字列
Function RepExAll ( s , t , d )
    Dim regExpression, Matches ' 変数を作成します。
    Set regExpression = New RegExp ' 正規表現を作成します。
    regExpression.Pattern = t ' パターンを設定します。
    regExpression.IgnoreCase = True ' 大文字と小文字を区別しないように設定します。
    regExpression.Global = True ' 文字列全体を検索するように設定します。
    RepExAll = regExpression.Replace(s , d) ' 置換を実行します。
End Function

VBscript - レジストリー読み込み [ read_reg.vbs ]

REM 参考URL
REM WshShellオブジェクトの利用 http://www.atmarkit.co.jp/fwin2k/tutor/cformwsh13/cformwsh13_01.html
バッチファイル - ファイルの戻し入れ(RESTORE:レストア) [ restore.bat ]
※ファイルの戻し入れの時は、バックアップ以降に更新されたファイルを(/D オプションを使って)コピーしないようにしています。

@title ファイルの復元
@ECHO off
SET tm=%date%-%time%
PUSHD ..
CD "%~dp0"
echo ファイル復元のプロセス開始時刻:%tm%
SET str=ドキュメントにあるファイルを戻し入れしますか?crlf「はい/いいえ」crlf※バックアップ以後に更新されたcrlfファイルは戻し入れされません。 SET str="%str%                                                                   "
SET btn=36
SET title="ドキュメントの戻し入れ            "
REM str、titleなどの文字列の後ろにある半角スペースは、Windows2000を使うときに発生する文字切れの対策です。
for /f "usebackq tokens=* delims=" %%D in (`call cscript //Nologo %~dp0msgbox.vbs %str% %btn% %title%`) do SET res=%%D
IF "%res%" == "Yes" SET yes="y"
IF NOT "%res%" == "Yes" (
    IF NOT "%res%" == "Ok" (
    echo.
    echo 「いいえ」が選択されました。処理を終了します。
    pause
    exit /b
    )
)

REM %OS% はOS名
SET os-name=%OS%
ECHO os=%os-name%

REM %USERNAME% はユーザー名
SET usr=%USERNAME%
ECHO user=%usr%

REM コピー元のドライブを設定
SET drv=%~d0

REM 「xcopy」を使って、USBメモリーのバックアップファイルをマイ ドキュメントに復元します。
REM xcopy のオプション、/E は子フォルダも丸ごとコピーします。
REM /R は読み取り専用(ReadOnly)のファイルやフォルダもコピーします。
REM /H は隠し(Hidden)ファイルやシステムファイル、フォルダも丸ごとコピーします。
REM /C はエラーが発生してもコピーを続行します。
REM /Y はコピー先に同一名のファイルやフォルダがあっても確認なしに上書きします。
REM /EXCLUDE: はここで指定されたファイルに含まれる行単位の文字列がファイルのフルパス名に含まれるときにコピーを行わないようにします。
REM /EXCLUDE:without.txt とした場合、without.txtに「.obj」の文字列(行)が含まれていれば、test.objやmain.objなどのファイルはコピーされません。
REM また、without.txtに「\bin\」の文字列(行)が含まれていれば、〜\bin\フォルダはコピーされません。
FOR /F "usebackq tokens=*" %%I IN (`call cscript //nologo %~dp0read_reg.vbs 0`) DO SET ret_value=%%I&SET tp=%%~nxI
REM マイ ドキュメントのコピー元を設定
SET dist=%drv%\%tp%
IF NOT "%ret_value%" == "NOT EXIST" (
    ECHO ユーザー「%usr%」のマイ ドキュメントへのパスは「%ret_value%」です。
    ECHO 「%dist%」を「%ret_value%」に戻し入れします。
    XCOPY /E /R /H /C /Y /D /EXCLUDE:dll.txt+sys.txt "%dist%" "%ret_value%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、マイ ドキュメントは登録されていません。
    ECHO.
)

FOR /F "usebackq tokens=*" %%I IN (`call cscript //nologo %~dp0read_reg.vbs 1`) DO SET ret_value=%%I&SET tp=%%~nxI
SET dist=%drv%\%tp%
IF NOT "%ret_value%" == "NOT EXIST" (
    ECHO ユーザー「%usr%」のマイ ピクチャーへのパスは「%ret_value%」です。
    ECHO 「%dist%」を「%ret_value%」に戻し入れします。
    XCOPY /E /R /H /C /Y /D /EXCLUDE:dll.txt+sys.txt "%dist%" "%ret_value%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、マイ ピクチャーは登録されていません。
    ECHO.
)

FOR /F "usebackq tokens=*" %%I IN (`call cscript //nologo %~dp0read_reg.vbs 2`) DO SET ret_value=%%I&SET tp=%%~nxI
SET dist=%drv%\%tp%
IF NOT "%ret_value%" == "NOT EXIST" (
    ECHO ユーザー「%usr%」のマイ ミュージックへのパスは「%ret_value%」です。
    ECHO 「%dist%」を「%ret_value%」に戻し入れします。
    XCOPY /E /R /H /C /Y /D /EXCLUDE:dll.txt+sys.txt "%dist%" "%ret_value%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、マイ ミュージックは登録されていません。
    ECHO.
)

FOR /F "usebackq tokens=*" %%I IN (`call cscript //nologo %~dp0read_reg.vbs 3`) DO SET ret_value=%%I&SET tp=%%~nxI
SET dist=%drv%\%tp%
IF NOT "%ret_value%" == "NOT EXIST" (
    ECHO ユーザー「%usr%」のマイ ビデオへのパスは「%ret_value%」です。
    ECHO 「%dist%」を「%ret_value%」に戻し入れします。
    XCOPY /E /R /H /C /Y /D /EXCLUDE:dll.txt+sys.txt "%dist%" "%ret_value%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、マイ ビデオは登録されていません。
    ECHO.
)

FOR /F "usebackq tokens=*" %%I IN (`call cscript //nologo %~dp0read_reg.vbs 5`) DO SET ret_value=%%I&SET tp=%%~nxI
SET dist=%drv%\Share\%tp%
IF NOT "%ret_value%" == "NOT EXIST" (
    ECHO ユーザー「%usr%」の共有ドキュメントへのパスは「%ret_value%」です。
    ECHO 「%dist%」を「%ret_value%」に戻し入れします。
    XCOPY /E /R /H /C /Y /D /EXCLUDE:dll.txt+sys.txt "%dist%" "%ret_value%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、共有ドキュメントは登録されていません。
    ECHO.
)
SET dist=%drv%\デスクトップ\
set src=%HomeDrive%%HomePath%\デスクトップ
IF EXIST "%src%" (
    ECHO ユーザー「%usr%」のデスクトップへのパスは「%src%」です。
    ECHO 「%src%」 を「%dist%」にコピーします。
    REM echo
    XCOPY /E /R /H /C /Y /D /EXCLUDE:dll.txt+sys.txt "%dist%" "%src%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、デスクトップは登録されていません。
    ECHO.
)
SET dist=%drv%\Desk Top\
set src=%HomeDrive%%HomePath%\Desk Top
IF EXIST "%src%" (
    ECHO ユーザー「%usr%」の Desk Top へのパスは「%src%」です。
    ECHO 「%src%」 を「%dist%」にコピーします。
    REM echo
    XCOPY /E /R /H /C /Y /D /EXCLUDE:dll.txt+sys.txt "%dist%" "%src%"
    ECHO.
) ELSE (
    SET ret_value=
    ECHO フォルダ、Desk Top は登録されていません。
    ECHO.
)
POPD
echo ファイル復元のプロセス終了時刻:%date%-%time%
SET str="ファイルの復元が終了しました。 "
SET btn=0
for /f "usebackq tokens=* delims=" %%D in (`call cscript //Nologo %~dp0msgbox.vbs %str% %btn% %title%`) do SET res=%%D
exit /b

ページの先頭へ戻る

【ページ内の見出し】
【サイト内リンク】

広告エリア



元のページに戻る  ページを閉じる


連絡先:お問い合わせフォーム