PDA

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


c0t0s
30-08-2019, 11:39
Добрый день! Нужна помощь в создании скрипта, который копировал бы файлы созданные 1 и 15 числа каждого месяца из папки "\\10.10.0.1\BackUp\Base1\" в папку "Z:\SQL\Bases1"
Возможно есть вариант удалять промежуточные бэкапы из папки \\10.10.0.1\BackUp\Base1\ , оставляя каждый месяц бэкап 1 числа, 15 числа, и 5 последних. Бэкапы создаются каждый день в формате .rar

megaloman
30-08-2019, 12:16
Бэкапы создаются каждый день в формате .rar » Как именуются бэкапы в "\\10.10.0.1\BackUp\Base1\"? Это смесь бэкапов с разными именами по числам или это бэкапы чего-то одного?
Как ориентироваться на даты? Они как-то фигурируют в именах или надо ориентироваться исключительно на дату последнего изменения?

c0t0s
30-08-2019, 12:37
Как именуются бэкапы в "\\10.10.0.1\BackUp\Base1\"? Это смесь бэкапов с разными именами по числам или это бэкапы чего-то одного? »

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

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

megaloman
30-08-2019, 16:11
@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
30-08-2019, 22:12
Особо не проверял, допилите, если потребуется.

$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
02-09-2019, 15:41
Можно написать несколько строк
Call :JobBack
в зависимости от разных префиксов бэкапов баз (то есть для разных баз)
"01 15" дни месяца копируемых и хранимых бэкапов. Может быть несколько дат, например "01 08 15 22"
5 - число неудаляемых свежих бэкапов. Можете поставить иное число.
Приведенный скрипт можете запускать планировщиком каждый день.
Повторного копирования баз за 01 15 число не будет.
Скрипт будет оставлять все исходные бэкапы за 01 и 15 числа и удалять все остальные, кроме 5 последних. »

Спасибо за помощь, очень полезный скрипт! Я так понимаю, можно добавлять и другие 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
02-09-2019, 16:59
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
02-09-2019, 20:23
Один бэкап делается в таком формате: IWZ_backup_201909020500.bak »
А причём здесь 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@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
03-09-2019, 09:30
А причём здесь 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 »
Немного запутался сам. Сейчас буду разбираться. Огромное спасибо Вам за помощь!




© OSzone.net 2001-2012