次の方法で共有


「以前のバージョンの復元」をpowershellで実現できないでしょうか?

質問

2012年1月6日金曜日 9:03

(1)復元ポイントのシーケンス番号を以下のコマンドで取得した後、

 ((get-computerrestorepoint)[-1]).sequencenumber

(2)このシーケンス番号のshadowimageを使って、powershellで特定のディレクトリ(orファイル)を別ディレクトリへコピー

することはできないでしょうか?

 

restore-computerコマンドですと、すべて復元されてしまいますので。。。

もしご存じの方、ご教示いただきたく、よろしくお願いいたします。

 

すべての返信 (2)

2012年1月8日日曜日 21:10 ✅回答済み | 3 票

たとえばC:\doc\test.txtの「以前のバージョン」は、

\localhost\C$\GMT-2012.01.07-03.00.12\doc\test.txt

のようにデフォルト共有からシャドウコピーのフォルダやファイルにUNCパスでアクセスできるので、Copy-Itemコマンドレットを使えばコピーできます。

シャドウコピーの生成日時(ここではGMT-2012.01.07-03.00.12の部分)がわからないとUNCパスもわからないので、これだけ何らかの方法で調べてやる必要があります。

get-computerrestorepointコマンドレットで返却されるSystemRestoreオブジェクトのCreationTimeプロパティの値を見てやればいいように思いますが、実際はシャドウコピー作成時刻とシステム復元ポイント作成時刻はずれるので、この値は使えません。

よって

Get-WmiObject Win32_ShadowCopy

としてWin32_ShadowCopyオブジェクトの配列を取ってきて、そのInstallDateプロパティの値を抽出してやればいいかなと思います。

InstallDateプロパティの値はWMIの日付時刻表現になっているので、ConvertToDateTimeメソッドなどを使って.NETのDateTime型に変換し、さらにこの値はJSTなのでGMTに変換(.AddHours(-9))してやればいいと思います。

これらが面倒ならばWindows Server 2003のリソースキットに含まれるvolrest.exeコマンドを使うのでもいいのではないでしょうか。

volrestコマンドでシャドウ・コピーから以前のバージョンのファイルを取り出す - @IT


2012年1月10日火曜日 6:57

ご親切にありがとうございます。

以下のように実装できました。

# 「以前のバージョンの復元」の実行日時を取得
$a = Get-WmiObject Win32_ShadowCopy | Select-Object InstallDate | sort-object InstallDate -Descending

# 最新の「以前のバージョンの復元」のdatetimeを取得
$b = [System.Management.ManagementDateTimeConverter]::ToDateTime($a[0].InstallDate).ToUniversalTime().ToString("yyyy.MM.dd-HH.mm.ss")

# バックアップ
copy-item [\localhost\c$\GMT-$b\](file://\localhost\c$@GMT-$b) x:\バックアップ先 -recurse

本当にありがとうございました。