|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Архивирование и удаление файлов в папке старше n дней |
|
|
CMD/BAT - [решено] Архивирование и удаление файлов в папке старше n дней
|
Новый участник Сообщения: 2 |
Профиль | Отправить PM | Цитировать Добрый день, знаю тем подобных много, пересмотрел разные и что накопал хотелось бы доработать. Пожалуйста посмотрите.
Архивирование: 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). Нашел такой код для удаления пустых папок с исключением: Как изменить код, чтобы удалялись лишние пустые папки со всех уровней кроме структурных? |
|
Отправлено: 17:15, 28-12-2015 |
Старожил Сообщения: 191
|
Профиль | Отправить PM | Цитировать Аналогичная проблема: необходимо обходить подкаталоги с проверкой даты файлов с последующим архивированием с помощью 7z, причем каждый файл архивируется отдельно в каталог расположения файла, где имя архива = имя файла. После выполнения архивирования файл удаляется.
Получаю список файлов помощью кода: но в этом случае в файле получаю первую пустую строку и путь к файлу в кавычках: "D:\temp1\20130830000000.txt" "D:\temp2\20130831000000.txt" и т.д. Поэтому решил попробовать просто передавать в другой исполняемый файл имя файла для архивирования: по описанию в случае выполнения данного кода вызов 1.bat должен происходить такое же количество раз, сколько найдено файлов. Но, во-первых, срабатывает только один раз; во-вторых, не отображает значение @file, хотя 1.bat для проверки состоит из одной строки: Кто подскажет, где ошибка и каким образом еще можно решить проблему? |
------- Отправлено: 10:35, 13-01-2016 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 874
|
Профиль | Отправить PM | Цитировать 1. "@file" и "@path" -- это внутренние переменные утилиты "forfiles.exe", и оперировать ими может только сама эта утилита, поэтому их использование за пределами параметра c ключом "/C" команды "FORFILES" невозможно.
2. А вот использовать значения этих переменных, присваиваемые им в процессе работы утилиты, можно, и для этого не нужно ни создавать файл со списком этих значений, ни использовать дополнительные пакетные файлы: . |
Отправлено: 21:30, 13-01-2016 | #3 |
Старожил Сообщения: 191
|
Профиль | Отправить PM | Цитировать При выполнении скрипта выдает ошибку: "ERROR: No files found with the specified search criteria." .
Хотя файл точно есть, проверял. |
------- Последний раз редактировалось XaHAleX, 14-01-2016 в 14:20. Отправлено: 13:35, 14-01-2016 | #4 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать XaHAleX, файлы не найдены по заданным критериям поиска, ну и попробуйте поставить, например, /d -1.
|
|
Отправлено: 01:28, 15-01-2016 | #5 |
Старожил Сообщения: 191
|
Профиль | Отправить PM | Цитировать Georgio, спасибо, работает! только поменял ключ на удаление: del /q /f
alpap, сорри, недосмотрел. Глупо получилось: проверял скрипт на следующий день, действительно ни один файл уже не попадал в отбор. Окончательная версия кода: |
------- Отправлено: 06:26, 15-01-2016 | #6 |
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать Вот написал такой скрипт, не судите строго, может пригодится кому-то
@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 |
Отправлено: 15:43, 15-01-2016 | #7 |
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать Коллеги, добрый день.
Подскажите, как написать данный скрипт. Нужна написать bat, который будет архивировать дампы БД по маске KoDB*.bak которые старше "today - 7 days" и перемещать их в папку c архивами (из папки D:\BackUpDB файлы которые уже заархивированы - удалить) Путь к папке где лежат дампы - D:\BackUpDB Путь к папке куда переместить заархивированные дампы - D:\Archive Далее из папки D:\Archive копировать в папку D:\Archive\OLD файлы всех архивов 15 и 30 числа каждого месяца. Использовать WinRAR |
Отправлено: 12:05, 30-05-2017 | #8 |
Ветеран Сообщения: 2727
|
Профиль | Отправить PM | Цитировать sindrom_89, Давайте уточним:
1. Надо (ежедневно?) архивировать (с удалением заархивированных) файлы D:\BackUpDB\KoDB*.bak старше 7 дней в папку D:\Archive Вопрос: с каким именем, как оно образуется? Или в один архив (опять же, с каким именем?) ? Периодичность архивации (ежедневно?)? 2. Цитата sindrom_89:
Вот вариант, укажите правильно пути
@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 Архиватор удаляет исходные файлы. |
|
------- Последний раз редактировалось megaloman, 31-05-2017 в 07:54. Отправлено: 21:37, 30-05-2017 | #9 |
Новый участник Сообщения: 2
|
Профиль | Отправить PM | Цитировать megaloman, есть небольшое уточнение
нужно перемещать из папки D:\Archive в папку D:\Archive\OLD только те файлы, у которых в наименовании, после KoDB_2017(год)05(месяц) идет 30 или 15 KoDB_20170530090001 KoDB_20170515090000 Спасибо за интересное решение, очень благодарен! |
Отправлено: 13:29, 31-05-2017 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
2012 R2 - [решено] Удаление файлов старше 100 дней | DJ Mogarych | Windows Server 2012/2012 R2 | 6 | 07-06-2014 02:16 | |
Любой язык - [решено] Удаление файлов старше N дней | DOCznet | Скриптовые языки администрирования Windows | 2 | 27-09-2012 11:42 | |
Любой язык - Удаление файлов старше 5 дней кроме указанного по имени. | Joni | Скриптовые языки администрирования Windows | 6 | 11-07-2012 11:18 | |
VBS/WSH/JS - [решено] Удаление файлов по сети старше 7 дней, оставлять не менее 10 файлов | white155 | Скриптовые языки администрирования Windows | 6 | 04-01-2012 00:42 | |
Прочее - удаление файлов старше 10 дней | admin666 | Общий по Linux | 1 | 23-07-2009 19:09 |
|