그래서 ... 나는 할 수있는 작은 VBScript를 연구하고 있습니다.
- 지속적인 VSS 스냅 샷 생성
- 파일을 폴더에 마운트 한 다음 파일을 백업 할 수 있습니다.
- VSS 스냅 샷 마운트 해제
Microsoft에서 제공 하는 Volume Shadow Copy Service SDK 7.2의 일부인 vshadow.exe
( documentation ) 에 의존합니다 . 이 버전으로 작업했습니다 : " VSHADOW.EXE 2.2-볼륨 섀도 복사본 샘플 클라이언트, Copyright (C) 2005 Microsoft Corporation. "
기본적으로이 네 가지 vshadow 명령을 둘러싼 깔끔한 작은 래퍼입니다.
vshadow.exe -q-시스템의 모든 섀도 복사본을 나열합니다
vshadow.exe -p {volume list}-영구 쉐도우 복사본 관리
vshadow.exe -el = {SnapID}, dir-섀도 복사본을 마운트 지점으로 노출
vshadow.exe -ds = {SnapID}-이 섀도 복사본을 삭제합니다
도움말 화면은 다음과 같습니다.
VSS 스냅 샷 생성 / 마운트 도구
용법:
cscript / nologo VssSnapshot.vbs / target : path {/ volume : X | / unmount} [/ debug]
/ volume-스냅 샷 할 볼륨의 드라이브 문자
/ target-스냅 샷을 마운트 할 경로 (절대 또는 상대)
/ debug-디버그 출력에 참여
예 :
cscript / nologo VssSnapshot.vbs / target : C : \ Backup \ DriveD / 볼륨 : D
cscript / nologo VssSnapshot.vbs / target : C : \ Backup \ DriveD / unmount
힌트 : 새 스냅 샷을 만들기 전에 마운트를 해제 할 필요가 없습니다.
다음은 샘플 출력입니다.
C : \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target : MountPoints \ E / 볼륨 : E
05/03/2010 17:13:04 VSS 마운트 지점 준비 중 ...
05/03/2010 17:13:04 마운트 지점 준비 : C : \ VssSnapshot \ MountPoints \ E
05/03/2010 17:13:04 볼륨에 대한 VSS 스냅 샷 생성 : E
ID : {4ed3a907-c66f-4b20-bda0-9dcda3b667ec}으로 생성 된 2010 년 5 월 3 일 17:13:08 스냅 샷
05/03/2010 17:13:08 VSS 스냅 샷이 성공적으로 마운트되었습니다
05/03/2010 17:13:08 완료
C : \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target : MountPoints \ E / 마운트 해제
05/03/2010 17:13:35 VSS 마운트 지점 준비 중 ...
05/03/2010 17:13:36 다른 할 일이 없습니다
05/03/2010 17:13:36 완료
그리고 여기 스크립트 자체가 있습니다. 일반적인 면책 조항이 적용됩니다 : 소프트웨어는있는 그대로 제공됩니다. 나는 보증하지 않으며, 당신이 책임이있는 유일한 것이 당신 자신 인 경우에 당신의 책임하에 사용합니다. 나는 그것을 철저히 테스트했지만 나에게 잘 작동합니다. 아래의 의견을 통해 버그를 알려주십시오.
''# 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
나는 이것이 누군가를 돕기를 바랍니다. cc-by-sa 에 따라 자유롭게 사용하십시오 . 내가 묻는 것은 여기에있는 링크를 그대로 두는 것입니다.