![]() |
Помощь с написанием Bat. Перемещение и удаление файлов и папок старше N дней.
Подскажите пожалуйста, как реализовать следующую задачу:
Есть сетевое хранилище. В нем куча папок. В данный момент интересуют 5 из них. 4 папки используются для сканов с мфу, то есть пользователь отсканил документ, мфу его положил в свою папку(файлы могут быть как pdf так и jpg, все зависит от того как настроили при сканировании) В этих 4-х папка не должны оставаться файлы старше 3-х дней. Отсканировал-забрал, не забрал файл удалился. Нужно, чтоб планировщик запускал bat файл который, из указанной папки все файлы старше трех дней переносил в другую папку, затем из этой "другой папки" удалял все файлы старше 20 дней. При этом в папке могут быть созданы не только файлы с изображениями, так же там могу создать и папку, которую в свою очередь тоже нужно сначала переместить а уже потом удалить с теме же временными рамками что и у файлов. Для этого был написан вот такой батник: FORFILES /p "W:\Scan_Buh" /S /D -3 /C "cmd /c move @path "W:\EverybodyOld\Scan_Buh\"" :: Переносим все файлы и папки старше 3-х дней из папки Scan_Buh в папку EverybodyOld\Scan_Buh\ FORFILES /p "W:\EverybodyOld\Scan_Buh" /S /D -20 /C "cmd /c del @path /f /q" :: Удаляем все файлы старше 20-и дней из папки Scan_Buh FORFILES /p "W:\EverybodyOld\Scan_Buh" /S /C "cmd /c rd @path" :: Удаляем все пустые папки FORFILES /p "W:\Scan_Manager" /S /D -3 /C "cmd /c move @path "W:\EverybodyOld\Scan_Manager\"" :: Переносим все файлы и папки старше 3-дней из папки Scan_Manager в папку EverybodyOld\Scan_Manager\ FORFILES /p "W:\EverybodyOld\Scan_Manager" /S /D -20 /C "cmd /c del @path /f /q" :: Удаляем все файлы старше 20-и дней из папки Scan_Manager FORFILES /p "W:\EverybodyOld\Scan_Manager" /S /C "cmd /c rd @path" :: Удаляем все пустые папки Аналогично для остальных двух папок, меняется только путь к ним. Сейчас добавилась еще одна папка. В ней идет обмен документами, а так же несколько папок с которыми работают все. Тут может быть куча самых различных фалов, папок, подпапок... Из этой папке так же нужно перемещать все файлы\папки старше n дней в другую папку, затем по истечение n дней удалять из другой папки. НО есть несколько папок (в них соответственно файлы) которые трогать не нужно. К примеру есть w:\test в ней еще папки 1,2,3,4,5,6, и просто фалы лежащие в корне(кол-во файлов и папок может быть какое угодно и с каким угодно расширением), нужно чтоб всё что старше n дней переместилось в w:\arhiv\test кроме папки и всего содержимого в папка 2, 4,5 эти папки просто должны пропускаться (у них есть имя которое не изменяется, ведется работа только внутри этих папок) а потом уже из папки w:\arhiv\test так же все что старше 20 дней удалялось и файлы и папки в том числе. Как сделать исключение по названию папки? Чтоб при том же перемещении на определенную папку просто не обращалось внимания. У Forfiles есть ключ /м но это маска с которой он работает и не исключает. Все это на автомате, без каких либо запросов и ввода доп информации, задание ночью отработало и всё. Помогите разобраться и дополнить батник, а возможно и переделать совсем и оптимизировать. |
Stanley5, У Вас целый роман при описании постановки задачи :)
Цитата:
Вот код
Код:
@Echo Off Здесь некоторые пояснения
Процедура архивации Call :Arc_Copy вызывается для каждой архивируемой папки.
Её аргументы описаны. При наличии исключений в аргументах этой процедуры указывается имя процедуры, где формируется текстовый файл для конкретного случая с перечислением полных имён папок (файлов) исключений. В примере это процедуры No_JS_Host и No_test |
Цитата:
Спасибо за код, буду пробовать. Есть еще один вопрос с исключениями. Цитата:
FORFILES /p "W:\Test" /S /C "cmd /c if not @path==\"W:\Test\123\" echo @path" Не подскажете как именно тут полностью исключить 123 вместе с подкаталогами? Если убрать ключ /S то будет выведен список только из корня папки Test(все кроме 123) но подпапки уже не покажет, а с ключиком показывает все что и в папке 123, файлы там могут быть совершенно разные, как полностью исключить папку? вместе с содержимым? Пример с /S
FORFILES /p "W:\Test" /S /C "cmd /c if not @path==\"W:\Test\123\" echo @path"
"W:\Test\Новая папка" "W:\Test\Лист Microsoft Excel.xlsx" "W:\Test\папка" "W:\Test\Новая папка (2)" "W:\Test\Новая папка\Новая папка" "W:\Test\123\Лист Microsoft Excel.xlsx" "W:\Test\Новая папка (2)\Лист Microsoft Excel.xlsx" Буз /S
FORFILES /p "W:\Test" /C "cmd /c if not @path==\"W:\Test\123\" echo @path"
"W:\Test\Новая папка" "W:\Test\Лист Microsoft Excel.xlsx" "W:\Test\папка" "W:\Test\Новая папка (2)" |
Код:
@Echo Off Код:
@Echo Off Код:
@Echo Off |
Спасибо!!!
|
Добрый день.
Не подскажете, пожалуйста, как в команде перемещения файлов из одной директории в другую (самая первая команда автора), так же указать исключения. Дело в том, что помимо перемещения файлов старше 3-х дней так же требуется оставить пару системных файлов в директории. Некоторые из них без расширения. |
Shurik006,
например составляете список (list.txt) с именами файлов что надо оставить в покое, а остальные пускаете в работу Код:
@echo off |
alpap,
Правильно понимаю, что вы предоставили скрипт только исключения? (т.е. в примере нет самой команды копирования) В исключение попадёт papka и всё, что перечислено в текст. документе? В команде forfiles указать исключения невозможно? :) Почему спрашиваю. Дело в том, что FORFILES имеет возможно удалять файлы старше n дней, а xcopy нет, соот-но не понятно, как теперь это всё совместить. Спасибо за то, что отозвались. |
Цитата:
Код:
@echo off Код:
@echo off |
alpap,
Спасибо Вам. Не сочтите за грубость, просто решение необходимо было довольно оперативно, включил всё своё 'скриптовое обаяние', которое смог. Поэтому пока ожидал от вас ответа, рассмотрел robocopy. Да и новичку он проще в понимании. Необходимые файлы сделал скрытыми, а в команде указал соответствующее исключение. Получилось так Код:
robocopy /move /xa:h /minage:3 "D:\old" "D:\new" В чистом виде переноса /move (без доп. условий) она моментально переносит большие файлы с диска на диск (=проводниковое вырезать/вставить). Как только начинаешь указывать момент со скрытыми файлами и датой (т.е. доп. условия), в командной строке сразу же видно, что бегут проценты выполнения. Т.е. она сначала копирует, затем удаляет и эта операция происходит дольше. Сначала попробовал исключить необходимые файлы посредством установки атрибутов чтения и условия /ia:rs, но команда копирует только их, а всё остальное оставляет. Совсем не понял, где я не прав? :) Благодарю. |
Цитата:
2. И с раздела на раздел перенос больших файлов никак не может работать быстро (если только у Вас не SSD или «большие файлы» в реальности легко помещаются целиком в кэш накопителя). Цитата:
|
Цитата:
Цитата:
Цитата:
- Утром деньги, вечером стулья - А можно наоборот? - Можно, но деньги вперед! :) |
Цитата:
Цитата:
Цитата:
Значит навыдумывал зачем-то :) |
YuS_2, разве речь не про исключение файлов шла?
|
Цитата:
Т.е. человек начал отталкиваться от этого: Цитата:
Никакими ключами этот алгоритм изменить невозможно. Ну, т.е. получить чистый move, даже в пределах одного диска, не получится, именно copy, а затем delete. Просто уточнил. |
Цитата:
|
Цитата:
Физический перенос данных в пределах одного диска не осуществляется, при выполнении операции move, а в утилите просто вводит в заблуждение схожий по названию ключ... это и имелось в виду. Если заняться подробным описанием принципа работы файловой системы (как осуществляется перенос файлов в пределах одного диска, на разные диски, копирование, удаление, MFT таблицы и т.д.), это в пару строк не уместится, потому и не стал даже пытаться... ну, а если вдруг кому-то интересно, в интернете же можно поискать и почитать. Добавлено: Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Время: 19:41. |
Время: 19:41.
© OSzone.net 2001-