Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Доработка и проверка скрипта архивирования

Ответить
Настройки темы
CMD/BAT - [решено] Доработка и проверка скрипта архивирования

Пользователь


Сообщения: 95
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: igor.kinma
Дата: 24-01-2018
Описание: Последняя строчка P.S.
Добрый день уважаемые форумчане. Прошу Вашей помощи в проверке и доработке файла .bat так как сам я не очень силен в этой области, но что то нашел в интернете что то подправил сам. И так задача:

Есть 2 сервера:

1 хранятся Бд SQL и 1C. Путь D:\Programs\1C и резервные копии БД SQL D:\MSSQL\MSSQL\Backup\21_00. Есть промежуточные папка D:\ARHIV\ARHIV_1C и D:\ARHIV\ARHIV_BD
2 сервер на котором должны храниться копии сервера 1. Путь \\Server-domain\d$\ARHIV\ARHIV_BD и \\Server-domain\d$\ARHIV\ARHIV_1C .

Нужно сделать так что бы каждый день на сервере 1 делались архивы 1С и BD и копировались на сервер 2. При этом архивы на сервере 1 должны храниться не более 7 дней. Сделал такой исполняемый файл и сохранил его как start.bat:

код
D:

cd D:\Programs\1C

rar a -agYYYY.MM.DD -m5 -r -x D:\ARHIV\ARHIV_1C\backup_.rar *.*

cd D:\MSSQL\MSSQL\Backup\21_00

rar a -agYYYY.MM.DD -m5 -r -x D:\ARHIV\ARHIV_BD\backup_.rar *.*

copy /Y D:\ARHIV\ARHIV_1C\*.rar \\Server-domain\d$\ARHIV\ARHIV_1C\*.rar

copy /Y D:\ARHIV\ARHIV_BD\*.rar \\Server-domain\d$\ARHIV\ARHIV_BD\*.rar

Forfiles /P D:\ARHIV\ARHIV_1C /S /M *.* /D -7 /C "cmd /c del /Q @path"

Forfiles /P D:\ARHIV\ARHIV_BD /S /M *.* /D -7 /C "cmd /c del /Q @path"


Скажите все ли тут так? можно ли что то облегчить? И как к моей задаче сделать Log файл. Заранее всем спасибо за советы и участие в теме!

P.S. Знаю что команды forfiles и copy можно заменить командой robocopy, но как понять не могу. Хотя возможно я ошибаюсь что их можно заменить...

Отправлено: 13:16, 24-01-2018

 

Пользователь


Сообщения: 95
Благодарности: 0

Профиль | Отправить PM | Цитировать


Друзья давайте по активнее. Правда нужна помощь.

Отправлено: 09:32, 25-01-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата igor.kinma:
сам я не очень силен в этой области »
заплатите тому кто силён, потому как сейчас почти всё не так

Резервное копирование делают на случай сбоев в работе. Ваш "скрипт" никак не учитывает возможные сбои.

Отправлено: 10:19, 25-01-2018 | #3


Пользователь


Сообщения: 95
Благодарности: 0

Профиль | Отправить PM | Цитировать


Busla спасибо за помощь.

Отправлено: 11:44, 25-01-2018 | #4


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


igor.kinma,
Цитата igor.kinma:
давайте по активнее. »
Яволь, майн генераль! :)
Код: Выделить весь код
@Echo Off
Set "Arc="%ProgramFiles%\WinRar\Rar.exe""

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%

Call :Backup "Z:\Programs\1C" "Z:\ARHIV\ARHIV_1C" "Backup_%DArc%.rar" "Z:\Server-domain\d$\ARHIV\ARHIV_1C" "Z:\ARHIV\ARHIV_1C\%DArc%.log"

Call :Backup "Z:\MSSQL\MSSQL\Backup\21_00" "Z:\ARHIV\ARHIV_BD" "Backup_%DArc%.rar" "Z:\Server-domain\d$\ARHIV\ARHIV_BD" "Z:\ARHIV\ARHIV_BD\%DArc%.log"

GoTo :Eof

:Backup
	>>%5 (
	Echo ++++++ 
	Echo ++++++ %Date%  %Time%  %1
	>nul %Arc% a -m3 -r -ep1 "%~2\%~3" "%~1\*.*"
	If Not Exist "%~2\%~3" (
		Echo !!!!!! Archive not created "%~2\%~3"
	) Else (
		Echo ++++++ Files In Archives "%~2\%~3"
		Echo:
		%Arc% lb "%~2\%~3"
		Echo:
		Echo ++++++ Copy arhives from %2  to  %4
		Echo:
		Xcopy /D /Y /F "%~2\*.rar" "%~4\"

		Echo:
		Echo ++++++ Delete arhives from %2
		Echo:

		FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x3" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
		FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x5" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
	)
	) 
GoTo :Eof
Укажите Ваши пути в скрипте, там где Call :Backup ..... !!
Я не знаю объёма Ваших баз, ИМХО, ключ -m5 плох: не даёт существенного выигрыша в объеме, но зато при больших базах тратится громадное время. Я сделал -m3, но Вашу свободу никто не смеет ограничивать.
Цитата igor.kinma:
архивы на сервере 1 должны храниться не более 7 дней »
Я сделал, чтобы хранились последние 7 архивов, ИМХО, это безопаснее.
Цитата igor.kinma:
Сделал такой исполняемый файл и сохранил его как start.bat: »
Не делайте такого, не называйте Ваши батники именами CMD-команд, можно вляпаться в неприятности.
Цитата igor.kinma:
так как сам я не очень силен в этой области »
Дерзайте! Под лежачий камень ...

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 25-01-2018 в 15:35.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:13, 25-01-2018 | #5


Пользователь


Сообщения: 95
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Яволь, майн генераль! »
Уважаемый megaloman большое спасибо за скрипт все работает как надо. Но я не учел одно большое но когда описывал свою задачу!

Помогите пожалуйста неумному в доработке Вашего скрипта или создании дополнительного:

Базы данных 1С должны архивироваться каждый день в D:\ARHIV\1C и иметь вид Backup(1C)_дата.rar
Базы данных SQL должны архивироваться каждый день в D:\ARHIV\BD с заменой архива. Почему именно с заменой? На SQL сервере настроено резервное копирование БД каждый день в 21:00 с пн по пт. с удалением файлов старше 6 дней.

Тоесть я полагаю что данный архив должен называться Backup(SQL)_update.rar и каждый день в него должны добавляться недостающие файлы, а в пятницу после очередного пополнения, он должен быть переименован в Backup(SQL)_дата.rar. Таким образом он будет содержать в себе файлы SQL баз с пн по пт. (всего 5 файлов)

Ну и соответственно все это дело должно каждый день копироваться на сервер 1. по следующему принципу:

Архив 1C каждый день с названием Backup(1C)_дата.rar
Архив SQL баз каждый день с названием Backup(SQL)_update.rar, а в пятницу Backup(SQL)_дата.rar и после копирования, если оно удачно удалить файл Backup(SQL)_update.rar
И так же должно сохраниться условие хранение 7 архивов.

P.S Если для всего этого необходимо несколько файлов .bat то ни чего страшного главное что бы все это работало. Заранее Вам огромное спасибо.

Последний раз редактировалось igor.kinma, 06-02-2018 в 22:16.


Отправлено: 14:08, 06-02-2018 | #6


Пользователь


Сообщения: 95
Благодарности: 0

Профиль | Отправить PM | Цитировать


Немного подумав на ум приходит 3 .bat файла.

Архив и перенос Баз 1С
Код: Выделить весь код
@Echo Off
Set "Arc="%ProgramFiles%\WinRar\Rar.exe""

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%

Call :Backup "D:\Programs\1C" "D:\ARHIV\1C" "Backup(1С)_%DArc%.rar" "\\Server-domain\d$\ARHIV\1C" "D:\ARHIV\LOG\1C_%DArc%.log"

GoTo :Eof

:Backup
	>>%5 (
	Echo ++++++ 
	Echo ++++++ %Date%  %Time%  %1
	>nul %Arc% a -m3 -r -ep1 "%~2\%~3" "%~1\*.*"
	If Not Exist "%~2\%~3" (
		Echo !!!!!! Archive not created "%~2\%~3"
	) Else (
		Echo ++++++ Files In Archives "%~2\%~3"
		Echo:
		%Arc% lb "%~2\%~3"
		Echo:
		Echo ++++++ Copy arhives from %2  to  %4
		Echo:
		Xcopy /D /Y /F "%~2\*.rar" "%~4\"

		Echo:
		Echo ++++++ Delete arhives from %2
		Echo:

		FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x3" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
		FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x5" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
	)
	) 
GoTo :Eof


Архивирование и перенос SQL
Код: Выделить весь код
@Echo Off
Set "Arc="%ProgramFiles%\WinRar\Rar.exe""

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%

Call :Backup "D:\MSSQL\MSSQL\Backup\21_00" "D:\ARHIV\BD" "Backup(SQL)_update.rar" "\\Server-domain\d$\ARHIV\BD" "D:\ARHIV\LOG\SQL_%DArc%.log"

GoTo :Eof

:Backup
	>>%5 (
	Echo ++++++ 
	Echo ++++++ %Date%  %Time%  %1
	>nul %Arc% u -m3 -r -ep1 "%~2\%~3" "%~1\*.*"
	If Not Exist "%~2\%~3" (
		Echo !!!!!! Archive not created "%~2\%~3"
	) Else (
		Echo ++++++ Files In Archives "%~2\%~3"
		Echo:
		%Arc% lb "%~2\%~3"
		Echo:
		Echo ++++++ Copy arhives from %2  to  %4
		Echo:
		Xcopy /D /Y /F "%~2\*.rar" "%~4\"

		Echo:
		Echo ++++++ Delete arhives from %2
		Echo:

		FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x3" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
		FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x5" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
	)
	) 
GoTo :Eof


Далее нужен 3 скрипт который будет переименовывать архив Backup(SQL)_update.rar в Backup(SQL)_дата.rar, копировать его на сервер и удалять от туда Backup(SQL)_update.rar

Переименование и копирование архива
Код: Выделить весь код
@Echo Off

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%

RENAME D:\ARHIV\BD\Backup(SQL)_update.rar Backup(SQL)_%DArc%.rar
xcopy D:\ARHIV\BD\*.rar \\Server-domain\d$\ARHIV\BD /H /Y /C
erase \\Server-domain\d$\ARHIV\BD\Backup(SQL)_update.rar

Последний раз редактировалось igor.kinma, 06-02-2018 в 14:42.


Отправлено: 14:25, 06-02-2018 | #7


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Немного подумав, на ум приходит доработка 1 командного файла
Код: Выделить весь код
@Echo Off
Set "Arc="%ProgramFiles%\WinRar\Rar.exe""

FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
Set "DArc=%TDate:~0,4%.%TDate:~4,2%.%TDate:~6,2%
Call :DayOfWeek "DOW"

Call :Backup "Z:\Programs\1C" "Z:\ARHIV\ARHIV_1C" "Backup(1C)_%DArc%.rar" "Z:\Server-domain\d$\ARHIV\ARHIV_1C" "Z:\ARHIV\ARHIV_1C\%DArc%.log"

If "%DOW%"=="5" (
	>>"Z:\ARHIV\ARHIV_BD\%DArc%.log" (
	Echo ++++++ 
	Echo ++++++ %Date%  %Time%  "Z:\MSSQL\MSSQL\Backup\21_00"
	Echo ++++++ Ren "Z:\ARHIV\ARHIV_BD\Backup(SQL)_update.rar" "Backup(SQL)_%DArc%.rar"
	Ren "Z:\ARHIV\ARHIV_BD\Backup(SQL)_update.rar" "Backup(SQL)_%DArc%.rar" 2>&1
	)
	Call :Backup "Z:\MSSQL\MSSQL\Backup\21_00" "Z:\ARHIV\ARHIV_BD" "Backup(SQL)_%DArc%.rar" "Z:\Server-domain\d$\ARHIV\ARHIV_BD" "Z:\ARHIV\ARHIV_BD\%DArc%.log"
) Else (
	Call :Backup "Z:\MSSQL\MSSQL\Backup\21_00" "Z:\ARHIV\ARHIV_BD" "Backup(SQL)_update.rar" "Z:\Server-domain\d$\ARHIV\ARHIV_BD" "Z:\ARHIV\ARHIV_BD\%DArc%.log"
)
rem                          1                            2                   3                           4                                   5
GoTo :Eof

:Backup
	>>%5 (
	Echo ++++++ 
	Echo ++++++ %Date%  %Time%  %1
	>nul %Arc% u -m3 -r -ep1 "%~2\%~3" "%~1\*.*"
	If Not Exist "%~2\%~3" (
		Echo !!!!!! Archive not created "%~2\%~3"
	) Else (
		Echo ++++++ Files In Archives "%~2\%~3"
		Echo:
		%Arc% lb "%~2\%~3"
		Echo:
		Echo ++++++ Copy arhives from %2  to  %4
		Echo:
		Xcopy /D /Y /F "%~2\*.rar" "%~4\"

		Echo:
		Echo ++++++ Delete arhives from %2
		Echo:

		FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~2\*%~x3" /B /A:-D /O:-D /T:C`) DO Del /S "%~2\%%f"
		FOR /F "usebackq skip=7 delims=*" %%f IN (`2^>nul Dir "%~dp5*%~x5" /B /A:-D /O:-D /T:C`) DO Del /S "%~dp5%%f"
	)
	) 
GoTo :Eof

:DayOfWeek
rem Выдаёт номер дня недели в переменную имя которой указано в вызове в кавычках
	Set /A YYYY=%date:~6,4%, MM=1%date:~3,2%-100, DD=1%date:~0,2%-100
	Set /A %~1=((%YYYY%-1901)*365 + (%YYYY%-1901)/4 + %DD% + (!(%YYYY% %% 4))*(!((%MM%-3)^&16))+(%MM%-1)*30+2*(!((%MM%-7)^&16))-1+((65611044^>^>(2*%MM%))^&3))%%7+1
GoTo :Eof
Цитата igor.kinma:
Архив SQL баз каждый день с названием Backup(SQL)_update.rar, а в пятницу Backup(SQL)_дата.rar и после копирования, если оно удачно удалить файл Backup(SQL)_update.rar »
Это не выгодно. Я переименовал в пятницу архив Backup(SQL)_update.rar в Backup(SQL)_дата.rar и затем пополнил этот архив (команда u в rar).
Так, как описали Вы, архиватор заново будет архивировать все файлы, накопившиеся за неделю - лишние траты времени и места.
И вообще, я заменил команду a в RAR на u, чтобы не тратить время на переархивирование старых файлов в Backup(SQL)_update.rar.

Определение дня недели не помню где подсмотрел

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 07-02-2018 в 13:53.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:08, 07-02-2018 | #8


Пользователь


Сообщения: 95
Благодарности: 0

Профиль | Отправить PM | Цитировать


megaloman, Огромное Вам человеческое спасибо!Запустил Ваш скрипт в планировщик с пн по пт в 21:30. Будем тестировать.
Но есть один вопрос. Копирование на \Server-domain\ идет всех файлов из папок Z:\ARHIV\ARHIV_BD и Z:\ARHIV\ARHIV_1C или только последних которые создались?

Отправлено: 15:43, 07-02-2018 | #9


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


igor.kinma, 1C архивируется, а затем и копируется всё заново. Если не устраивает, то надо наманер как для баз SQL именовать архив без привязки к дате, обновлять его (при этом будут переархивированы обновлённые файлы и добавлены новые, а затем уже копировать этот файл с признаком даты в имени. Естественно, при этом в архиве будут все файлы. Вы не объяснили, что архивируется и можно ли после архивирования исходные файлы удалить. Если это бэкапы - вполне можно. И даже нужно, иначе будем постоянно архивировать всё, включая бэкапы столетней давности. Всего-то в Rar добавить ключ. Тогда получим архивы только свежих файлов. А вот если это рабочие базы .... Увы.
С sql мне понятнее. Там бэкапы, да и то, после успешного архивирования я бы их удалял (соответствующий ключ в rar).

В Вашей первоначальной постановке архивируется всё. Иного Вы не озвучивали.
Если что-то не устраивает, постарайтесь четче сформулировать Ваши хотелки Может быть можно как-то привязываться к именам исходных файлов?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 07-02-2018 в 16:12.


Отправлено: 16:07, 07-02-2018 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Доработка и проверка скрипта архивирования

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Доработка скрипта на Bash parrabol Программирование в *nix 4 31-10-2016 14:45
Java - маленькая доработка скрипта СТАТИСТИКА Kos2an Программирование и базы данных 0 04-10-2013 23:06
VBS/WSH/JS - доработка скрипта ZeVSalt Программирование и базы данных 3 23-09-2011 22:33
Проверка параметров запуска скрипта morgan1991 AutoIt 2 03-03-2009 00:43




 
Переход