![]() |
Перенос файлов старше N дней
Доброго времени суток!
Накидал скрипт из пары строк, который должен пройтись по папки и если к файлу последний раз обращались больше чем N дней, он переносится в др папку, но скрипт не работает не поминая почему... Если указывать сравнение "ge", то он начинает всё(!) переносить, если "le" (по идее то что мне и надо), вообще ничего не происходит. Подскажите пожалуйста в чём ошибся? Код:
cls |
А вывод, что показывает?
Get-ChildItem $path | Format-Table lastaccess*,name -Auto И за одно посмотреть, не отключено ли обновление данного атрибута(вроде начиная с Vista отключено по умолчанию): fsutil behavior query DisableLastAccess |
Вывод Вашей команды:
Цитата:
Подскажите пожалуйста как это побороть? |
Move-Item -Destination {md $_.DirectoryName.Replace("$path","$dest") -force}
|
Большое спасибо!!
Как раз то что надо. Можете подсказать, у сего действия имеется какой-то ограниченный уровень вложенности? Сейчас попробовал, и получил не мало подобных ошибок: Цитата:
|
Да, он выдает ошибки на папки, поэтому исключите их.
where { $_.LastAccessTime -le ((Get-Date).AddDays(-5)) -and !$_.PsIsContainer} |
Цитата:
Просто мне надо перенести всё что старше N дней из папки в папку. |
Будут только файлы, сам объект папки будет исключен, т.е файлы расположенные в этой будут попадать под перемещение.
|
Извините за назойливость, просто хочется окончательно разобраться.
Получается что благодаря этой конструкции: Move-Item -Destination {md $_.DirectoryName.Replace("$path","$dest") -force} все файлы будут переносится с автоматическим сохранением и созданием структуры папок в папке назначения. И данная конструкция не умеет переносить папки, по этому мы их исключаем из переноса? Я правильно понял? |
Немного не так.
Для исключения папок мы используем атрибут PsIsContainer. Код:
PS > dir Код:
PS C:\1> dir | Where {$_.PsIsContainer} Код:
PS C:\1> dir | Where {!$_.PsIsContainer} Можно переносить и папки, но для случая когда у папки LastAccessTime подходит под условие, а все файлы внутри свежие, что у Вас предусмотрено? |
Честно говоря затрудняюсь ответит...
Просто есть папка гигов в 200, в которой огромная количество папок и файлов в жуткой структуре подпапок. Мне надо найти ВСЁ что старше N дней\месяцев и перенести оттуда в другую папку с сохранением структуры папок. Т.е. если кому-нибудь понадобится получить файл за 2010 год из этого ужаса, то можно узнать путь где он лежал и вытащить его из папки куда он был перемещён ($dest) по такому же пути (ну понятное дело что сменится корневая папка или диску куда это всё перенесется, но смысл я думаю поняте) |
Ещё вариантов решения проблемы никто не подскажет?
|
Задачу решил следующими костылями:
скрипт 1 - перенос всех файлов старше N дней: Код:
$days = 120 Т.к. в этой папке и всех её подпапках были изображения, то так же в папке был скрытый файл Thumbs.db. Автоматически его удалить не получилось, ни powershell, ни vbs, ни cmd не смогли удалить их, по этому удалил их через поиск. скрипт 2 - удаление всех пустых каталогов: Код:
#$path = "D:\data" Код:
$path="D:\data"; |
Цитата:
|
Цитата:
|
Цитата:
Поэтому я и дал чисто общую рекомендацию: надо смотреть, как это конкретно реализуется в языке, который вы используете. Не обязательно сбрасывать атрибуты в отдельном цикле (это лишние накладные расходы): достаточно это делать при первом же обращении к файлу, перед выполнением любых других операций с ним. |
Теперь понял.
Спасибо. Попробую посмотреть что с этим можно сделать в powershell, раз уж всё на нём сделано |
Время: 02:24. |
Время: 02:24.
© OSzone.net 2001-