1

Тема: WSH: резервная копия почты Mozilla Thunderbird

Помогите написать скрипт резервной копии почты Mozilla Thunderbird. Дело в том что нужно резервировать три папки:
C:\Program Files\Mozilla Thunderbird
C:\Documents and Settings\Users\Application Data\Thunderbird
C:\Documents and Settings\Users\Local Settings\Application Data\Thunderbird
для всех пользователей в сети, список пользователей можно либо в скрипте прописать либо отдельным файлом тхт-например и можно еще и лог файл чтоб создавался.

2

Re: WSH: резервная копия почты Mozilla Thunderbird

C:\Program Files\Mozilla Thunderbird

А это зачем?

3

Re: WSH: резервная копия почты Mozilla Thunderbird

В принципе C:\Program Files\Mozilla Thunderbird можно и не резервировать, но просто чтоб каждый раз не устанавливать её и + плагины к ней, а так просто можно скопировать и скриптом поместить просто ярлыки пользователям, она после запускается со всеми настройками. А так приходиться кучу программ ставить под админскими правами.

4 (изменено: dab00, 2011-10-23 09:26:05)

Re: WSH: резервная копия почты Mozilla Thunderbird

Можно упаковать в zip-архив следующим образом:


Option Explicit
Dim fso, objShell, wshShell
Dim strZipPath
Dim objFolder

Set wshShell = CreateObject("WScript.Shell")
'путь к zip-файлу
strZipPath = wshShell.CurrentDirectory & ".zip"

Set fso = CreateObject("Scripting.FileSystemObject")
'создаем пустой zip-файл
fso.CreateTextFile(strZipPath, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set fso = Nothing

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(wshShell.CurrentDirectory)
Set wshShell = Nothing

objShell.NameSpace(strZipPath).CopyHere objFolder.Items

Set objFolder = Nothing
Set objShell = Nothing
'если размер каталога большой - добавьте секунд
WScript.Sleep 1000

Скрипт пакует содержание текущего каталога.
Распаковать можно так:


Option Explicit
Dim fso, objShell, wshShell
Dim strZipPath

Set wshShell = CreateObject("WScript.Shell")
'путь к zip-файлу
strZipPath = wshShell.CurrentDirectory & ".zip"
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(strZipPath) Then	
	Set objShell = CreateObject("Shell.Application")
	objShell.NameSpace(wshShell.CurrentDirectory).CopyHere(objShell.NameSpace(strZipPath).Items)
	Set objShell = Nothing	
End If
Set fso = Nothing
Set wshShell = Nothing

Подобным образом можете резервировать/распаковывать каталоги:
- objShell.NameSpace(&H1a).Self.Path & "\Thunderbird"
- objShell.NameSpace(&H1c).Self.Path & "\Thunderbird"
или где там находятся файлы Вашей птицы

5

Re: WSH: резервная копия почты Mozilla Thunderbird

как ни странно но архив получается пустым

6

Re: WSH: резервная копия почты Mozilla Thunderbird

magistic пишет:

как ни странно но архив получается пустым

В коде читаем коммент: "'если размер каталога большой - добавьте секунд"
Попробуйте WScript.Sleep 5000, или даже 10000 - наверняка .

7

Re: WSH: резервная копия почты Mozilla Thunderbird

dab00 пишет:
' ...
objShell.NameSpace(strZipPath).CopyHere objFolder.Items
 
Set objFolder = Nothing
Set objShell = Nothing
'если размер каталога большой - добавьте секунд
WScript.Sleep 1000

В коде читаем коммент: "'если размер каталога большой - добавьте секунд"
Попробуйте WScript.Sleep 5000, или даже 10000 - наверняка .

Это не научный подход - гадать с WScript.Sleep .
По-моему, будет правильнее (хотя возможно, и потребуется доработка
+ добавте объявление objZipFolder и intCount):

' ...
intCount = objFolder.Items.Count
Set objZipFolder = objShell.NameSpace(strZipPath)
objZipFolder.CopyHere objFolder.Items
While objZipFolder.Items.Count < intCount
  WScript.Sleep 500
Wend

Set objFolder = Nothing
Set objShell = Nothing
Забыл пароль и потерял e-mail.

8

Re: WSH: резервная копия почты Mozilla Thunderbird

shiz пишет:

По-моему, будет правильнее (хотя возможно, и потребуется доработка

Доработка потребуется: если последний item — папка с большим количеством папок и файлов — скрипт опять не успеет. Но подход, конечно, более разумный, нежели «на авось».

9 (изменено: dab00, 2011-10-24 19:41:44)

Re: WSH: резервная копия почты Mozilla Thunderbird

shiz пишет:

Это не научный подход - гадать с WScript.Sleep .
По-моему, будет правильнее (хотя возможно, и потребуется доработка...

По-моему форум для того и создан...
Вот Вы уже и сами предложили более рациональное решение.
Меня всего лишь заинтересовал вопрос как зазиповать с помощью скрипта - что нагуглил - трансформировал в ответ на Ваш пост
Наверняка, захотите - решите.
Уважаемый alexii, как повелось, может возразить - кто упоминал про zip?

10

Re: WSH: резервная копия почты Mozilla Thunderbird

OFF:

dab00 пишет:

Уважаемый alexii, как повелось, может возразить…

А должен ?

11 (изменено: dab00, 2011-10-24 22:01:06)

Re: WSH: резервная копия почты Mozilla Thunderbird

alexii пишет:

А должен ?

Ну... Про ZIP речь вроде не шла
Сорри, становится не видно смысла данной темы

12

Re: WSH: резервная копия почты Mozilla Thunderbird

Интересная тема получилась... Можно же было сделать проще (я конечно не ас в этом деле, но на форумах кое чему научился) есть 7zip и бесплатный,  если конечно архивировать, но хотелось бы:
на диск D: в определенную папку делать синхронизацию почты, в этой же папке сразу после архивации делать архив и все..

13 (изменено: shiz, 2011-10-25 16:50:59)

Re: WSH: резервная копия почты Mozilla Thunderbird

OFF:

alexii пишет:

Доработка потребуется: если последний item — папка с большим количеством папок и файлов — скрипт опять не успеет.

Спасибо, я что-то подобное подозревал.
Если дело именно в последнем item, доработка упрощается — если это папка, можно приложить условие к ней и так при необходимости по цепочке.
Но если не быть уверенным в "естественном" порядке добавления файлов в zip, то придётся использовать полноценную рекурсию или перебор в глубину.
Решение с проверкой .Items.Count я подсмотрел на этом форуме (см. Коллекцию, автор примера - Xameleon:

'...
    Function CopyFolderToArchive(FolderPath)
        If (ArchiveFolder Is Nothing) Then Exit Function
        ArchiveFolder.CopyHere FolderPath
        ItemsCount = ItemsCount + 1
    End Function 

    Function CloseArchive
        If (ArchiveFolder is Nothing) Then Exit Function
        Set WsriptShell = CreateObject("Wscript.Shell")
        If IsObject(Wscript) Then
            Do
                Wscript.Sleep 100
            Loop Until ArchiveFolder.Items.Count => ItemsCount
        Else
            ServerSleep
        End if
        ItemsCount = 0
    End Function
'...

) - сам бы к своему стыду до него, вероятно, не додумался,
а через небольшие промежутки времени проверял бы размер создаваемого ZIP до тех пор пока он не перестал бы увеличиваться - не знаю, насколько это надёжно...

Забыл пароль и потерял e-mail.