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

c0t0s 30-08-2019 11:39 2885998

Копирование файлов по расписанию
 
Добрый день! Нужна помощь в создании скрипта, который копировал бы файлы созданные 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 2886009

Цитата:

Цитата c0t0s
Бэкапы создаются каждый день в формате .rar »

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

c0t0s 30-08-2019 12:37 2886013

Цитата:

Цитата megaloman
Как именуются бэкапы в "\\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 2886035

Код:

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

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

Код:

$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 2886366

Цитата:

Цитата megaloman
Можно написать несколько строк
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 2886379

Цитата:

Цитата 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 02-09-2019 20:23 2886411

Цитата:

Цитата c0t0s
Один бэкап делается в таком формате: 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 2886441

Цитата:

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

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


Время: 22:35.

Время: 22:35.
© OSzone.net 2001-