Компьютерный форум 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=302376)

Charg 13-07-2015 16:58 2528389

Резервное копирование
 
Собственно есть такой батник, который архивирует (с помощью 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 2528403

3. Судя по ключу /Y архив перезапишет существующий при копировании. Больше можно ничего ничего не указывать.
2. 866
1. Что именно нужно логировать? Если достаточно времени/даты начала/завершения то это добавление нескольких ECHO в файл лога. например:
Код:

ECHO started at %time%, %date% >>d:\log_%date%.txt
Да и изначальный вариант с
Цитата:

Цитата Charg
"D:\первыйбатник.bat">d:\log_%date%.txt »

весьма даже нормален. Неужели автоматизация процесса делается только для того чтобы внимательно созерцать как этот процесс автоматизирован? ;)

Iska 13-07-2015 18:55 2528427

Цитата:

Цитата Charg
может как-то попроще можно? »

Можно не подключать диск, а сразу копировать по UNC-пути. Если объём небольшой, то можно сразу туда и архивировать.

Цитата:

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

Надо полагать, через большие костыли в виде «tee.exe».

Цитата:

Цитата Charg
2. Какую кодировку нужно использовать (и что сделать чтобы ее "применить") чтобы стандартный виндовый (хр) блокнот нормально читал логи? Дело в том что некоторые архивируемые файлы имеют русские названия, соответственно кириллица превращается в кракозябры. »

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

Цитата:

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

Будут «молча» обновлены файлы в уже существующем архиве. Отсутствующие файлы не будут удалены из архива.

Charg 13-07-2015 22:56 2528507

Цитата:

Цитата Elven
Что именно нужно логировать? Если достаточно времени/даты начала/завершения то это добавление нескольких ECHO в файл лога. например: »

Ну в идеале я хочу прикрутить логирование вот так:
Код:


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

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


Цитата:

Цитата Elven
Неужели автоматизация процесса делается только для того чтобы внимательно созерцать как этот процесс автоматизирован? »

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

Цитата:

Цитата Iska
Можно не подключать диск, а сразу копировать по UNC-пути. Если объём небольшой, то можно сразу туда и архивировать. »

Помнится где-то читал что так делать не рекомендуется (не помню уже какие аргументы были против).
Цитата:

Цитата Iska
Будут «молча» обновлены файлы в уже существующем архиве. Отсутствующие файлы не будут удалены из архива. »

Не доверяю я этим "умным" обновлениям... получается придется вручную удалять (IF EXIST "d:\archive.7z" ^ DEL "d:\archive.7z" - вроде так?)

Iska 14-07-2015 00:26 2528522

Цитата:

Цитата Charg
Помнится где-то читал что так делать не рекомендуется (не помню уже какие аргументы были против). »

Не встречал такого.

Цитата:

Цитата Charg
получается придется вручную удалять »

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

Цитата:

Цитата Charg
Ну в идеале я хочу прикрутить логирование вот так: »

Код:

@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

Цитата:

Цитата Charg
(планируется делать бэкап каждый день за пол часа до конца рабочего дня, делается все минуту-две максимум (итоговый архив <5мб) »

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

Charg 14-07-2015 09:53 2528616

Цитата:

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

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

Цитата:

Цитата Iska
@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, насколько я понял из справки?

Цитата:

Цитата Iska
Назначьте исполнение пакетного файла на Logoff посредством групповой политики. И не понадобится «-ssw». »

Событие Logoff это выключение питания или завершение сеанса пользователя? Судя по названию скорее второе но все-таки. И как это сделать?

Iska 14-07-2015 11:28 2528667

Цитата:

Цитата Charg
А exit /b 0 зачем? »

Это установка значения errorlevel для родительского процесса.

Цитата:

Цитата Charg
После архивирования еще ж нужно в этом же батнике архив переместить на 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?

Цитата:

Цитата Charg
Событие Logoff это выключение питания или завершение сеанса пользователя? »

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

Цитата:

Цитата Charg
И как это сделать? »

Назначение сценариев выхода пользователя из системы

Charg 14-07-2015 13:02 2528701

Цитата:

Цитата Iska
?! Или «\\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 2528716

Цитата:

Цитата Charg
в логе просто "Error: 2". »

Ровно код ошибки:
Цитата:

Цитата 7-Zip Help
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

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

Цитата:

Цитата Charg
А надо бы чтоб было всё это: »

Тогда попрощайтесь с «процентиками для пользователя» :). Добавьте вывод в тот же файл:
Код:

>>"BAD_log_%date%.txt" "%ProgramFiles%\7-Zip\7z.exe" a -y -ssw -t7z

Charg 14-07-2015 14:36 2528740

Цитата:

Цитата Iska
Добавьте вывод в тот же файл: »

И как это все будет происходить? Выполняется архивирование а потом когда доходил дело до лога оно снова повторяет всё "чтобы посмотреть что будет и записать" ? Т.е. по факту время выполнения скрипта х2?

Iska 14-07-2015 14:51 2528748

Цитата:

Цитата Charg
И как это все будет происходить? »

Стандартный поток вывода stdout приложения «7z.exe» перенаправляется в указанный файл.

Цитата:

Цитата Charg
Выполняется архивирование а потом »

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

Цитата:

Цитата Charg
Т.е. по факту время выполнения скрипта х2? »

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

Charg 14-07-2015 15:18 2528774

Цитата:

Цитата Iska
Стандартный поток вывода stdout приложения «7z.exe» перенаправляется в указанный файл. »

Какая-нибудь переменная есть, которая хранит всё это в себе? А то получается слишком длинно да и вдруг чего - исправлять в двух местах придется, не феншуй как-то :)

Iska 14-07-2015 15:34 2528788

Тогда вот так попробуйте (не проверялось):
Код:

@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

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

Цитата:

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

Нет :).

gora 14-07-2015 19:57 2528864

В последних версиях 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 2528871

Цитата:

Цитата gora
В последних версиях 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 2529007

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

gora 15-07-2015 10:46 2529018

Charg, с такой командой:
Код:

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

Charg 15-07-2015 11:20 2529029

Цитата:

Цитата Iska
Вот тут уже реальный вывод в файл будет идти не сразу, а группироваться и идти по выходу из операторных скобок. »

Да, но в этом варианте лог пишется в любом случае, вне зависимости от наличия ошибок :) Да и в самой консоли пустота.

Пока что рабочий вариант выглядит вот так. Нужно будет поэксперементировать с этим новым ключем еще и комментарии расписать на всякий случай.
Код:

@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 2529069

Цитата:

Цитата Charg
Да, но в этом варианте лог пишется в любом случае, вне зависимости от наличия ошибок »

А причём тут ошибки? В лог пишется вывод «7z.exe». Весь вывод. Ровно так, как Вы и просили выше.

Цитата:

Цитата Charg
Да и в самой консоли пустота. »

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

Цитата:

Цитата Charg
Пока что рабочий вариант выглядит вот так.
Код:

"%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 2529077

Цитата:

Цитата Iska
хотя я не вижу в этом смысла »

Вывод в лог нужен мне, чтобы я видел как обстоят дела. Вывод в консоль нужна для того чтобы юзер видел прогресс во время выполнения архивирования.
Цитата:

Цитата Iska
используйте костыль в виде портированной утилиты «tee.exe». »

Это вообще что такое? :) Доп. утилит устанавливать не хочу.

Iska 15-07-2015 15:38 2529110

Цитата:

Цитата Charg
Это вообще что такое? »

tee — Википедия
Native Win32 ports of some GNU utilities

Цитата:

Цитата Charg
Доп. утилит устанавливать не хочу. »

Угу. Лучше будем делать дважды архивирование :shot:.

Charg 15-07-2015 17:04 2529134

Цитата:

Цитата Iska
Угу. Лучше будем делать дважды архивирование »

Честно говоря если выбирать между двойным временем и установкой доп. утилит - я выберу первое.
Хотя конечно хотелось бы обойтись без лишних временных затрат.

Признаться я очень удивлен что нельзя логировать всё происходящее в cmd =\
Раз так - вижу единственный вариант call script.bat >> log.txt (но так получится 2 окна консоли по идее)

Iska 15-07-2015 18:40 2529172

Цитата:

Цитата Charg
Раз так - вижу единственный вариант call script.bat >> log.txt (но так получится 2 окна консоли по идее) »

Так получится два пустых окна консоли.


Время: 03:41.

Время: 03:41.
© OSzone.net 2001-