Показать полную графическую версию : [решено] Архивирование и удаление файлов в папке старше n дней
ryoryoryo
28-12-2015, 17:15
Добрый день, знаю тем подобных много, пересмотрел разные и что накопал хотелось бы доработать. Пожалуйста посмотрите.
Архивирование:
Set Gde1=D:\тест
Set Gde2=D:\тест2
Set Gde3=D:\тест3
Set Kuda=D:\тест1
Set TDate=%date:~6,4%"."%date:~3,2%"."%date:~0,2%
"%programfiles%\WinRar\Winrar.exe" a -r -ed -m1 -df -to7d %Kuda%\%TDate%_почта.rar %Gde1%\*.*
"%programfiles%\WinRar\Winrar.exe" a -r -ed -m1 -df -to7d %Kuda%\%TDate%_сканы.rar %Gde2%\*.*
"%programfiles%\WinRar\Winrar.exe" a -r -ed -m1 -df -to7d %Kuda%\%TDate%_загрузки.rar %Gde3%\*.*
Так как есть папки сканов и загрузок их тоже архивируем. Все работает, вопрос только грамотно ли я оформил этот скрипт, в смысле каждая переменная для каждой архивируемой папки?
Папка "Почта" в общем доступе, нужны какие то манипуляции для удачного удаления и архивирования, если вдруг кто то открыл файлы?
Архиватор не удаляет в "Почте" папки структуры(D:\Почта\Отдел(Экономический, Юридический и тд.)\In(Out)), как и все остальные (ключ -ed).
Нашел такой код для удаления пустых папок с исключением:
Set Folder=D:\тест
Set NoFolDel=D:\тест\Бухгалтерия\In
Cd /D "%NoFolDel%"
FOR /F "tokens=*" %%f IN ('Dir "%Folder%\*.*" /B /S /A:D 2^>nul^|Sort /R') DO Rd "%%f" 2>nul
Как изменить код, чтобы удалялись лишние пустые папки со всех уровней кроме структурных?
Аналогичная проблема: необходимо обходить подкаталоги с проверкой даты файлов с последующим архивированием с помощью 7z, причем каждый файл архивируется отдельно в каталог расположения файла, где имя архива = имя файла. После выполнения архивирования файл удаляется.
Получаю список файлов помощью кода:
forfiles /p D:\ /s /m *.txt /d -180 /C "cmd /c echo @path">d:\temp\arh_file.txt
но в этом случае в файле получаю первую пустую строку и путь к файлу в кавычках:
"D:\temp1\20130830000000.txt"
"D:\temp2\20130831000000.txt"
и т.д.
Поэтому решил попробовать просто передавать в другой исполняемый файл имя файла для архивирования:
forfiles /p D:\ /s /m *.txt /d -180 /C "cmd /c D:\temt\1.bat @file"
по описанию в случае выполнения данного кода вызов 1.bat должен происходить такое же количество раз, сколько найдено файлов. Но, во-первых, срабатывает только один раз; во-вторых, не отображает значение @file, хотя 1.bat для проверки состоит из одной строки:
echo @file
Кто подскажет, где ошибка и каким образом еще можно решить проблему?
1. "@file" и "@path" -- это внутренние переменные утилиты "forfiles.exe", и оперировать ими может только сама эта утилита, поэтому их использование за пределами параметра c ключом "/C" команды "FORFILES" невозможно.
2. А вот использовать значения этих переменных, присваиваемые им в процессе работы утилиты, можно, и для этого не нужно ни создавать файл со списком этих значений, ни использовать дополнительные пакетные файлы:
@echo off
for /f "delims=" %%i in ('
forfiles /p D:\ /s /m *.txt /d -180 /c "cmd /c echo @path"
') do (
"%ProgramFiles%\7-Zip\7z.exe" a "%%~dpni.7z" %%i
del /a /f %%i
)
.
При выполнении скрипта выдает ошибку: "ERROR: No files found with the specified search criteria." :cry: :dont-know.
Хотя файл точно есть, проверял.
XaHAleX, файлы не найдены по заданным критериям поиска, ну и попробуйте поставить, например, /d -1.
Georgio, спасибо, работает! только поменял ключ на удаление: del /q /f
alpap, сорри, недосмотрел. Глупо получилось: проверял скрипт на следующий день, действительно ни один файл уже не попадал в отбор.
Окончательная версия кода:
@echo off
for /f "delims=" %%i in ('forfiles /p D:\ /s /m *.txt /d -180 /c "cmd /c echo @path"') do (
"%ProgramFiles%\7-Zip\7z.exe" a "%%~dpni.zip" %%i
echo %date% %time% Arhiv "%%i" >> d:\temp\arh_files.txt
del /q /f %%i
echo %date% %time% Erase "%%i" >> d:\temp\arh_files.txt
)
ryoryoryo
15-01-2016, 15:43
Вот написал такой скрипт, не судите строго, может пригодится кому-то
@echo off
rem *************************************************************************************
rem ****Переменные**** *
rem *************************************************************************************
rem Папка в которую складываются архивы
Set Kuda="D:\Program Files\Trash"
rem Файл-список в котором записаны названия папок для бекапа и удаления старых файлов
set List="D:\Program Files\Batch\bak.lst"
rem Если архив с текущей датой существует - отмена бекапа
::If Exist загрузки_%Date%.rar GoTo End
Echo.
Echo #*******************************#
Echo * Бэкап начнется через 10 сек. *
Echo *-------------------------------*
Echo * Запуск - нажми 1 *
Echo * Отмена - нажми 2 *
Echo #*******************************#
Echo.
rem При запуске скрипта есть выбор, автоматически через 10 секунд запустится архивация.
Choice /c 12 /t 10 /d 1
rem Переменные ErrorLevel определяют выбор пользователя или по истечению 10 сек. запускается бекап
If Errorlevel 2 Goto :Cancel
If Errorlevel 1 Goto :Start
Goto End
:Start
rem *************************************************************************************
rem ****WinRAR**** архивация *
rem A Добавить файлы в архив *
rem -r Включить в обработку вложенные папки *
rem -ed Не добавлять пустые папки *
rem -ep1 Исключить базовую папку из имён *
rem -ibck Запустить WinRAR как фоновый процесс в области уведомлений (системном лотке) *
rem -m<n> Метод сжатия *
rem -df Удалить файлы после архивации *
rem -to<время> Обрабатывать файлы более старые, чем указанный период времени *
rem -ilog[имя] Записывать протокол ошибок в файл *
rem -log[формат][=имя] Записать имена в файл-протокол *
rem ^ перенос строк *
rem *************************************************************************************
Echo Архивируется...
"%programfiles%\WinRar\Winrar.exe" a -r -ed -ep1 -ibck ^
-ilog%Kuda%\%date%_backup.log -logf=%Kuda%\%date%_backup.txt ^
-m1 -df -to5h %Kuda%\%date%_backup.rar @%List%
rem Проверка архивации, если 0, то готово, если не 0, то ошибка
if errorlevel = 0 (Echo Архивация завершена!) ELSE (Echo Ошибка!)
rem Код ошибки, если нужна информация
Echo %ErrorLevel%
rem Отчет добавляем в архив
If exist %Kuda%\%date%_backup.txt "%programfiles%\WinRar\Winrar.exe" a ^
-ep -ibck -df -m1 %Kuda%\%date%_backup.rar %Kuda%\%date%_backup.txt
if errorlevel = 0 (echo Отчет внутри архива!) Else (echo Отчета нет!)
rem *************************************************************************************
rem ****Циклическая проверка запущен ли WinRar.exe**** *
rem Если запущен - повторяется проверка, если нет - начинается очистка пустых папок *
rem *************************************************************************************
:checker
tasklist /FI "IMAGENAME eq winrar.exe" /NH | findstr /i "winrar.exe">nul
if %errorLevel% == 0 goto :checker
echo Вин рар завершил работу
rem *************************************************************************************
rem ****Удаление пустых папок из списка bak.lst**** *
rem Если в файл-списке записана папка из нее удаляются все пустые папки и подпапки *
rem *************************************************************************************
rem Переключение кодировки в ANSI 1251 для распознавания русских названий папок.
rem 1>nul это скрытие вывода в консоли информации о переключении кодировки.
1>nul chcp 1251
goto start
:fn1
rem Для правильного отображения переключаем кодировку обратно.
1>nul chcp 866
for /d %%i in ("%~1\*") do (
call :fn1 "%%i"
rd /q "%%i"
)
exit /b
:start
rem Функция отбора папок в файл-списке.
FOR /F "usebackq delims=" %%a in (%List%) do call :fn1 %%a
rem удаление архивов старше 30 дней
FORFILES /p %Kuda% /S /D -30 /C "cmd /c del @path /f /q"
GoTo End
:Cancel
echo Отмена.
goto end
Файл bak.lst содержит названия папок для бэкапа. Более подробно описано в справке winrar (только берите винрар от 5-ой версии, там есть лог)
sindrom_89
30-05-2017, 12:05
Коллеги, добрый день.
Подскажите, как написать данный скрипт.
Нужна написать bat, который будет архивировать дампы БД по маске KoDB*.bak которые старше "today - 7 days" и перемещать их в папку c архивами (из папки D:\BackUpDB файлы которые уже заархивированы - удалить)
Путь к папке где лежат дампы - D:\BackUpDB
Путь к папке куда переместить заархивированные дампы - D:\Archive
Далее из папки D:\Archive копировать в папку D:\Archive\OLD файлы всех архивов 15 и 30 числа каждого месяца.
Использовать WinRAR
megaloman
30-05-2017, 21:37
sindrom_89, Давайте уточним:
1. Надо (ежедневно?) архивировать (с удалением заархивированных) файлы D:\BackUpDB\KoDB*.bak старше 7 дней в папку D:\Archive
Вопрос: с каким именем, как оно образуется? Или в один архив (опять же, с каким именем?) ? Периодичность архивации (ежедневно?)?
2. папки D:\Archive копировать в папку D:\Archive\OLD файлы всех архивов 15 и 30 числа каждого месяца »Логика вопроса требует не копировать, а перемещать. Да и 30 февраля выглядит как-то одиозно. Может быть 1-го и 15?@Echo Off
cls
:В системе дата должна быть в формате ДД.ММ.ГГГГ
Set "BoxIn=Z:\Box_In"
Set "Mask=KoDB*.bak"
Set "BoxOut=Z:\Box_Out"
Set "BoxArc=Z:\Box_Out\Old"
Set /A ND1=1
Set /A ND2=15
Set /A DOld=7
Set "Arc="C:\Program Files\WinRAR\WinRar.exe" a -ep -to%DOld%d -df"
Set "DD=%Date:~0,2%"
Set "MM=%Date:~3,2%"
Set "YYYY=%Date:~6,4%"
Set /A ND=1%DD%-100
Set /A DD1=%ND1%+100
Set "DD1=%DD1:~-2%"
Set /A DD2=%ND2%+100
Set "DD2=%DD2:~-2%"
If %ND1% LEQ %ND% If %ND% LSS %ND2% Set "NameDir=%YYYY%%MM%%DD1%"
If %ND% GEQ %ND2% Set "NameDir=%YYYY%%MM%%DD2%"
If Not Exist "%BoxArc%\%NameDir%\*.*" (
Md "%BoxArc%\%NameDir%"
Move /Y "%BoxOut%\*.*" "%BoxArc%\%NameDir%\" >nul
)
%Arc% "%BoxOut%\%YYYY%%MM%%DD%.rar" "%BoxIn%\%Mask%"
GoTo :Eof
Как это работает:
Лучше всего батник поместить в планировщик и выполнять каждый день (хотя можно и чаще, можно и реже)
До начала архивации в батнике анализируется день в дате.
Если день, допустим, 1<=ДД<15, или ДД>=15 и нет папки соответственно BoxArc\ГГГГММ01 или BoxArc\ГГГГММ15, то эта папка создаётся и всё содержимое папки BoxOut переносится туда.
Далее архивируются файлы из папки BoxIn по указанной маске старше указанного количества дней в папку BoxOut под именем ГГГГММДД.rar Архиватор удаляет исходные файлы.
sindrom_89
31-05-2017, 13:29
megaloman, есть небольшое уточнение
нужно перемещать из папки D:\Archive в папку D:\Archive\OLD только те файлы, у которых в наименовании, после KoDB_2017(год)05(месяц) идет 30 или 15
KoDB_20170530090001
KoDB_20170515090000
Спасибо за интересное решение, очень благодарен!
megaloman
31-05-2017, 18:22
sindrom_89, Спасибо за интересное решение, очень благодарен! » Пожалуйста, но оно не оказалось для Вас полезным.
Опять начинаем с постановки задачи, которую Вы изложили и к которой есть вопросы:
Нужно написать bat, который будет архивировать дампы БД по маске KoDB*.bak которые старше "today - 7 days" Откуда берётся дата файла? Из свойств файла или она содержится в имени? Что Вы хотите, чтобы каждый файл по маске архивировался отдельно и имя архива совпало с именем файла ? Подробнее сообщите формат имени файла. Подозреваю, что каждый файл с именем типа:
KoDB_ГГГГММДДхххххх.bak должен заархивироваться в файл KoDB_ГГГГММДДхххххх.rar или KoDB_ГГГГММДДхххххх.bak.rar. Это так?
Иначе откуда возьмутся заархивированные файлы в папке D:\Archive с именем KoDB_20170530090001 или KoDB_20170515090000?
Добрый день. Подскажите плиииз.
С копированием я разобрался:
xcopy \\192.168.100.100\name\name2\name.bak D:\name /f /y
Как мне заставить архивироваться уже скопированный файл name.bak в папку D:\name с дальнейшим удалением исходного name.bak ??
7z a D:\name.zip name.bak -sdel
А путь к 7z прописывать не нужно? И путь у меня D:\name\name.bak, а архивировать я хочу сам файл в папке а не всю папку.
не правильнее было бы
7z a D:\name\name.zip name.bak -sdel
А путь к 7z прописывать не нужно? »
Если у Вас путь к исполняемому файлу 7z.exe/7za.exe содержится в PATH — то не нужно. Если не содержится — то нужно.
И путь у меня D:\name\name.bak, а архивировать я хочу сам файл в папке а не всю папку.
не правильнее было бы
7z a D:\name\name.zip name.bak -sdel »
Рекомендуется а) более чётко ставить техзадание изначально и б) ознакомиться с документацией 7-Zip. И тогда можно уже будет задавать конкретные вопросы: «мои исходные условия такие-то, я попробовал сделать вот так, получил вот то-то и то-то, а мне нужно вот то-то и то-то».
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.