Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Удаление файлов старше определенной даты (http://forum.oszone.net/showthread.php?t=291428)

volk1234 22-11-2014 13:52 2433669

Удаление файлов старше определенной даты
 
Привет народ.
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 2433695

Пару моментов:
  1. Нет проверки, что объект - папка
  2. На удаление не попадут скрытые файлы
  3. Может не удалить файлы в которых есть символы, которые воспринимаются иначе, без параметра -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
  4. Как видим выше, сообщение получили, а файл на месте и без уведомления.

Код:

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 2433718

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 2433872

Цитата:

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

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

Цитата:

Цитата Kazun
Нет проверки, что объект - папка »

так как проверить? -File ?

Цитата:

Цитата Kazun
На удаление не попадут скрытые файлы »

-Force ?

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

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

Iska 23-11-2014 00:59 2433929

Цитата:

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

Цитата:

Цитата volk1234
А у меня вываливалась такая ошибка, когда я указывал дату в виде 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 есть хорошая статья на эту тему.

Цитата:

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

Присоединюсь к вопросу.

Цитата:

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

А как? Мы ведь получаем набор, и нам его так и так надо перебрать.

Цитата:

Цитата volk1234
И еще задача боевая, хочу поставить скрипт на мониторинг файлопомойки, каждую пятницу скрипт будет проверять размер папки, и если больше определенного размера удалять файлы и папки старше чем определенная дата.... »

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

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

volk1234 23-11-2014 01:16 2433934

Цитата:

Цитата Iska
Удалять папки, старше чем определённая дата — не стоит. »

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

Iska 23-11-2014 01:27 2433938

Цитата:

Цитата volk1234
Да, есть такая штука. Но на файлопомойке должен действовать закон джунглей. Через 5 дней все удалится. »

Именно так. Но проверяться на дату должны только файлы. Не папки. Понимаете? Папки и так будут удалены в том же цикле очистки, как только окажутся пустыми. В рабочие дни могу выложить вариант на WSH для лучшего понимания, о чём я говорю.

Цитата:

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

Совершенно согласен. Времени на расчистку своих авгиевых конюшен у них никогда нет. Всегда находится более важная работа.

Georgio 23-11-2014 01:27 2433939

Цитата:

Цитата Iska
Скрипт рекурсивно обходит папки, при схождении по дереву проверяет даты файлов и удаляет, если они старше недели. Вобрат, при восхождении по дереву рекурсии, скрипт проверяет, не пуста ли папка, и если пуста (все файлы из неё были удалены) — удаляет эту папку. »


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

Iska 23-11-2014 01:48 2433944

Georgio, оригинальный способ ;). Особенно «sort /r» умилило.

volk1234 23-11-2014 01:59 2433946

не в тему
читать дальше »
Я по мере сил учусь https://rdpdog.wordpress.com/2014/11...0%D0%BA%D0%B0/

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

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

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

Iska 23-11-2014 02:37 2433952

Цитата:

Цитата volk1234
Я по мере сил учусь https://rdpdog.wordpress.com/2014/11...0%D0%BA%D0%B0/ »

Я тоже так, неспешно, учусь. Лет семь, пожалуй ;).


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

Foreigner 23-11-2014 03:22 2433957

Iska
Цитата:

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

Kazun
Присоединяюсь к вопросу по:
Код:

Collection.Where({ expression } [, mode [, numberToReturn]])
А точнее, как определить наличие данных возможностей?

Kazun 23-11-2014 11:25 2434015

ForEach and Where magic methods - http://www.powershellmagazine.com/20...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 2434017

Foreigner,
Цитата:

Цитата 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 :(.

volk1234 23-11-2014 12:40 2434059

Цитата:

Цитата Iska
будто над ними работали совершенно разные команды разработчиков без наличия единого плана »

так и было
Скрытый текст
- пруф http://www.sysadmins.lv/PermaLink,gu...d836a3857.aspx
Цитата:

Поскольку я немного разбираюсь в PKI и PowerShell, состав этого модуля меня несколько смутил, удивил, оздачил, загнал в тупик. Например, зачем было делать 2 отдельных командлета для экспорта и импорта сертификатов (один для простых сертификатов, другой исключительно для pkcs#12). Что делает Switch-Certificate для меня осталось загадкой. Кстати говоря, командлет Get-Certificate делает совсем не то, что вы подумали. Этот командлет выполняет энроллмент (запрос) сертификата.


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

Kazun 23-11-2014 14:52 2434114

To Iska:
Get-Help Get-ChildItem -Online ведет http://technet.microsoft.com/library...=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...=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>]


Время: 20:43.

Время: 20:43.
© OSzone.net 2001-