» » Очистка папки файлового обмена от старых файлов

Очистка папки файлового обмена от старых файлов

Недавно мною был создан скрипт для очистки сетевой папки, предназначенной для обмена файлами (далее по тексту - файлообменник) и, чтобы не забыть свои творческие поиски, решил написать эту заметку. Возможно, Вам также пригодится статья «Запрет сохранения файлов по маске и квотирование папок», которая по своему смысловому содержанию близка к выполняемой задаче.

Предыстория.

Руководством нашего заведения передо мной была поставлена задача по периодической очистке файлообменника от файлов старше трех дней.

Файлообменник с определенными правами доступа для пользователей локальной сети расположен на сервере Windows Server Standard 2008.

Решение.

Для очистки файлов было принято решение воспользоваться стандартной для Windows Server Standard 2008 программой «forfiles» и командным файлом. Скрипт должен просканировать каждую вложенную папку файлообменника, найти по дате создания файлы старше трех дней и удалить их.

Определяем структуру папок файлообменника. Предположим, файлообменник находится на сервере по пути d:\obmen. В системной консоли выполняем команды:

chcp 866 && dir /B d:\obmen > d:\obmen-866.txt
chcp 1251 && dir /B d:\obmen > d:\obmen-1251.txt


В корневом каталоге диска D:\ появятся файлы: obmen-866.txt и obmen-1251.txt со структурой папок. В связи с тем, что консоль работает в кодировке DOS (OEM-866), для работы командного файла будет нужен файл obmen-866.txt. Второй файл - obmen-1251.txt в кодировке 1251 пригодится в дальнейшем для более удобной правки структуры папок файлообменника.

Из файла obmen-866.txt скрипт будет считывать необходимые для работы имена папок. Для правильной работы скрипта каждая строка файла obmen-866.txt должна быть обрамлена парными кавычками.

Для того, чтобы автоматизировать эту работу, выполняем следующее:

1. В notepad++ открываем список;
2. Выполняем поиск (ctrl + F), вкладка "Заменить";
3. Выбираем режим поиска – Расширенный;
4. В поле найти вводим: \r\n, в поле заменить на вводим: "\r\n"
5. Нажимам кнопку "Заменить все".
6. Ставим одну кавычку в самом начале списка, и удаляем в самом конце.

Итак, файл obmen-866.txt в нужном для работы скрипта формате подготовлен. Осталось написать сам скрипт. Если Вы посмотрите раздел моего сайта Скрипты (BAT, CMD), то увидите, что большинство скриптов базируются на стандартной заготовке, позволяющей работать в цикле с переменными. В очередной раз воспользуюсь этим способом.

Итак, сам скрипт, назовем его, например, clean_obmen.bat:

rem Clean folder Obmen
@echo off
rem chcp 866 >NUL меняет кодировку шрифта консоли
chcp 866 >NUL
rem cd /D "%~dp0" меняет активную папку на путь запуска bat-файла
cd /D "%~dp0"
set listfile=obmen_866.txt
for /f "usebackq delims=" %%i in (%listfile%) do call :procedure %%i
exit
:procedure
rem Color 0B меняет цвет шрифта консоли на светло-голубой
Color 0B
@echo ===========================================
@echo %~1
@echo Deleting files in the folder %~1 3 days old
@echo ===========================================
forfiles.exe /p "D:\Obmen\%~1" /s /m *.* /d -3 /c "cmd /c if @isdir==FALSE del /q /f @file"
exit /b


Хотелось бы обратить внимание на следующее:

Строка: cd /D "%~dp0" меняет активную папку на путь запуска скрипта. Без этой строки скрипт не запуститься в Планировщике, так как не будет находить файл скрипта.

Цикл организован в этой строке:

for /f "usebackq delims=" %%i in (%listfile%) do call :procedure %%i

Командой FOR задается список команд, которые выполняются с каждым элементом набора.

Набор пишется внутри IN (...)

Список команд пишется внутри DO (...)

Командная строка выполняет эти команды раз за разом, при этом текущий элемент набора находится в переменной, заданной после %% .

Здесь используется команда FOR с ключом /F для построчного разбора файла obmen-866.txt.

Строкой считается любая последовательность символов, если она не содержит знаков маски * или ?.

UseBackQ (Use back quotes) означает, что набор с двойными кавычками.

delims= означает, что в переменную %%i будет записана вся строка (без разделения по пробелу или знаку табуляции, т.к. стандартный разделитель заменен на NULL (пустой символ).

И, наконец, в теле процедуры строка:

forfiles.exe /p "D:\Obmen\%~1" /s /m *.* /d -3 /c "cmd /c if @isdir==FALSE del /q /f @file"

выполняет удаление файлов старше трех дней.

Используется команда forfiles. Где:

/p "D:\Obmen\%~1" – путь к папке.

%~1 – строка из файла obmen-866.txt. Причем, чтобы не выводились сами кавычки "" мы используем модификатор ~ (тильда).

/s – просмотр поддиректорий;

/m *.* - шаблон для поиска всех файлов;

/d -3 – поиск файлов с датой изменения старше трех дней;

/c – выполнение команды;

"cmd /c if @isdir==FALSE del /q /f @file" – команда;

if @isdir==FALSE – если не директория, то есть искать только файлы;

del /q /f @file – удалить найденные файлы.

Для более подробного ознакомления с ключами команды можно выполнить в командной строке forfiles /?.

Итак, командный файл создан. Осталось его добавить в Планировщик и проверить работу.
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.

комментариев