Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Копирование файлов бекапов из папок за 1,10,20 число каждого месяца (http://forum.oszone.net/showthread.php?t=331258)

alevakr 16-11-2017 18:24 2778022

Копирование файлов бекапов из папок за 1,10,20 число каждого месяца
 
Доброго времени суток.
Есть папка Backup с подпапками, в которых хрняться бекапы разных баз.
Backup
Dakor
Dakor_backup_2017_11_08_001001_3006760.bak
........
Dakor_backup_2017_10_31_001001_3006760.bak
..........
Xakor
Xakor_backup_2017_11_08_001001_3075033.bak
Xakor_backup_2017_11_07_001001_3075033.bak
Нужно из всех подпапок скопировать в папку Decades все файлы за 10 и 20 число каждого месяца. В папку Months копировать файлы за 01 число каждого месяца. В папках Decades и Months подпапок нету.
После этого во всех подпапках папки Backup оставить файлы только за последние 10 дней.

Кусок с удалением файлов за последние 10 дней нашёл.
Придумал как копировать файлы за 20 число, дальше застрял.
Код:

for /r D:\BBB\Backup %%i in (*_20_*) do (xcopy /e "%%i" "D:\BBB\Decades")

megaloman 17-11-2017 01:03 2778105

Код:

@Echo Off

Call :CopyFile "Z:\Box_In\Backup\Dakor\Dakor_backup_20*.bak" "Z:\Box_Arc\Months" 01
Call :CopyFile "Z:\Box_In\Backup\Dakor\Dakor_backup_20*.bak" "Z:\Box_Arc\Decades" 10
Call :CopyFile "Z:\Box_In\Backup\Dakor\Dakor_backup_20*.bak" "Z:\Box_Arc\Decades" 20

Call :CopyFile "Z:\Box_In\Backup\Xakor\Xakor_backup_20*.bak" "Z:\Box_Arc\Months" 01
Call :CopyFile "Z:\Box_In\Backup\Xakor\Xakor_backup_20*.bak" "Z:\Box_Arc\Decades" 10
Call :CopyFile "Z:\Box_In\Backup\Xakor\Xakor_backup_20*.bak" "Z:\Box_Arc\Decades" 20

Call :DelFile "Z:\Box_In\Backup\Dakor\Dakor_backup_20*.bak" 10
Call :DelFile "Z:\Box_In\Backup\Xakor\Xakor_backup_20*.bak" 10

GoTo :Eof

:CopyFile
        FOR %%f IN ("%~1") DO (
                FOR /F "tokens=5 delims=_" %%d IN ("%%~nxf") DO (
                        If %3==%%d  If Not Exist "%2\%%~nxf" Copy "%%f" "%2\" >nul
                )
        )
GoTo :Eof

:DelFile
        FOR /F "usebackq skip=%2 delims=" %%f IN (`dir "%~1" /b /A:-D /O:-N 2^>nul`) DO Del "%~dp1%%f"
GoTo :Eof

Сопируем файлы по указанным маскам за указанные дни в указанное место. Дни выделяем из имени.
Удаляем все файлы по указанной маске, кроме указанного числа самых "свежих". "Свежесть" определяем по имени файла.

alpap 17-11-2017 02:17 2778110

Код:

@echo off
set "Backup=D:\Backup"
set "Months=C:\Months"
set "Decades=C:\Decades"
set "c1=01"& set "c10=10"& set "c20=20"
set "exp=bak"
set "dd=10"

pushd "%Backup%"
 for /f "tokens=1-5* delims=_" %%a in ('2^>nul dir /a-d/b/s "*.%exp%"') do (
  echo %%e|>nul findstr /x /c:"%c1%" && ((if not exist "%Months%" md "%Months%")& >nul copy "%%a_%%b_%%c_%%d_%%e_%%f" "%Months%")
  echo %%e|>nul findstr /x /c:"%c10%" /c:"%c20%" && ((if not exist "%Decades%" md "%Decades%")& >nul copy "%%a_%%b_%%c_%%d_%%e_%%f" "%Decades%")
 )
 for /f "delims=" %%A in ('dir /ad/b') do (
  pushd "%%A"
  for /f "delims=" %%a in ('dir /a-d/b/o-n "*.%exp%"^|more +%dd%') do del "%%a"
  popd
 )
popd
pause


megaloman 17-11-2017 03:23 2778113

У alpap подсмотрел вариант, что возможно в папке Backup есть несколько подпапок, не обязательно только 2, указанные в вопросе, в которых имеются бэкапы, имена которых соответствуют приведенным в вопросе правилам. Тогда вот еще вариант:
Код:

@Echo Off

Set "BoxIn=Z:\Box_In\Backup"
Set "BoxOut=Z:\Box_Arc"

FOR /F "usebackq delims=" %%i IN (`dir "%BoxIn%" /b /A:D 2^>nul`) DO Call :Folders "%BoxIn%" "%%i" "%BoxOut%"

GoTo :Eof

:Folders
        Call :CopyFile "%~1\%~2\%~2_backup_20*.bak" "%~3\Months" 01
        Call :CopyFile "%~1\%~2\%~2_backup_20*.bak" "%~3\Decades" 10
        Call :CopyFile "%~1\%~2\%~2_backup_20*.bak" "%~3\Decades" 20
        Call  :DelFile "%~1\%~2\%~2_backup_20*.bak" 10
GoTo :Eof

:CopyFile
        FOR %%f IN ("%~1") DO (
                FOR /F "tokens=5 delims=_" %%d IN ("%%~nxf") DO (
                        If %3==%%d If Not Exist "%2\%%~nxf" Copy "%%f" "%2\" >nul
                )
        )
GoTo :Eof

:DelFile
        FOR /F "usebackq skip=%2 delims=" %%f IN (`dir "%~1" /b /A:-D /O:-N 2^>nul`) DO Del "%~dp1%%f"
GoTo :Eof

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

alevakr 17-11-2017 10:52 2778153

Спасибо. Да, в папке Backup может быть произвольное количество подпапок.


Время: 09:09.

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