Войти

Показать полную графическую версию : [решено] Резервное копирование


Страниц : [1] 2

Charg
13-07-2015, 16:58
Собственно есть такой батник, который архивирует (с помощью 7z) нужные мне папки, затем подключает как сетевой диск нужную мне папку с nas-сервера и копирует архив туда (может как-то попроще можно? а то выглядит как костыль...)

echo off
:START_COMPRESS

ECHO started at %time%, %date%

"C:\Program Files\7-Zip\7z.exe" a -y -ssw -t7z -mx5 "C:\register centr\backups\%date:~0,2%.7z" "C:\register centr\BASE" "C:\register centr\IN" "C:\register centr\OUT"

ECHO done at %time%, %date%

IF %errorlevel%==0 goto START_COPYING
ELSE goto START_COMPRESS

:START_COPYING

net use p: \\backup\BACKUPS\Register_secretar
copy "C:\register centr\backups\%date:~0,2%.7z" p:\ /Y
net use p: /delete


Вопросов несколько:
1. Как сделать так чтобы записать лог всего этого? Можно конечно сделать второй батник и его запускать вот так "D:\первыйбатник.bat">d:\log_%date%.txt но тогда во время работы самого батника (первого) ничего не будет визуально заметно, а там сам 7z пишет в командную строку прогресс архивирования в процентах, хотелось бы это видеть.
2. Какую кодировку нужно использовать (и что сделать чтобы ее "применить") чтобы стандартный виндовый (хр) блокнот нормально читал логи? Дело в том что некоторые архивируемые файлы имеют русские названия, соответственно кириллица превращается в кракозябры.
3. Суть батника в том что он каждый день будет создавать архивы 01.7z, 02.7z и т.д. по дням, и соответственно когда наступит первое число следующего месяца - нужно архив перезаписать. Это по дефолту делается или нужно указать какие-то дополнительные параметры?
4. Если присутствует "говнокод" - просьба на это указать, я пока учусь и соответственно хотелось бы учиться делать правильно а не абы работало :)

Elven
13-07-2015, 17:46
3. Судя по ключу /Y архив перезапишет существующий при копировании. Больше можно ничего ничего не указывать.
2. 866
1. Что именно нужно логировать? Если достаточно времени/даты начала/завершения то это добавление нескольких ECHO в файл лога. например:
ECHO started at %time%, %date% >>d:\log_%date%.txt
Да и изначальный вариант с "D:\первыйбатник.bat">d:\log_%date%.txt » весьма даже нормален. Неужели автоматизация процесса делается только для того чтобы внимательно созерцать как этот процесс автоматизирован? ;)

Iska
13-07-2015, 18:55
может как-то попроще можно? »
Можно не подключать диск, а сразу копировать по UNC-пути. Если объём небольшой, то можно сразу туда и архивировать.

1. Как сделать так чтобы записать лог всего этого? Можно конечно сделать второй батник и его запускать вот так "D:\первыйбатник.bat">d:\log_%date%.txt но тогда во время работы самого батника (первого) ничего не будет визуально заметно, а там сам 7z пишет в командную строку прогресс архивирования в процентах, хотелось бы это видеть. »
Надо полагать, через большие костыли в виде «tee.exe».

2. Какую кодировку нужно использовать (и что сделать чтобы ее "применить") чтобы стандартный виндовый (хр) блокнот нормально читал логи? Дело в том что некоторые архивируемые файлы имеют русские названия, соответственно кириллица превращается в кракозябры. »
Надо не использовать «стандартный виндовый» Блокнот, а нечто другое, понимающее кодировку OEM/866. В принципе, Вы можете управлять кодировкой вывода 7-zip, но тогда вовсе получится каша из 866 и 1251.

3. Суть батника в том что он каждый день будет создавать архивы 01.7z, 02.7z и т.д. по дням, и соответственно когда наступит первое число следующего месяца - нужно архив перезаписать. Это по дефолту делается или нужно указать какие-то дополнительные параметры? »
Будут «молча» обновлены файлы в уже существующем архиве. Отсутствующие файлы не будут удалены из архива.

Charg
13-07-2015, 22:56
Что именно нужно логировать? Если достаточно времени/даты начала/завершения то это добавление нескольких ECHO в файл лога. например: »
Ну в идеале я хочу прикрутить логирование вот так:


IF %errorlevel%==0 goto :дальше
ELSE >вот тут пишем BAD_log_%date%.txt

Но не знаю как. А вообще само содержание лога в случае успеха не важно, а вот если что-то пошло не так - хотелось бы видеть то что пишет сам 7z. Ну или net\copy если ошибка на этих этапах.


Неужели автоматизация процесса делается только для того чтобы внимательно созерцать как этот процесс автоматизирован? »
Нет, автоматизация делается для того чтобы не делать вручную, ибо лень :) (кэп). А процентики нужны чтоб юзер видел сколько еще осталось (планируется делать бэкап каждый день за пол часа до конца рабочего дня, делается все минуту-две максимум (итоговый архив <5мб) но все же.

Можно не подключать диск, а сразу копировать по UNC-пути. Если объём небольшой, то можно сразу туда и архивировать. »
Помнится где-то читал что так делать не рекомендуется (не помню уже какие аргументы были против).
Будут «молча» обновлены файлы в уже существующем архиве. Отсутствующие файлы не будут удалены из архива. »
Не доверяю я этим "умным" обновлениям... получается придется вручную удалять (IF EXIST "d:\archive.7z" ^ DEL "d:\archive.7z" - вроде так?)

Iska
14-07-2015, 00:26
Помнится где-то читал что так делать не рекомендуется (не помню уже какие аргументы были против). »
Не встречал такого.

получается придется вручную удалять »
Я не могу ничего сказать, не зная задач, целей и плана Вашего расписания резервирования.

Ну в идеале я хочу прикрутить логирование вот так: »
@echo off
setlocal enableextensions enabledelayedexpansion

set sConstPath=C:\register centr

"%ProgramFiles%\7-Zip\7z.exe" a -y -ssw -t7z -mx5 "\\backup\BACKUPS\Register_secretar\%date:~3,2%.7z" "%sConstPath%\BASE" "%sConstPath%\IN" "%sConstPath%\OUT2" || >>"BAD_log_%date%.txt" echo Error: !ErrorLevel!

endlocal
exit /b 0


(планируется делать бэкап каждый день за пол часа до конца рабочего дня, делается все минуту-две максимум (итоговый архив <5мб) »
Назначьте исполнение пакетного файла на Logoff посредством групповой политики. И не понадобится «-ssw».

Charg
14-07-2015, 09:53
Я не могу ничего сказать, не зная задач, целей и плана Вашего расписания резервирования. »
У секретаря есть реестр документов, который написан хз кем и когда. Резервное копирование там не реализовано совсем, не говоря уже об автоматическом. Руководство, как это обычно и бывает, очень удивилось, услышав что если навернется компьютер секретаря - весь их реестр за 3 года пропадет без какого либо шанса на восстановление. Вот я его и хочу реализовать батничек который будет все это дело архивировать.

@echo off
setlocal enableextensions enabledelayedexpansion
set sConstPath=C:\register centr
"%ProgramFiles%\7-Zip\7z.exe" a -y -ssw -t7z -mx5 "\\backup\BACKUPS\Register_secretar\%date:~0,2%.7z" "%sConstPath%\BASE" "%sConstPath%\IN" "%sConstPath%\OUT" || >>"BAD_log_%date%.txt" echo Error: !ErrorLevel!
endlocal
exit /b 0 »
Хмм, спасибо, удобно получилось.
А exit /b 0 зачем? После архивирования еще ж нужно в этом же батнике архив переместить на nas, а exit /b 0 заканчивает работу батник при %errorlevel%==0, насколько я понял из справки?

Назначьте исполнение пакетного файла на Logoff посредством групповой политики. И не понадобится «-ssw». »
Событие Logoff это выключение питания или завершение сеанса пользователя? Судя по названию скорее второе но все-таки. И как это сделать?

Iska
14-07-2015, 11:28
А exit /b 0 зачем? »
Это установка значения errorlevel для родительского процесса.

После архивирования еще ж нужно в этом же батнике архив переместить на nas »
Разве:
"%ProgramFiles%\7-Zip\7z.exe" a -y -ssw -t7z -mx5 "\\backup\BACKUPS\Register_secretar\%date:~3,2%.7z" "%sConstPath%\BASE" "%sConstPath%\IN" "%sConstPath%\OUT2" || >>"BAD_log_%date%.txt" echo Error: !ErrorLevel!
?! Или «\\backup» — это ещё не NAS?

Событие Logoff это выключение питания или завершение сеанса пользователя? »
Завершение сеанса. На исполнение всех назначенных на это событие программ, скриптов и пакетных файлов отводится не более 10 минут (и, кажись, до 15 минут на новых ОС; в любом случае, это время также управляется групповой политикой).

И как это сделать? »
Назначение сценариев выхода пользователя из системы (http://winintro.ru/gpmc.ru/html/aea9c0c4-2504-4380-85b5-6d9e5bb8626d.htm)

Charg
14-07-2015, 13:02
?! Или «\\backup» — это ещё не NAS? »
А, он самый, проглядел.

Лог только получается какой-то бесполезный. Изменил для теста путь чтоб архив писался на \\backup1 (такого устройства естественно нет) и изменил имя одной из архивируемых папок - в логе просто "Error: 2". D:\>forum.bat

7-Zip 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18
Scanning


C:\register centr\OUT2: WARNING: Не удается найти указанный файл.



Creating archive \\backup1\BACKUPS\Register_secretar\14.7z


WARNINGS for files:

C:\register centr\OUT2 : Не удается найти указанный файл.

----------------
WARNING: Cannot find 1 file

Error:
7-Zip cannot open file
\\backup1\BACKUPS\Register_secretar\14.7z
Не найден сетевой путь.



System error:
Неопознанная ошибка

Iska
14-07-2015, 13:32
в логе просто "Error: 2". »
Ровно код ошибки:
Exit Codes from 7-Zip
7-Zip returns the following exit codes:

Code Meaning:
0 No error
1 Warning (Non fatal error(s)). For example, one or more files were locked by some other application, so they were not compressed.
2 Fatal error
7 Command line error
8 Not enough memory for operation
255 User stopped the process

При большом желании можно, конечно, добавить эту расшифровку.

А надо бы чтоб было всё это: »
Тогда попрощайтесь с «процентиками для пользователя» :). Добавьте вывод в тот же файл:
>>"BAD_log_%date%.txt" "%ProgramFiles%\7-Zip\7z.exe" a -y -ssw -t7z …

Charg
14-07-2015, 14:36
Добавьте вывод в тот же файл: »
И как это все будет происходить? Выполняется архивирование а потом когда доходил дело до лога оно снова повторяет всё "чтобы посмотреть что будет и записать" ? Т.е. по факту время выполнения скрипта х2?

Iska
14-07-2015, 14:51
И как это все будет происходить? »
Стандартный поток вывода stdout приложения «7z.exe» перенаправляется в указанный файл.

Выполняется архивирование а потом »
Никаких «потом». Вывод в файл происходит ровно в то же время, в какое ранее появлялись сообщения в окне консоли.

Т.е. по факту время выполнения скрипта х2? »
По факту время исполнения будет ровно тем же самым.

Charg
14-07-2015, 15:18
Стандартный поток вывода stdout приложения «7z.exe» перенаправляется в указанный файл. »
Какая-нибудь переменная есть, которая хранит всё это в себе? А то получается слишком длинно да и вдруг чего - исправлять в двух местах придется, не феншуй как-то :)

Iska
14-07-2015, 15:34
Тогда вот так попробуйте (не проверялось):
@echo off
setlocal enableextensions enabledelayedexpansion

set sConstPath=C:\register centr

>>"BAD_log_%date%.txt" (
"%ProgramFiles%\7-Zip\7z.exe" a -y -ssw -t7z -mx5 "\\backup\BACKUPS\Register_secretar\%date:~3,2%.7z" "%sConstPath%\BASE" "%sConstPath%\IN" "%sConstPath%\OUT2" || echo Error: !ErrorLevel!
)

endlocal
exit /b 0
Вот тут уже реальный вывод в файл будет идти не сразу, а группироваться и идти по выходу из операторных скобок. Время исполнения останется тем же.

Какая-нибудь переменная есть, которая хранит всё это в себе? »
Нет :).

gora
14-07-2015, 19:57
В последних версиях 7-Zip появился новый ключ. Возможно это как-то поможет при разделении потоков вывода... :dont-know
-bs[o|e|p][0|1|2] Set output stream for output/error/progress line; 0: disable, 1: stdout, 2: stderr.

Iska
14-07-2015, 20:22
В последних версиях 7-Zip появился новый ключ. »
Кстати, да! И не только. Наконец, появилось разделение — теперь собственно информация идёт в stdout, а ошибки — в stderr. В целом же :
- Console version now uses stderr stream for error messages.
- Console version now shows names of processed files only in progress line by default.
- new -bb[0-3] switch to set output log level. -bb1 shows names of processed files in log.
- new -bs[o|e|p][0|1|2] switch to set stream for output messages;
o: output, e: error, p: progress line; 0: disable, 1: stdout, 2: stderr.
И это не может не радовать.

Я ранее читал об этом (кстати, именно по Вашей ссылке из темы аддона), но пока не пробовал :).

Charg
15-07-2015, 10:18
gora, т.е., если я правильно понял, чтобы записать в лог все ошибки нужно добавить ключ -bso2?

gora
15-07-2015, 10:46
Charg, с такой командой:7z a t1.7z "R:\1\*" -bso2 2>"log_%date%.txt"
в консольное окно будет выводится только одна строка с процентами и текущим (сжимаемым в данный момент) именем файла, а весь остальной лог будет выведен в лог-файл.
Если Вас это не устроит, то можете поэкспериментировать с ключами ибо описание их достаточно скупое.

Charg
15-07-2015, 11:20
Вот тут уже реальный вывод в файл будет идти не сразу, а группироваться и идти по выходу из операторных скобок. »
Да, но в этом варианте лог пишется в любом случае, вне зависимости от наличия ошибок :) Да и в самой консоли пустота.

Пока что рабочий вариант выглядит вот так. Нужно будет поэксперементировать с этим новым ключем еще и комментарии расписать на всякий случай.
@echo off
setlocal enableextensions enabledelayedexpansion

set cArchPath=%ProgramFiles%\7-Zip\7z.exe
set cPath=C:\register centr
set cDestination=\\backup\BACKUPS\Register_secretar
set cParams=a -y -ssw -t7z -mx5


"%cArchPath%" %cParams% "%cDestination%\%date:~0,2%.7z" "%cPath%" || >>"BAD_log_%date%.txt" "%cArchPath%" %cParams% "%cDestination%\%date:~0,2%.7z" "%cPath%"

endlocal
exit /b 0

Iska
15-07-2015, 13:50
Да, но в этом варианте лог пишется в любом случае, вне зависимости от наличия ошибок »
А причём тут ошибки? В лог пишется вывод «7z.exe». Весь вывод. Ровно так, как Вы и просили выше.

Да и в самой консоли пустота. »
Разумеется, пустота. Поскольку весь вывод перенаправляется в файл. Я об этом писал ранее.

Пока что рабочий вариант выглядит вот так.
"%cArchPath%" %cParams% "%cDestination%\%date:~0,2%.7z" "%cPath%" || >>"BAD_log_%date%.txt" "%cArchPath%" %cParams% "%cDestination%\%date:~0,2%.7z" "%cPath%" »
Это не рабочий вариант. Вы делаете бессмысленную работу, дважды исполняя архивирование. Если Вам уж очень надо и в лог, и на консоль (хотя я не вижу в этом смысла) — используйте костыль в виде портированной утилиты «tee.exe».

Charg
15-07-2015, 14:13
хотя я не вижу в этом смысла »
Вывод в лог нужен мне, чтобы я видел как обстоят дела. Вывод в консоль нужна для того чтобы юзер видел прогресс во время выполнения архивирования.
используйте костыль в виде портированной утилиты «tee.exe». »
Это вообще что такое? :) Доп. утилит устанавливать не хочу.




© OSzone.net 2001-2012