Vì vậy, tôi đã làm việc với một VBScript nhỏ có thể:
- chụp ảnh nhanh VSS liên tục
- gắn kết chúng vào một thư mục (từ đó bạn có thể sao lưu các tập tin)
- chụp nhanh VSS
Nó dựa vào vshadow.exe
( tài liệu ), một phần của Volume Shadow Copy Service SDK 7.2 có sẵn từ Microsoft. Tôi đã làm việc với phiên bản này: " VSHADOW.EXE 2.2 - Máy khách mẫu Volume Shadow Copy, Bản quyền (C) 2005 Microsoft Corporation. "
Về cơ bản, nó là một trình bao bọc nhỏ gọn xung quanh bốn lệnh vshadow này:
vshadow.exe -q - Liệt kê tất cả các bản sao bóng trong hệ thống
vshadow.exe -p {danh sách âm lượng} - Quản lý các bản sao bóng liên tục
vshadow.exe -el = {SnapID}, dir - Hiển thị bản sao bóng dưới dạng điểm gắn kết
vshadow.exe -ds = {SnapID} - Xóa bản sao bóng này
Đây là màn hình trợ giúp của nó:
Công cụ tạo / gắn ảnh chụp nhanh VSS
Sử dụng:
cscript / nologo VssSnapshot.vbs / target: path {/ volume: X | / unmount} [/ gỡ lỗi]
/ volume - ký tự ổ đĩa của âm lượng để chụp nhanh
/ target - đường dẫn (tuyệt đối hoặc tương đối) để gắn ảnh chụp nhanh vào
/ debug - swich trên đầu ra gỡ lỗi
Ví dụ:
cscript / nologo VssSnapshot.vbs / target: C: \ Backup \ DriveD / volume: D
cscript / nologo VssSnapshot.vbs / target: C: \ Backup \ DriveD / unmount
Gợi ý: Không cần ngắt kết nối trước khi chụp ảnh mới.
Ở đây một số đầu ra mẫu:
C: \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target: MountPoints \ E / volume: E
05/03/2010 17:13:04 chuẩn bị điểm gắn kết VSS ...
05/03/2010 17:13:04 điểm gắn kết được chuẩn bị tại: C: \ VssSnapshot \ MountPoints \ E
05/03/2010 17:13:04 tạo ảnh chụp nhanh VSS cho âm lượng: E
05/03/2010 17:13:08 ảnh chụp nhanh được tạo bằng ID: {4ed3a907-c66f-4b20-bda0-9dcda3b667ec}
05/03/2010 17:13:08 Ảnh chụp nhanh VSS được gắn kết thành công
05/03/2010 17:13:08 đã hoàn thành
C: \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target: MountPoints \ E / unmount
05/03/2010 17:13:35 chuẩn bị điểm gắn VSS ...
05/03/2010 17:13:36 không có gì khác để làm
05/03/2010 17:13:36 đã hoàn thành
Và đây là kịch bản chính nó. Tuyên bố từ chối trách nhiệm thông thường được áp dụng: Phần mềm được cung cấp như là, tôi không bảo đảm, sử dụng rủi ro của riêng bạn, nếu một cái gì đó phá vỡ người duy nhất để đổ lỗi là chính bạn. Tôi đã kiểm tra nó khá kỹ lưỡng, mặc dù và nó hoạt động tốt với tôi. Hãy thông báo cho tôi về bất kỳ lỗi nào thông qua các ý kiến dưới đây.
''# VssSnapshot.vbs
''# http://serverfault.com/questions/119120/how-to-use-a-volume-shadow-copy-to-make-backups/119592#119592
Option Explicit
Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
''# -- MAIN SCRIPT -------------------------------------------
Dim args, snapshotId, targetPath, success
Set args = WScript.Arguments.Named
CheckEnvironment
Log "preparing VSS mount point..."
targetPath = PrepareVssMountPoint(args("target"))
If args.Exists("unmount") Then
Log "nothing else to do"
ElseIf targetPath <> vbEmpty Then
Log "mount point prepared at: " & targetPath
Log "creating VSS snapshot for volume: " & args("volume")
snapshotId = CreateVssSnapshot(args("volume"))
If snapshotId <> vbEmpty Then
Log "snapshot created with ID: " & snapshotId
success = MountVssSnapshot(snapshotId, targetPath)
If success Then
Log "VSS snapshot mounted sucessfully"
Else
Die "failed to mount snapshot"
End If
Else
Die "failed to create snapshot"
End If
Else
Die "failed to prepare mount point"
End If
Log "finished"
''# -- FUNCTIONS ---------------------------------------------
Function PrepareVssMountPoint(target) ''# As String
Dim cmd, result, outArray
Dim path, snapshot, snapshotId
Dim re, matches, match
PrepareVssMountPoint = VbEmpty
target = fso.GetAbsolutePathName(target)
If Not fso.FolderExists(fso.GetParentFolderName(target)) Then
Die "Invalid mount point: " & target
End If
''# create or unmount (=delete existing snapshot) mountpoint
If Not fso.FolderExists(target) Then
If Not args.Exists("unmount") Then fso.CreateFolder target
Else
Set re = New RegExp
re.MultiLine = False
re.Pattern = "- Exposed locally as: ([^\r\n]*)"
cmd = "vshadow -q"
result = RunCommand(cmd, false)
outarray = Split(result, "*")
For Each snapshot In outArray
snapshotId = ParseSnapshotId(snapshot)
If snapshotId <> vbEmpty Then
Set matches = re.Execute(snapshot)
If matches.Count = 1 Then
path = Trim(matches(0).SubMatches(0))
If fso.GetAbsolutePathName(path) = target Then
cmd = "vshadow -ds=" & snapshotId
RunCommand cmd, true
Exit For
End If
End If
End If
Next
If args.Exists("unmount") Then fso.DeleteFolder target
End If
PrepareVssMountPoint = target
End Function
Function CreateVssSnapshot(volume) ''# As String
Dim cmd, result
If Not fso.DriveExists(volume) Then
Die "Drive " & volume & " does not exist."
End If
cmd = "vshadow -p " & Replace(UCase(volume), ":", "") & ":"
result = RunCommand(cmd, false)
CreateVssSnapshot = ParseSnapshotId(result)
End Function
Function MountVssSnapshot(snapshotId, target) ''# As Boolean
Dim cmd, result
If fso.FolderExists(targetPath) Then
cmd = "vshadow -el=" & snapshotId & "," & targetPath
result = RunCommand(cmd, true)
Else
Die "Mountpoint does not exist: " & target
End If
MountVssSnapshot = (result = "0")
End Function
Function ParseSnapshotId(output) ''# As String
Dim re, matches, match
Set re = New RegExp
re.Pattern = "SNAPSHOT ID = (\{[^}]{36}\})"
Set matches = re.Execute(output)
If matches.Count = 1 Then
ParseSnapshotId = matches(0).SubMatches(0)
Else
ParseSnapshotId = vbEmpty
End If
End Function
Function RunCommand(cmd, exitCodeOnly) ''# As String
Dim shell, process, output
Dbg "Running: " & cmd
Set shell = CreateObject("WScript.Shell")
On Error Resume Next
Set process = Shell.Exec(cmd)
If Err.Number <> 0 Then
Die Hex(Err.Number) & " - " & Err.Description
End If
On Error GoTo 0
Do While process.Status = 0
WScript.Sleep 100
Loop
output = Process.StdOut.ReadAll
If process.ExitCode = 0 Then
Dbg "OK"
Dbg output
Else
Dbg "Failed with ERRORLEVEL " & process.ExitCode
Dbg output
If Not process.StdErr.AtEndOfStream Then
Dbg process.StdErr.ReadAll
End If
End If
If exitCodeOnly Then
Runcommand = process.ExitCode
Else
RunCommand = output
End If
End Function
Sub CheckEnvironment
Dim argsOk
If LCase(fso.GetFileName(WScript.FullName)) <> "cscript.exe" Then
Say "Please execute me on the command line via cscript.exe!"
Die ""
End If
argsOk = args.Exists("target")
argsOk = argsOk And (args.Exists("volume") Or args.Exists("unmount"))
If Not argsOk Then
Say "VSS Snapshot Create/Mount Tool" & vbNewLine & _
vbNewLine & _
"Usage: " & vbNewLine & _
"cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
" /target:path { /volume:X | /unmount } [/debug]" & _
vbNewLine & vbNewLine & _
"/volume - drive letter of the volume to snapshot" & _
vbNewLine & _
"/target - the path (absolute or relative) to mount the snapshot to" & _
vbNewLine & _
"/debug - swich on debug output" & _
vbNewLine & vbNewLine & _
"Examples: " & vbNewLine & _
"cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
" /target:C:\Backup\DriveD /volume:D" & vbNewLine & _
"cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
" /target:C:\Backup\DriveD /unmount" & _
vbNewLine & vbNewLine & _
"Hint: No need to unmount before taking a new snapshot." & vbNewLine
Die ""
End If
End Sub
Sub Say(message)
If message <> "" Then WScript.Echo message
End Sub
Sub Log(message)
Say FormatDateTime(Now()) & " " & message
End Sub
Sub Dbg(message)
If args.Exists("debug") Then
Say String(75, "-")
Say "DEBUG: " & message
End If
End Sub
Sub Die(message)
If message <> "" Then Say "FATAL ERROR: " & message
WScript.Quit 1
End Sub
Tôi hi vọng nó sẽ giúp ích cho mọi người. Hãy sử dụng nó theo cc-by-sa . Tất cả tôi yêu cầu là bạn để lại liên kết nguyên vẹn mà chỉ trở lại ở đây.