Контроль версий в контекстном меню Проводника на VBS

в 12:25, , рубрики: vbscript, бэкапирование, резервное копирование, резервное копирование файлов

При коллективной работе с общей группой файлов зачастую кто-то из работников может испортить документ. Работая верстальщиком в районной газете, я сталкиваюсь с такими случаями, и приходится переверстывать некоторые элементы.

Поэтому я задумался о системе восстановления файлов. Резервное копирование на машине проводится автоматически раз в неделю, что позволяет не терять данных, однако при частом изменении документов это не спасает. Издание еженедельное, полос немного — каталог с файлами вёрстки текущего выпуска занимает 1-2 гб. У нас не имеется отдельного файлсервера, все данные хранятся на моей машине, и используется по сети еще двумя ПК. Собственно, все карты мне в руки.

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

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

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

HKEY_CLASSES_ROOT*shellSearchcommand

В последнем добавил строковый параметр

WScript C:windowsversion.vbs "%1"

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

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

image

image

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

X:Backup2014-09-01T16-45Сб 3 полоса
X:Backup2014-09-02T15-32Сб 1 полоса
X:Backup2014-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:windowswso.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-скрипта нет, наверняка она потребуется в будущем. Буду рад критике и предложениям.

Автор: Ubuntovod

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js