Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Архивация файлов с последующим удалением (http://forum.oszone.net/showthread.php?t=202526)

Romano 20-03-2011 16:45 1639515

Архивация файлов с последующим удалением
 
Ежедневно прикладное ПО создает в каталогах

\\servername1\FileRes1\Dir1\IN
\\servername1\FileRes1\Dir1\OUT

папки и пишет файлы в них, имена папок формируются по следующему принципу Mxx_Dxx, где М-месяц, D-день. Т.е.набор папок в Dir1\IN(OUT) выглядит так:

февраль
-------
M02_D01
M02_D02
.......
M02_D28

март
----
M03_D01
M03_D02
.......
M03_D31

Необходимо с использованием VBS скрипта, прописанного в планировщике Windows, архивировать RAR'ом созданные за день файлы в папках IN(OUT) на другой сервер по пути

\\servername2\FileRes2\BackupDir1\Год\AchFileNameDDMMYY.RAR, где МM-месяц, DD-день, YY-год т.е. из папок IN(OUT) сливать в один архив, но пути внутри архива сохранять (при распаковке развернется архив в исходные каталоги в том виде в котором они писались отдельно в IN и OUT).

Должна быть проверка, что архивирование прошло успешно (может сеть пропадала, свет выключили и т.д.), затем файлы можно удалить.

Например, наступило 20.03.2011, появятся две директории, начнут в течении дня писаться файлы
\\servername1\FileRes1\Dir1\IN\M03_D20\*.*
\\servername1\FileRes1\Dir1\OUT\M03_D20\*.*
прошел день, ночью запустился планировщик, файлы запаковались в архив
\\servername2\FileRes2\BackupDir1\Год\AchFileName200311.RAR

наступит 21.03.2011, начнут в течении дня писаться файлы
\\servername1\FileRes1\Dir1\IN\M03_D21\*.*
\\servername1\FileRes1\Dir1\OUT\M03_D21\*.*
пройдет день, ночью запустился планировщик, файлы запаковались в архив
\\servername2\FileRes2\BackupDir1\Год\AchFileName210311.RAR

Скрипт будет запускаться с сервера №3 - servername3.



Заранее благодарю всех, кто поучаствует в теме.

megaloman 20-03-2011 22:57 1639729

Если не принципиально, батник или vbs, то вот решение в батнике
Код:

@Echo Off
Set Rar="C:\Program Files\Winrar\Winrar.exe" a -r -df

rem Пути без кавычек с \ на конце
rem -----------------------------
Set WhereIn=Q:\Delete\Servername1\FileRes1\Dir1\In\
Set WhereOut=Q:\Delete\Servername1\FileRes1\Dir1\Out\
Set WhereArc=Q:\Delete\Servername2\FileRes2\BackupDir1\

rem Имя сегодняшней директории, её не архивируем Mmm_Ddd
rem Если дата в системе в формате dd.mm.yyyy
rem ----------------------------------------------------
Set ToDay=M%Date:~3,2%_D%Date:~0,2%

FOR /F "usebackq delims=" %%i IN (`Dir %WhereIn% /B /A:D`) DO Call :InRar "%%i" "%WhereIn%%%i"
FOR /F "usebackq delims=" %%i IN (`Dir %WhereOut% /B /A:D`) DO Call :InRar "%%i" "%WhereOut%%%i"

GoTo :Eof

:InRar

If /I %~1==%ToDay% GoTo :Eof

Set Year=%~t2
Set Year=%Year:~6,4%

Md %WhereArc%%Year% >Nul 1>Nul 2>nul

rem Имя файла архива AchFileNameDDMMYY.RAR
rem --------------------------------------
Set AFN=%~1
Set AFN=AchFileName%AFN:~-2%%AFN:~1,2%%Year:~-2%

%RAR% "%WhereArc%%Year%\%AFN%" "%WhereIn%%~1" "%WhereOut%%~1"

GoTo :Eof

Пути, естественно, пропишите свои.
За удаление файлов отвечает ключ rar -df, он срабатывает при успешном архивировании.
Думаю, на vbs это будет несколько длинее. Будет время и если никто не напишет, изваяю.

sov44 21-03-2011 13:56 1640104

megaloman, а как написать скрипт, чтобы бекап был на три дня? При наступлении четвёртого дня, бекап 1 дня перезаписывался, пятого дня - бекап второго перезаписывался и т.д.

Romano 21-03-2011 17:23 1640265

Цитата:

Цитата megaloman
Если не принципиально, батник или vbs, то вот решение в батнике »

Спасибо большое за такой вариант тоже, единственное хотелось бы на VBS :), дело в том, что сейчас это уже реализовано в батнике, он занимает 8 строк, но много чего не учитывает и часто почему то не отрабатывает, приходишь утром, а файлы на месте, вручную запускаешь ВАТ...так что предложенный Ваш вариант тоже протестирую...

Ещё раз спасибо, что уделили время.

megaloman 22-03-2011 23:15 1641490

sov44,
Цитата:

чтобы бекап был на три дня
- это неопределённая постановка вопроса. Вот Вам идея решения, нечто подобное реализовано у меня.
Делаете 3 директории Dir1 Dir2 Dir3
Ежедневные бэкапы делаем в Dir1
Но перед бэкапом,
если в Dir2 есть бэкап, убиваем бэкап в Dir3, move бэкап из Dir2 в Dir3
move бэкап из Dir1 в Dir2
Делаем бэкап в Dir1

То есть получаем, что в Dir1 самый свежий бэкап, а в Dir3 самый старый.

Romano,Обещанный скрипт VBS
Код:

Rar = """C:\Program Files\Winrar\Winrar.exe"" a -r -df "

WhereIn = "Q:\Delete\Servername1\FileRes1\Dir1\In\"    ' Пути без кавычек с \ на конце
WhereOut = "Q:\Delete\Servername1\FileRes1\Dir1\Out\"
WhereArc = "Q:\Delete\Servername2\FileRes2\BackupDir1\"

D = Day(Date)
If D < 10 Then DD = "0" + CStr(D) Else DD = CStr(D)

M = Month(Date)
If M < 10 Then MM = "0" + CStr(M) Else MM = CStr(M)

ToDay = "M" + MM + "_D" + DD        ' Имя сегодняшней директории, её не архивируем Mdd_Ddd

Set WS = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")

For i = 1 To 2
   
    If i = 1 Then Set F = FSO.GetFolder(WhereIn) Else Set F = FSO.GetFolder(WhereOut)
   
    Set SubF = F.SubFolders

    For Each Folder In SubF
        FN = UCase(Folder.Name)
       
        If ToDay <> FN Then
            YYYY = CStr(Year(Folder.DateCreated))
           
            On Error Resume Next
           
            If Not FSO.FolderExists(WhereArc + YYYY) Then Call FSO.CreateFolder(WhereArc + YYYY)
            If Err.Number <> 0 Then MsgBox "Не удалось создать папку для архивов"
   
            On Error GoTo 0
           
            If FSO.FolderExists(WhereArc + YYYY) Then
                YY = Mid(YYYY, 3, 2)
                SRar = Rar + """" + WhereArc + YYYY + "\ArcFileName" + Mid(FN, 6, 2) + Mid(FN, 2, 2) + YY + """"
                SRar = SRar + " """ + WhereIn + FN + """" + " """ + WhereOut + FN + """"
                Rez = WS.Run(SRar, 1, True)
            End If
        End If
    Next
   
Next

Но не надо иллюзий: VBS-скрипт не надёжнее батника, а если у Вас батник не отрабатывал, то ищите причину в доступах, в планировщике (если батник вручную отрабатывает наутро)

Romano 23-03-2011 18:03 1642103

Цитата:

Цитата megaloman
Romano,Обещанный скрипт VBS »

Прям не знаю как благодарить! :) Спасибо! Быстро и главное работает.

Опробовал батник пока, вроде работает). Он лучше, чем имеющийся у меня. У меня такие бэкапы делаются по нескольким папкам, поэтому попробую на одних папках Ваш батник, на других скрипт VBS.

Когда сейчас резервирование не проходит, в планировщике код завершения стоит 0х1, а что именно произошло не ясно, ведь иногда там бывает и 0х0, когда все успешно архивируется.


Время: 13:04.

Время: 13:04.
© OSzone.net 2001-