Войти

Показать полную графическую версию : Удаление файлов старше определенной даты


volk1234
22-11-2014, 13:52
Привет народ.
Powershell только начал изучать, просьба покритиковать код и самое интересное для меня-
сделать тоже самое другими способами на powershell(есть ли другие варианты)

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

$deadline="11/01/2014"
$path1="C:\Temp\test\"
$folder=Get-ChildItem -Path $path1 | Where {$_.LastWriteTime -le "$deadline"}


Foreach ($file in $folder)
{

Write-Host Deleting $path1$file
Remove-Item $path1$file

}

Kazun
22-11-2014, 15:18
Пару моментов:

Нет проверки, что объект - папка
На удаление не попадут скрытые файлы
Может не удалить файлы в которых есть символы, которые воспринимаются иначе, без параметра -LiteralPath. Через pipeline - это пофиксено.

PS > Foreach ($file in $folder)
>> {
>>
>> Write-Host Deleting $path1$file
>> Remove-Item $path1$file
>>
>> }
>>
Deleting D:\2\2[1].txt
PS > Get-ChildItem D:\2\


Directory: D:\2


Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 22.11.2014 15:14 0 2[1].txt

Как видим выше, сообщение получили, а файл на месте и без уведомления.


PS > (Get-ChildItem $path1 -File -Force).Where({$_.LastWriteTime -le "11/01/2014"}) | Remove-Item -Verbose
VERBOSE: Performing the operation "Remove File" on target "D:\2\bfsvc.exe".
VERBOSE: Performing the operation "Remove File" on target "D:\2\cmeauPCI.ico".

Foreigner
22-11-2014, 16:11
5. Привести $deadline к типу datetime


$deadline = [datetime]::parse("11/01/2014")


У меня вываливается ошибка:

Не удается сравнить "11/21/2014 22:44:04" с "11/01/2014". Ошибка: "Не удается преобразовать значение
"11/01/2014" в тип "System.DateTime". Ошибка: "Строка не распознана как действительное значение DateTime.""
.....

volk1234
22-11-2014, 21:48
У меня вываливается ошибка: »

А у меня вываливалась такая ошибка, когда я указывал дату в виде 01.11.2014, а когда указал 11/01/2014 все заработало.

Нет проверки, что объект - папка »
так как проверить? -File ?

На удаление не попадут скрытые файлы »
-Force ?

почему точка(Get-ChildItem $path1 -File -Force).Where
Как извлечь атрибут с помощью точки я понимаю, а вот команда where через точку для меня пока взрыв мозга...

ЗЫ. Спасибо за помощь, но может есть другие варианты кода для данной задачи, например без ForEach-Object ?
И еще задача боевая, хочу поставить скрипт на мониторинг файлопомойки, каждую пятницу скрипт будет проверять размер папки, и если больше определенного размера удалять файлы и папки старше чем определенная дата.... Я сам придумаю скрипт, просто может для данной задачи есть более эффективные способы.

Iska
23-11-2014, 00:59
У меня вываливается ошибка: »
А у меня вываливалась такая ошибка, когда я указывал дату в виде 01.11.2014, а когда указал 11/01/2014 все заработало. »
Полагаю, сие напрямую связано с локализацией. Чтобы отвязаться от неё, можно пользовать, например, «Get-Date -Format …», «Get-Date -Year … -Month … -Day …» или класс «CultureInfo», напрямую указывая формат:
[System.DateTime]::Parse("01/10/2014", (New-Object -TypeName System.Globalization.CultureInfo("en-US")))
Вот тут: Use Culture Information in PowerShell to Format Dates - Hey, Scripting Guy! Blog - Site Home - TechNet Blogs (http://blogs.technet.com/b/heyscriptingguy/archive/2011/08/25/use-culture-information-in-powershell-to-format-dates.aspx) есть хорошая статья на эту тему.

почему точка(Get-ChildItem $path1 -File -Force).Where
Как извлечь атрибут с помощью точки я понимаю, а вот команда where через точку для меня пока взрыв мозга... »
Присоединюсь к вопросу.

но может есть другие варианты кода для данной задачи, например без ForEach-Object ? »
А как? Мы ведь получаем набор, и нам его так и так надо перебрать.

И еще задача боевая, хочу поставить скрипт на мониторинг файлопомойки, каждую пятницу скрипт будет проверять размер папки, и если больше определенного размера удалять файлы и папки старше чем определенная дата.... »
Удалять папки, старше чем определённая дата — не стоит. У меня работает скрипт на WSH для подобной же задачи (за вычетом — я не проверяю размер, а чищу только по дате). Скрипт рекурсивно обходит папки, при схождении по дереву проверяет даты файлов и удаляет, если они старше недели. Вобрат, при восхождении по дереву рекурсии, скрипт проверяет, не пуста ли папка, и если пуста (все файлы из неё были удалены) — удаляет эту папку.

Ну, вот что за @@@?! Отчего в документации ни по 3.0: Get-ChildItem (http://technet.microsoft.com/en-us/library/hh849800(v=wps.620).aspx), ни по 4.0: Get-ChildItem (http://technet.microsoft.com/en-us/library/hh849800.aspx) нет про «-File», а про «-Directory» только в комментариях?!

volk1234
23-11-2014, 01:16
Удалять папки, старше чем определённая дата — не стоит. »
Да, есть такая штука. Но на файлопомойке должен действовать закон джунглей. Через 5 дней все удалится. можно конечно архивы делать, но у юзеров есть персональные папки и папки отделов на которые задана квота. А вот папка Public- это чисто для мусора временного + файлы со сканера. Юзеры не хотят сортировать просто говорят что все нужно, вплоть до 5 лет назад. Это просто отговорка, нужно действовать решительно, места на дисках мало :)

Iska
23-11-2014, 01:27
Да, есть такая штука. Но на файлопомойке должен действовать закон джунглей. Через 5 дней все удалится. »
Именно так. Но проверяться на дату должны только файлы. Не папки. Понимаете? Папки и так будут удалены в том же цикле очистки, как только окажутся пустыми. В рабочие дни могу выложить вариант на WSH для лучшего понимания, о чём я говорю.

Юзеры не хотят сортировать просто говорят что все нужно, вплоть до 5 лет назад. Это просто отговорка, нужно действовать решительно, места на дисках мало »
Совершенно согласен. Времени на расчистку своих авгиевых конюшен у них никогда нет. Всегда находится более важная работа.

Georgio
23-11-2014, 01:27
Скрипт рекурсивно обходит папки, при схождении по дереву проверяет даты файлов и удаляет, если они старше недели. Вобрат, при восхождении по дереву рекурсии, скрипт проверяет, не пуста ли папка, и если пуста (все файлы из неё были удалены) — удаляет эту папку. »


Iska, хоть и не PowerShell или WSH, но делает то же самое: http://www.cyberforum.ru/cmd-bat/thread1205207.html#post6812941.

Iska
23-11-2014, 01:48
Georgio, оригинальный способ ;). Особенно «sort /r» умилило.

volk1234
23-11-2014, 01:59
не в тему
Я по мере сил учусь https://rdpdog.wordpress.com/2014/11/19/%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F-%D1%83%D0%B1%D0%BE%D1%80%D0%BA%D0%B0/

Но мне так и не понятно, как можно в попытке улучшения сделать все для ухудшения.

Например раньше не было для powershell команд для управления виртуальными машинами. Теперь есть, но за то время пока не было расплодилось самодельных командлетов- как собак. И что мне изучать?
Add-VM
Create-VM
New-VM
Enable-VM
????????

Может разработчики договорились бы уже?

Iska
23-11-2014, 02:37
Я по мере сил учусь https://rdpdog.wordpress.com/2014/11...0%D0%BA%D0%B0/ »
Я тоже так, неспешно, учусь. Лет семь, пожалуй ;).

Это тема отдельного разговора — хреновая документация, отсутствие встроенных командлетов для таких типичнейших задач администрирования, как работа с ftp, почтой, «отваливание» ряда классов Automation, с которыми легко работал WSH, хреновая поддержка локализаций: у одних командлетов есть возможность работы с файлами в OEM, UTF-8 кодировке, у других, того же направления, нет — будто над ними работали совершенно разные команды разработчиков без наличия единого плана.

Foreigner
23-11-2014, 03:22
Iska

Отчего в документации ни по 3.0: Get-ChildItem, ни по 4.0: Get-ChildItem нет про «-File», а про «-Directory» только в комментариях?!

Нашел только онлайн: http://technet.microsoft.com/en-us/library/hh847897.aspx

Kazun
Присоединяюсь к вопросу по:
Collection.Where({ expression } [, mode [, numberToReturn]])
А точнее, как определить наличие данных возможностей (http://kazunposh.wordpress.com/2013/11/12/powershell-v4-%D1%87%D1%82%D0%BE-%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D1%87%D0%B0%D1%81%D1%82%D1%8C-2/)?

Kazun
23-11-2014, 11:25
ForEach and Where magic methods - http://www.powershellmagazine.com/2014/10/22/foreach-and-where-magic-methods/

PS > Get-Help Get-ChildItem -Parameter File

-File [<SwitchParameter>]
Gets files.

To get only files, use the File parameter and omit the Directory parameter. To exclude files, use the Directory pa
ameter and omit the File parameter, or use the Attributes parameter.

To get files, use the File parameter, its "af" alias, or the File value of the Attributes parameter.

Required? false
Position? named
Default value
Accept pipeline input? false
Accept wildcard characters? false

Iska
23-11-2014, 11:28
Foreigner, Iska
Отчего в документации ни по 3.0: Get-ChildItem, ни по 4.0: Get-ChildItem нет про «-File», а про «-Directory» только в комментариях?!
Нашел только онлайн: http://technet.microsoft.com/en-us/l.../hh847897.aspx »
Дык, в том-то и беда, что в одном месте есть, в другом — ни слова.

P.S. А «Get-Help Get-ChildItem -Parameter File -Online» всё одно ведёт сюда: Get-ChildItem (http://technet.microsoft.com/ru-RU/library/hh849800.aspx) :(.

volk1234
23-11-2014, 12:40
будто над ними работали совершенно разные команды разработчиков без наличия единого плана »

так и было - пруф http://www.sysadmins.lv/PermaLink,guid,2802dcba-319e-4df5-ba07-19cd836a3857.aspx
Поскольку я немного разбираюсь в PKI и PowerShell, состав этого модуля меня несколько смутил, удивил, оздачил, загнал в тупик. Например, зачем было делать 2 отдельных командлета для экспорта и импорта сертификатов (один для простых сертификатов, другой исключительно для pkcs#12). Что делает Switch-Certificate для меня осталось загадкой. Кстати говоря, командлет Get-Certificate делает совсем не то, что вы подумали. Этот командлет выполняет энроллмент (запрос) сертификата.

Предлагаю сделать в разделе и прикрепить ветку Разговоры о Powershell
:)

Kazun
23-11-2014, 14:52
To Iska:
Get-Help Get-ChildItem -Online ведет http://technet.microsoft.com/library/hh847897(v=wps.630).aspx

Get-ChildItem [-Attributes <FileAttributes]>] [-Directory] [-File] [-Force] [-Hidden] [-ReadOnly] [-System] [-UseTransaction] [<CommonParameters>]

Тут главное посмотреть Note:
Note: This custom cmdlet help file explains how the Get-ChildItem cmdlet works in a file system drive. For informat
ion about the Get-ChildItem cmdlet in all drives, type "Get-Help Get-ChildItem -Path $null" or see Get-ChildItem at
http://go.microsoft.com/fwlink/?LinkID=113308.


RELATED LINKS
Online version: http://technet.microsoft.com/library/hh847897(v=wps.630).aspx
Get-ChildItem (generic); http://go.microsoft.com/fwlink/?LinkID=113308

И в зависимости от провайдера с которым работает командлет, мы и будет получать параметры:
1) FileSystem
PS > Get-help Get-ChildItem -Path $null

SYNTAX
Get-ChildItem [[-Path] <String[]>] [[-Filter] <String>] [-Exclude <String[]>] [-Force] [-Include <String[]>] [-Name
] [-Recurse] [-UseTransaction [<SwitchParameter>]] [<CommonParameters>]

Get-ChildItem [[-Filter] <String>] [-Exclude <String[]>] [-Force] [-Include <String[]>] [-Name] [-Recurse] -Literal
Path <String[]> [-UseTransaction [<SwitchParameter>]] [<CommonParameters>]

Get-ChildItem [-Attributes <FileAttributes]>] [-Directory] [-File] [-Force] [-Hidden] [-ReadOnly] [-System] [-UseTr
ansaction] [<CommonParameters>]

2) Cert
Опять же в справке, пример 6:
For more information about the Certificate provider and the Cert: drive, go to http://go.microsoft.com/fwlink/?LinkID=113433 or use the Update-Help cmdlet to download the help files for the Microsoft.PowerShell.Security module and then type "Get-Help Certificate".

PS > Get-help Get-ChildItem -Path cert:\
SYNTAX
Get-ChildItem [[-Path] <String[]>] [[-Filter] <String>] [-Exclude <String[]>] [-Force] [-Include <String[]>] [-Name
] [-Recurse] [-UseTransaction [<SwitchParameter>]] [<CommonParameters>]

Get-ChildItem [[-Filter] <String>] [-Exclude <String[]>] [-Force] [-Include <String[]>] [-Name] [-Recurse] -Literal
Path <String[]> [-UseTransaction [<SwitchParameter>]] [<CommonParameters>]

Get-ChildItem [-CodeSigningCert] [-DnsName <string>] [-EKU <string>] [-ExpiringInDays <int>] [-SSLServerAuthenticat
ion] [<CommonParameters>]




© OSzone.net 2001-2012