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

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

Ответить
Настройки темы
PowerShell - [решено] Перенос файлов старше N дней

Старожил


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

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


Доброго времени суток!
Накидал скрипт из пары строк, который должен пройтись по папки и если к файлу последний раз обращались больше чем N дней, он переносится в др папку, но скрипт не работает не поминая почему... Если указывать сравнение "ge", то он начинает всё(!) переносить, если "le" (по идее то что мне и надо), вообще ничего не происходит. Подскажите пожалуйста в чём ошибся?

Код: Выделить весь код
cls
$path = "D:\other\test1"
$dest = "D:\other\test"

Get-ChildItem $path | where { $_.LastAccessTime -le ((Get-Date).AddDays(-5)) } | Move-Item -Destination $dest
Заранее спасибо!

Отправлено: 10:21, 15-08-2014

 

Ветеран


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

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


А вывод, что показывает?

Get-ChildItem $path | Format-Table lastaccess*,name -Auto

И за одно посмотреть, не отключено ли обновление данного атрибута(вроде начиная с Vista отключено по умолчанию):
fsutil behavior query DisableLastAccess

Отправлено: 10:36, 15-08-2014 | #2



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

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


Старожил


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

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


Вывод Вашей команды:
Цитата:
LastAccessTime LastAccessTimeUtc Name
-------------- ----------------- ----
15.08.2014 10:09:57 15.08.2014 6:09:57 12
14.08.2014 15:54:00 14.08.2014 11:54:00 Презентации конференции
14.08.2014 15:54:00 14.08.2014 11:54:00 фото для печати
Большое спасибо! Нашёл косяк. Проблема в том, что Get-ChildItem $path без ключа -recurse смотрит на дату папки, а т.к. корневая папка имеет актуальную дату он её и пропускает, не смотря внутрь, где лежат старые файлы и папки. Но если поставить этот ключ, то он не сохранит структуру папок и просто все файлы старше N дней переместит в $dest.
Подскажите пожалуйста как это побороть?

Отправлено: 10:51, 15-08-2014 | #3


Ветеран


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

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


Move-Item -Destination {md $_.DirectoryName.Replace("$path","$dest") -force}
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:54, 15-08-2014 | #4


Старожил


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

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


Большое спасибо!!
Как раз то что надо.

Можете подсказать, у сего действия имеется какой-то ограниченный уровень вложенности? Сейчас попробовал, и получил не мало подобных ошибок:
Цитата:
WhatIf: Выполнение операции "Перемещение файла" над целевым объектом "Элемент: D:\pablic\Obmen\Foto\#Work\S\02 2014\222.rar Назначение: D:\Foto\#Work\S\02 2014\222.rar".
Move-Item : Ошибка при вводе данных в блок сценария для параметра "Destination". Невозможно вызвать метод для выражения со значением NULL.
строка:6 знак:116
+ ... m -Destination {md $_.DirectoryName.Replace("$path","$dest") -force} -WhatIf
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (мотивация марта Иркутск:PSObject) [Move-Item], ParameterBindingException
+ FullyQualifiedErrorId : ScriptBlockArgumentInvocationFailed,Microsoft.PowerShell.Commands.MoveItemCommand

WhatIf: Выполнение операции "Перемещение файла" над целевым объектом "Элемент: D:\pablic\Obmen\Foto\#Work\S\03 2014\111.rar Назначение: D:\Foto\#Work\S\03 2014\111rar".
Как я понял в данном примере, он споткнулся об папку D:\pablic\Obmen\Foto\#Work\S\03 2014\viv содержащая ещё вложенные папки и файлы.

Отправлено: 11:20, 15-08-2014 | #5


Ветеран


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

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


Да, он выдает ошибки на папки, поэтому исключите их.

where { $_.LastAccessTime -le ((Get-Date).AddDays(-5)) -and !$_.PsIsContainer}
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:21, 15-08-2014 | #6


Старожил


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

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


Цитата Kazun:
Да, он выдает ошибки на папки, поэтому исключите их. »
А что будет после исключения? Он оставит эту папку на месте?
Просто мне надо перенести всё что старше N дней из папки в папку.

Отправлено: 11:29, 15-08-2014 | #7


Ветеран


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

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


Будут только файлы, сам объект папки будет исключен, т.е файлы расположенные в этой будут попадать под перемещение.

Отправлено: 11:31, 15-08-2014 | #8


Старожил


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

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


Извините за назойливость, просто хочется окончательно разобраться.
Получается что благодаря этой конструкции: Move-Item -Destination {md $_.DirectoryName.Replace("$path","$dest") -force} все файлы будут переносится с автоматическим сохранением и созданием структуры папок в папке назначения. И данная конструкция не умеет переносить папки, по этому мы их исключаем из переноса?
Я правильно понял?

Отправлено: 11:35, 15-08-2014 | #9


Ветеран


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

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


Немного не так.

Для исключения папок мы используем атрибут PsIsContainer.

Код: Выделить весь код
PS > dir


    Каталог: C:\1


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        15.08.2014     11:36            1
d----        15.08.2014     11:36            2
d----        15.08.2014     11:36            3
-a---        15.08.2014     11:36          8 1.txt
Только папки:
Код: Выделить весь код
PS C:\1> dir | Where {$_.PsIsContainer}


    Каталог: C:\1


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        15.08.2014     11:36            1
d----        15.08.2014     11:36            2
d----        15.08.2014     11:36            3
Только файлы:
Код: Выделить весь код
PS C:\1> dir | Where {!$_.PsIsContainer}


    Каталог: C:\1


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        15.08.2014     11:36          8 1.txt
DirectoryName - свойство только у файлов, у папок отсутствует. В данном случае конструкция не перемещает папки, а так можно и папки перемещать. Будут перемещаться, но без сохранения в исходном расположении, для этого есть Copy-Item.

Можно переносить и папки, но для случая когда у папки LastAccessTime подходит под условие, а все файлы внутри свежие, что у Вас предусмотрено?

Отправлено: 11:42, 15-08-2014 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Перенос файлов старше 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
VBS/WSH/JS - [решено] Удаление файлов по сети старше 7 дней, оставлять не менее 10 файлов white155 Скриптовые языки администрирования Windows 6 04-01-2012 00:42
[решено] Автоочистка файлов, старше 5 дней. Universal_gr Программное обеспечение Linux и FreeBSD 1 01-10-2010 01:12
Прочее - удаление файлов старше 10 дней admin666 Общий по Linux 1 23-07-2009 19:09




 
Переход