[Из песочницы] Контроль версий в контекстном меню Проводника на VBS

При коллективной работе с общей группой файлов зачастую кто-то из работников может испортить документ. Работая верстальщиком в районной газете, я сталкиваюсь с такими случаями, и приходится переверстывать некоторые элементы.Поэтому я задумался о системе восстановления файлов. Резервное копирование на машине проводится автоматически раз в неделю, что позволяет не терять данных, однако при частом изменении документов это не спасает. Издание еженедельное, полос немного — каталог с файлами вёрстки текущего выпуска занимает 1–2 гб. У нас не имеется отдельного файлсервера, все данные хранятся на моей машине, и используется по сети еще двумя ПК. Собственно, все карты мне в руки.Для резервного копирования я использую утилиту MAX SyncUp (не реклама). В машине 3 жестких диска: ОС/софт, вёрстка/фото и бэкапы. Создание резервной копии любого файла не отражается заметно на производительности. На третьем HDD свободного места предостаточно, поэтому я не стал использовать дополнительный софт, руководствуясь принципом «Меньше излишеств — стабильней работа системы».Итак, я приступил к организации моей задумки.

Для начала в утилите резервного копирования создал правило, копирующее все измененные в верстке файлы в директорию X:\Backup\, с указанием даты и времени, раз в 7 минут (время подбиралось экспериментальным путём). Каждая версия файла имеет разницу в небольшой промежуток времени, если, конечно, была изменена. Поработав с этого понедельника, я в очередной раз столкнулся с порчей данных, и попытался их восстановить. Для этого пришлось вручную заходить в каталог с бэкапами и набирать имя полосы в поиске. Но так работать нельзя, и из принципа необходимо развить идею. Перехожу ко второй части — добавляю в контекстное меню пункт «Версии файла».

Для начала в реестре создал каталог

HKEY_CLASSES_ROOT\*\shell\Search\command В последнем добавил строковый параметр

WScript C:\windows\version.vbs \»%1\» В каталоге Search в реестре выше создал строковый параметр с именем MUIVerb, задающий имя пункта. В нашем случае это «Версии файла», и параметр Icon, содержащий путь к иконке.

Что получилось:

image

image

Резервные копии у меня сохраняются в каталог автоматически по мере изменения в таком виде:

X:\Backup\2014–09–01T16–45\Сб 3 полоса X:\Backup\2014–09–02T15–32\Сб 1 полоса X:\Backup\2014–09–02T15–39\Сб 1 полоса Теперь пора написать VBS-скрипт, ищущий в бэкапе необходимые файлы и выдающий их списком.Используем WSO.dll

Код скрипта Dim folder Dim fso Dim filename Dim mass ()

folder = «X:\Backup» 'Здесь указывается путь к папке с бэкапами

Set WshShell = CreateObject («WScript.Shell») rc = WshShell.Run («regsvr32.exe /s c:\windows\wso.dll», 0, True)

Set objArg = WScript.Arguments Set fso = WScript.CreateObject («Scripting.FileSystemObject») Set oFolders = fso.GetFolder (folder)

Set oSubfolders = oFolders.SubFolders

filename = FSO.GetFileName (objArg (0)) Redim mass (oSubFolders.Count)

i = 1

For Each oFolder In oSubFolders mass (i) = oFolder.Name i=i+1 Next

Set o = WScript.CreateObject («Scripting.WindowSystemObject») o.EnableVisualStyles = true

Set f = o.CreateForm (0,0,520,0) f.Text = «Версии Файлов» f.CenterControl ()

Sub ButtonClick (this) rc=WshShell.Run (this.note) f.Close () End Sub

Function CanClose (Sender, Result) Result.Put (true) End Function files =0

for i = oSubFolders.Count to 1 Step -1 if FSO.FileExists (Folder & »\»& mass (i) & »\» & filename) Then if files < 15 then f.ClientHeight = 40 * (files +1) f.CenterControl() strListFolders = fso.GetBaseName(Folder & "\"& mass(i) & "\" & filename) & " - " & GetDate(mass(i)) & vbcrlf SET Button = f.CreateButton(7,40 * files,490,40,strListFolders) Button.CommandLinkButton = true Button.OnClick = GetRef("ButtonClick") Button.Note = chr(34) & Folder & "\"& mass(i) & "\" & filename & chr(34) files = files +1 End if End if Next

if files =0 then MsgBox «Файлы не найдены» f.close End if

f.OnCloseQuery = GetRef («CanClose»)

f.Show ()

o.Run ()

Function StartupDir () Dim s s = WScript.ScriptFullName s = Left (s, InStrRev (s,»\»)) StartupDir = s End Function

Sub AboutWSO_OnHitTest (Sender, x, y, ResultPtr) ResultPtr.put (o.Translate («HTCAPTION»)) End Sub

Sub CloseFormHandler (Sender) Sender.Form.Close () End Sub

function GetDate (ByVal DateIn) If DateDiff («d», DateSerial (Left (DateIn,4), Mid (DateIn,6,2), Mid (DateIn,9,2)), Date ()) = 1 Then GetDate = «Вчера в » & Mid (DateIn,12,2) & ».» & Right (DateIn,2) ElseIf DateDiff («d», DateSerial (Left (DateIn,4), Mid (DateIn,6,2), Mid (DateIn,9,2)), Date ()) > 1 Then GetDate = Mid (DateIn,9,2) & ».» & Mid (DateIn,6,2) & ».» & Left (DateIn,4) & » в » & Mid (DateIn,12,2) & ».» & Right (DateIn,2) 'ElseIf DateDiff («d», DateSerial (Left (DateIn,4), Mid (DateIn,6,2), Mid (DateIn,9,2)), Date ()) < 1 Then ' GetDate = Mid(DateIn,9,2) & "." & Mid(DateIn,6,2) & "." & Left(DateIn,4) & " в " & Mid(DateIn,12,2) & "." & Right(DateIn,2) ElseIf DateSerial(Left(DateIn,4),Mid(DateIn,6,2),Mid(DateIn,9,2)) = Date() Then GetDate = "Сегодня в " & Mid(DateIn,12,2) & "." & Right(DateIn,2) End If end function Что получилось:

image

image

Также я поставил автоудаление резервных файлов старше 10 дней. Так как накопленный занятый дисковый объем с понедельника по пятницу составил 6 гб, то за свободное место можно не беспокоиться. Теперь можно, не держа в памяти громоздкий софт, иметь быстрый доступ к резервным копиям, в т. ч. и по сети, ввиду отсутствия необходимости в дополнительном ПО на других машинах.

У реализации, безусловно, есть недостатки, такие как отсутствие поиска в подкаталогах и привязка к имени. Но, хотя сейчас необходимости в более гибкой структуре VBS-скрипта нет, наверняка она потребуется в будущем. Буду рад критике и предложениям.

© Habrahabr.ru