Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Архивирование и удаление файлов в папке старше n дней

Ответить
Настройки темы
CMD/BAT - [решено] Архивирование и удаление файлов в папке старше n дней

Новый участник


Сообщения: 2
Благодарности: 1

Профиль | Отправить 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).
Нашел такой код для удаления пустых папок с исключением:
Код: Выделить весь код
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
Как изменить код, чтобы удалялись лишние пустые папки со всех уровней кроме структурных?

Отправлено: 17:15, 28-12-2015

 

Аватара для XaHAleX

Старожил


Сообщения: 191
Благодарности: 19

Профиль | Отправить PM | Цитировать


Аналогичная проблема: необходимо обходить подкаталоги с проверкой даты файлов с последующим архивированием с помощью 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
Кто подскажет, где ошибка и каким образом еще можно решить проблему?

-------
Спасибо - много, бутылки хватит!!!


Отправлено: 10:35, 13-01-2016 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


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
)
.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:30, 13-01-2016 | #3


Аватара для XaHAleX

Старожил


Сообщения: 191
Благодарности: 19

Профиль | Отправить PM | Цитировать


При выполнении скрипта выдает ошибку: "ERROR: No files found with the specified search criteria." .
Хотя файл точно есть, проверял.

-------
Спасибо - много, бутылки хватит!!!


Последний раз редактировалось XaHAleX, 14-01-2016 в 14:20.


Отправлено: 13:35, 14-01-2016 | #4


Ветеран


Сообщения: 1274
Благодарности: 564

Профиль | Отправить PM | Цитировать


XaHAleX, файлы не найдены по заданным критериям поиска, ну и попробуйте поставить, например, /d -1.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:28, 15-01-2016 | #5


Аватара для XaHAleX

Старожил


Сообщения: 191
Благодарности: 19

Профиль | Отправить PM | Цитировать


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
)

-------
Спасибо - много, бутылки хватит!!!


Отправлено: 06:26, 15-01-2016 | #6


Новый участник


Сообщения: 2
Благодарности: 1

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar Batch.rar
(1.8 Kb, 99 просмотров)

Вот написал такой скрипт, не судите строго, может пригодится кому-то
Код: Выделить весь код
@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-ой версии, там есть лог)
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:43, 15-01-2016 | #7


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить 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


Ветеран


Contributor


Сообщения: 2703
Благодарности: 1683

Профиль | Отправить PM | Цитировать


sindrom_89, Давайте уточним:
1. Надо (ежедневно?) архивировать (с удалением заархивированных) файлы D:\BackUpDB\KoDB*.bak старше 7 дней в папку D:\Archive
Вопрос: с каким именем, как оно образуется? Или в один архив (опять же, с каким именем?) ? Периодичность архивации (ежедневно?)?
2.
Цитата sindrom_89:
папки 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 Архиватор удаляет исходные файлы.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 31-05-2017 в 07:54.


Отправлено: 21:37, 30-05-2017 | #9


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


megaloman, есть небольшое уточнение

нужно перемещать из папки D:\Archive в папку D:\Archive\OLD только те файлы, у которых в наименовании, после KoDB_2017(год)05(месяц) идет 30 или 15
KoDB_20170530090001
KoDB_20170515090000

Спасибо за интересное решение, очень благодарен!

Отправлено: 13:29, 31-05-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Архивирование и удаление файлов в папке старше n дней

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход