CMD/BAT - [решено] Копирование файлов по расписанию

Ответить
Аватара пользователя
c0t0s

CMD/BAT - [решено] Копирование файлов по расписанию

Сообщение c0t0s »

Добрый день! Нужна помощь в создании скрипта, который копировал бы файлы созданные 1 и 15 числа каждого месяца из папки "\\10.10.0.1\BackUp\Base1\" в папку "Z:\SQL\Bases1"

Возможно есть вариант удалять промежуточные бэкапы из папки \\10.10.0.1\BackUp\Base1\ , оставляя каждый месяц бэкап 1 числа, 15 числа, и 5 последних. Бэкапы создаются каждый день в формате .rar
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] Копирование файлов по расписанию

Сообщение megaloman »

Цитата c0t0s:



Бэкапы создаются каждый день в формате .rar
CMD/BAT - [решено] Копирование файлов по расписанию




Как именуются бэкапы в "\\10.10.0.1\BackUp\Base1\"? Это смесь бэкапов с разными именами по числам или это бэкапы чего-то одного?

Как ориентироваться на даты? Они как-то фигурируют в именах или надо ориентироваться исключительно на дату последнего изменения?
Аватара пользователя
c0t0s

Re: CMD/BAT - [решено] Копирование файлов по расписанию

Сообщение c0t0s »

Цитата megaloman:



Как именуются бэкапы в "\\10.10.0.1\BackUp\Base1\"? Это смесь бэкапов с разными именами по числам или это бэкапы чего-то одного?
CMD/BAT - [решено] Копирование файлов по расписанию




Что-то вроде Work_backup_2019_08_30_044427_1073484.bak.rar

Work_backup_2019_08_29_051354_6868648.bak.rar



- В папке только архивы с бэкапами SQL, имя одинаковое, только число меняется.
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] Копирование файлов по расписанию

Сообщение megaloman »

Код:

Код: Выделить всё

@Echo Off
cls
	Call :JobBack "\\192.168.100.23\test1\base1\Work_backup_" "_*_*.bak.rar" "01 15" 5 "Z:\SQL\Bases1"
Exit /B
:JobBack
	For %%d In (%~3) Do >nul Xcopy /Y /D "%~120??_??_%%d%~2" "%~5\"
	FOR /F "usebackq Skip=%4 delims=" %%f IN (`2^>nul Dir "%~120??_??_??%~2" /B /A:-D /O:-N`) DO (
		Call :JobDel "%~dp1" "%~nx1" "%~dp1%%f" %3
	)
Exit /B
:JobDel
	Set "NDate=%~nx3"
	Call Set "NDate=%%NDate:*%~2=%%"
	Set "NDate=%NDate:~8,2%"
	For %%d In (%~4) Do If "%%d"=="%NDate%" Exit /B
	Del %3 
Exit /B

Можно написать несколько строк

Call :JobBack

в зависимости от разных префиксов бэкапов баз (то есть для разных баз)

"01 15" дни месяца копируемых и хранимых бэкапов. Может быть несколько дат, например "01 08 15 22"

5 - число неудаляемых свежих бэкапов. Можете поставить иное число.

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

Повторного копирования баз за 01 15 число не будет.

Скрипт будет оставлять все исходные бэкапы за 01 и 15 числа и удалять все остальные, кроме 5 последних.
Аватара пользователя
DJ Mogarych

Re: CMD/BAT - [решено] Копирование файлов по расписанию

Сообщение DJ Mogarych »

Особо не проверял, допилите, если потребуется.





Код:

Код: Выделить всё

$src = "\\10.10.0.1\BackUp\Base1\"
$files = gci $path |sort CreationTime |select -SkipLast 5
$dest = "Z:\SQL\Bases1"
foreach ($file in $src) {
    if (($file.CreationTime).day -ne '1' -and ($file.CreationTime).day -ne '15') {
    Remove-Item $src\$file -Force -Recurse -confirm:$false
    }
}
& robocopy "$src" "$dest" /mir
Аватара пользователя
c0t0s

Re: CMD/BAT - [решено] Копирование файлов по расписанию

Сообщение c0t0s »

Цитата megaloman:



Можно написать несколько строк

Call :JobBack

в зависимости от разных префиксов бэкапов баз (то есть для разных баз)

"01 15" дни месяца копируемых и хранимых бэкапов. Может быть несколько дат, например "01 08 15 22"

5 - число неудаляемых свежих бэкапов. Можете поставить иное число.

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

Повторного копирования баз за 01 15 число не будет.

Скрипт будет оставлять все исходные бэкапы за 01 и 15 числа и удалять все остальные, кроме 5 последних.
CMD/BAT - [решено] Копирование файлов по расписанию




Спасибо за помощь, очень полезный скрипт! Я так понимаю, можно добавлять и другие Call :JobBack со схожим именем. Но мне нужно 1 бэкап с именем IWZ_backup_201909020500.bak настроить таким же принципом. Как нужно поменять часть с датами в данной ситуации?

Call :JobBack "\\192.168.100.23\test2\base2\ IWZ_backup_" "_*_*.bak.rar" "01 15" 5 "Z:\SQL\IWZ"
Аватара пользователя
c0t0s

Re: CMD/BAT - [решено] Копирование файлов по расписанию

Сообщение c0t0s »

Цитата megaloman:



c0t0s, Если между "\\192.168.100.23\test2\base2\ IWZ_backup_" и "_*_*.bak.rar" дата в формате ГГГГ_ММ_ДД (например 2019_08_30) то правильно.

Код:

Call :JobBack "начало имени файла с путём" "конец имени файла с расширением" "список дат через пробел" число_хранимых_дней "Полный путь папки для копий"

Дата в имени файла должна быть в формате ГГГГ_ММ_ДД

В скрипте может быть или одна, или несколько строк с Call :JobBack ..... для разных имён баз
»




Один бэкап делается в таком формате: IWZ_backup_201909020500.bak - можно его как-то пристроить в данном скрипте? или нужно делать новый? Может конвертировать как-то под нужный формат при перемещении или что-то такое... Получается, на данный момент у данного архива формат ГГГГММДДЧЧММ, может поможете переписать скрипт архивирования, под нужный формат?

Вот часть кода архивирования бэкапа



Код:

Код: Выделить всё

Set "Arc="C:\Program Files\WinRAR\WinRAR.exe" a -m1 -df"
FOR %%f IN ("%From%") DO %Arc% "%To%\%%~nxf.rar" "%%f"

Поидее нужно дописать ключ -ag+YYYY_MM_DD, но не уверен, что это прокатит.
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] Копирование файлов по расписанию

Сообщение megaloman »

Цитата c0t0s:



Один бэкап делается в таком формате: IWZ_backup_201909020500.bak
CMD/BAT - [решено] Копирование файлов по расписанию




А причём здесь rar? Вы получаете IWZ_backup_201909020500.bak.rar?

Если у Вас бэкап изначально с именем IWZ_backup_201909020500.bak то rar не сделает Вам IWZ_backup_2019_09_02_0500.bak.rar

Ключ -ag+YYYY_MM_DD допишет дату перед именем, -agYYYY_MM_DD допишет дату перед .rar


Вот вариант для разных форматов дат

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@Echo Off
cls
	Call :JobBack "\\192.168.100.23\test1\base1\Work_backup_" "20??_??_%%%%d" "8,2" "_*_*.bak.rar" "01 15" "5" "Z:\SQL\Bases1"
	Call :JobBack "\\192.168.100.23\test1\base1\IWZ_backup_" "20????%%%%d" "6,2" "*.bak.rar" "01 15" "5" "Z:\SQL\IWZ"
Exit /B
:JobBack
	For %%d In (%~5) Do >nul Xcopy /Y /D "%~1%~2%~4" "%~7\"
	Call Set "Mask=%2"
	Call Set "Mask=%%Mask:d=??%%"
	FOR /F "usebackq Skip=%~6 delims=" %%f IN (`2^>nul Dir "%~1%Mask%%~4" /B /A:-D /O:-N`) DO (
		Call :JobDel "%~dp1" "%~nx1" "%~dp1%%f" %5 %3
	)
Exit /B
:JobDel
	Set "NDate=%~nx3"                                                    
	Call Set "NDate=%%NDate:*%~2=%%"
	Call Set "NDate=%%NDate:~%~5%%"
	For %%d In (%~4) Do If "%%d"=="%NDate%" Exit /B
	Del %3 
Exit /B

Пусть дата в разных форматах



Код:

Код: Выделить всё

0123456789	Аргумент	Где_вырезать_день
2019_09_02	"20??_??_%%%%d"	"8,2"
20190902	"20????%%%%d"	"6,2"
Аватара пользователя
c0t0s

Re: CMD/BAT - [решено] Копирование файлов по расписанию

Сообщение c0t0s »

Цитата megaloman:



А причём здесь rar? Вы получаете IWZ_backup_201909020500.bak.rar?

Если у Вас бэкап изначально с именем IWZ_backup_201909020500.bak то rar не сделает Вам IWZ_backup_2019_09_02_0500.bak.rar

Ключ -ag+YYYY_MM_DD допишет дату перед именем, -agYYYY_MM_DD допишет дату перед .rar
CMD/BAT - [решено] Копирование файлов по расписанию




Немного запутался сам. Сейчас буду разбираться. Огромное спасибо Вам за помощь!
Ответить

Вернуться в «Скриптовые языки администрирования Windows»