Показать полную графическую версию : [решено] Резервное копирование
Собственно есть такой батник, который архивирует (с помощью 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. Если присутствует "говнокод" - просьба на это указать, я пока учусь и соответственно хотелось бы учиться делать правильно а не абы работало :)
3. Судя по ключу /Y архив перезапишет существующий при копировании. Больше можно ничего ничего не указывать.
2. 866
1. Что именно нужно логировать? Если достаточно времени/даты начала/завершения то это добавление нескольких ECHO в файл лога. например:
ECHO started at %time%, %date% >>d:\log_%date%.txt
Да и изначальный вариант с "D:\первыйбатник.bat">d:\log_%date%.txt » весьма даже нормален. Неужели автоматизация процесса делается только для того чтобы внимательно созерцать как этот процесс автоматизирован? ;)
может как-то попроще можно? »
Можно не подключать диск, а сразу копировать по UNC-пути. Если объём небольшой, то можно сразу туда и архивировать.
1. Как сделать так чтобы записать лог всего этого? Можно конечно сделать второй батник и его запускать вот так "D:\первыйбатник.bat">d:\log_%date%.txt но тогда во время работы самого батника (первого) ничего не будет визуально заметно, а там сам 7z пишет в командную строку прогресс архивирования в процентах, хотелось бы это видеть. »
Надо полагать, через большие костыли в виде «tee.exe».
2. Какую кодировку нужно использовать (и что сделать чтобы ее "применить") чтобы стандартный виндовый (хр) блокнот нормально читал логи? Дело в том что некоторые архивируемые файлы имеют русские названия, соответственно кириллица превращается в кракозябры. »
Надо не использовать «стандартный виндовый» Блокнот, а нечто другое, понимающее кодировку OEM/866. В принципе, Вы можете управлять кодировкой вывода 7-zip, но тогда вовсе получится каша из 866 и 1251.
3. Суть батника в том что он каждый день будет создавать архивы 01.7z, 02.7z и т.д. по дням, и соответственно когда наступит первое число следующего месяца - нужно архив перезаписать. Это по дефолту делается или нужно указать какие-то дополнительные параметры? »
Будут «молча» обновлены файлы в уже существующем архиве. Отсутствующие файлы не будут удалены из архива.
Что именно нужно логировать? Если достаточно времени/даты начала/завершения то это добавление нескольких ECHO в файл лога. например: »
Ну в идеале я хочу прикрутить логирование вот так:
IF %errorlevel%==0 goto :дальше
ELSE >вот тут пишем BAD_log_%date%.txt
Но не знаю как. А вообще само содержание лога в случае успеха не важно, а вот если что-то пошло не так - хотелось бы видеть то что пишет сам 7z. Ну или net\copy если ошибка на этих этапах.
Неужели автоматизация процесса делается только для того чтобы внимательно созерцать как этот процесс автоматизирован? »
Нет, автоматизация делается для того чтобы не делать вручную, ибо лень :) (кэп). А процентики нужны чтоб юзер видел сколько еще осталось (планируется делать бэкап каждый день за пол часа до конца рабочего дня, делается все минуту-две максимум (итоговый архив <5мб) но все же.
Можно не подключать диск, а сразу копировать по UNC-пути. Если объём небольшой, то можно сразу туда и архивировать. »
Помнится где-то читал что так делать не рекомендуется (не помню уже какие аргументы были против).
Будут «молча» обновлены файлы в уже существующем архиве. Отсутствующие файлы не будут удалены из архива. »
Не доверяю я этим "умным" обновлениям... получается придется вручную удалять (IF EXIST "d:\archive.7z" ^ DEL "d:\archive.7z" - вроде так?)
Помнится где-то читал что так делать не рекомендуется (не помню уже какие аргументы были против). »
Не встречал такого.
получается придется вручную удалять »
Я не могу ничего сказать, не зная задач, целей и плана Вашего расписания резервирования.
Ну в идеале я хочу прикрутить логирование вот так: »
@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».
Я не могу ничего сказать, не зная задач, целей и плана Вашего расписания резервирования. »
У секретаря есть реестр документов, который написан хз кем и когда. Резервное копирование там не реализовано совсем, не говоря уже об автоматическом. Руководство, как это обычно и бывает, очень удивилось, услышав что если навернется компьютер секретаря - весь их реестр за 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 это выключение питания или завершение сеанса пользователя? Судя по названию скорее второе но все-таки. И как это сделать?
А 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)
?! Или «\\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:
Неопознанная ошибка
в логе просто "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 …
Добавьте вывод в тот же файл: »
И как это все будет происходить? Выполняется архивирование а потом когда доходил дело до лога оно снова повторяет всё "чтобы посмотреть что будет и записать" ? Т.е. по факту время выполнения скрипта х2?
И как это все будет происходить? »
Стандартный поток вывода stdout приложения «7z.exe» перенаправляется в указанный файл.
Выполняется архивирование а потом »
Никаких «потом». Вывод в файл происходит ровно в то же время, в какое ранее появлялись сообщения в окне консоли.
Т.е. по факту время выполнения скрипта х2? »
По факту время исполнения будет ровно тем же самым.
Стандартный поток вывода stdout приложения «7z.exe» перенаправляется в указанный файл. »
Какая-нибудь переменная есть, которая хранит всё это в себе? А то получается слишком длинно да и вдруг чего - исправлять в двух местах придется, не феншуй как-то :)
Тогда вот так попробуйте (не проверялось):
@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
Вот тут уже реальный вывод в файл будет идти не сразу, а группироваться и идти по выходу из операторных скобок. Время исполнения останется тем же.
Какая-нибудь переменная есть, которая хранит всё это в себе? »
Нет :).
В последних версиях 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.
В последних версиях 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.
И это не может не радовать.
Я ранее читал об этом (кстати, именно по Вашей ссылке из темы аддона), но пока не пробовал :).
gora, т.е., если я правильно понял, чтобы записать в лог все ошибки нужно добавить ключ -bso2?
Charg, с такой командой:7z a t1.7z "R:\1\*" -bso2 2>"log_%date%.txt"
в консольное окно будет выводится только одна строка с процентами и текущим (сжимаемым в данный момент) именем файла, а весь остальной лог будет выведен в лог-файл.
Если Вас это не устроит, то можете поэкспериментировать с ключами ибо описание их достаточно скупое.
Вот тут уже реальный вывод в файл будет идти не сразу, а группироваться и идти по выходу из операторных скобок. »
Да, но в этом варианте лог пишется в любом случае, вне зависимости от наличия ошибок :) Да и в самой консоли пустота.
Пока что рабочий вариант выглядит вот так. Нужно будет поэксперементировать с этим новым ключем еще и комментарии расписать на всякий случай.
@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
Да, но в этом варианте лог пишется в любом случае, вне зависимости от наличия ошибок »
А причём тут ошибки? В лог пишется вывод «7z.exe». Весь вывод. Ровно так, как Вы и просили выше.
Да и в самой консоли пустота. »
Разумеется, пустота. Поскольку весь вывод перенаправляется в файл. Я об этом писал ранее.
Пока что рабочий вариант выглядит вот так.
"%cArchPath%" %cParams% "%cDestination%\%date:~0,2%.7z" "%cPath%" || >>"BAD_log_%date%.txt" "%cArchPath%" %cParams% "%cDestination%\%date:~0,2%.7z" "%cPath%" »
Это не рабочий вариант. Вы делаете бессмысленную работу, дважды исполняя архивирование. Если Вам уж очень надо и в лог, и на консоль (хотя я не вижу в этом смысла) — используйте костыль в виде портированной утилиты «tee.exe».
хотя я не вижу в этом смысла »
Вывод в лог нужен мне, чтобы я видел как обстоят дела. Вывод в консоль нужна для того чтобы юзер видел прогресс во время выполнения архивирования.
используйте костыль в виде портированной утилиты «tee.exe». »
Это вообще что такое? :) Доп. утилит устанавливать не хочу.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.