none
PowerShell: Удаление старых папок RRS feed

  • Вопрос

  • Помогите, пожалуйста!

    На сетевом ресурсе \\Server\Backups есть папки с именами вида YYYY-MM-DD (т.е. 2009-11-21, 2010-03-05 и т.п.). Дата создания папок может отличаться от указанной в их именах. Нужно основываясь на текущей дате и имени папки (т.е. дате указанной в имени папки) удалить все папки со всем их содержимым старее 40 дней. В указанной шаре могут быть папки и с другими именами, их трогать не надо.

    На VBScript и CMD такое делалось достаточно просто, но нужно написать именно на PowerShell.

    13 апреля 2010 г. 15:01

Ответы

  • dir | where {[datetime]::parseexact($_,'yyyy-MM-dd',$null) -lt (get-date).adddays(-60)} | del -recurse -whatif

    Что, на vbs/cmd еще проще?

    После проверки убрать ключ -whatif чтобы стал удалять на самом деле.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 13 апреля 2010 г. 18:38
    • Помечено в качестве ответа Evgenii Alekseev 14 апреля 2010 г. 6:01
    13 апреля 2010 г. 18:37
    Модератор
  • Сейчас попробовал. Всё хорошо, но есть один нюанс. - В папке могут содержаться не только подпапки вида "YYYY-MM-DD", но и другие файлы и папки. В таком случае скрипт выкидывает ошибку:

    ---Cut---

    Исключение при вызове "ParseExact" с "3" аргументами: "DateTime, представленный строкой, не поддерживается в календаре System.Globalization.GregorianCalendar."
    В строка:1 знак:63
    + Get-ChildItem E:\Backup_Folder | Where {[DateTime]::ParseExact( <<<< $_,'yyyy-MM-dd',$null) -lt (Get-Date).AddDays(-60)}

    ---Cut---

    Как можно избежать таких ошибок? Может есть какая-нибудь конструкция вида "On Error Resume Next"?

     

    Будет ли правильно следующее или есть способ прямее?:

    $DT=New-Object DateTime
    Get-ChildItem E:\Backup_Folder | Where {[DateTime]::TryParse($_,[ref]$DT)} | Where {[DateTime]::ParseExact($_,'yyyy-MM-dd',$null) -lt (Get-Date).AddDays(-60)}| Del -recurse -WhatIf

    14 апреля 2010 г. 16:40

Все ответы

  • dir | where {[datetime]::parseexact($_,'yyyy-MM-dd',$null) -lt (get-date).adddays(-60)} | del -recurse -whatif

    Что, на vbs/cmd еще проще?

    После проверки убрать ключ -whatif чтобы стал удалять на самом деле.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 13 апреля 2010 г. 18:38
    • Помечено в качестве ответа Evgenii Alekseev 14 апреля 2010 г. 6:01
    13 апреля 2010 г. 18:37
    Модератор
  • Большое спасибо! Буду экспериментировать.

    14 апреля 2010 г. 6:14
  • Сейчас попробовал. Всё хорошо, но есть один нюанс. - В папке могут содержаться не только подпапки вида "YYYY-MM-DD", но и другие файлы и папки. В таком случае скрипт выкидывает ошибку:

    ---Cut---

    Исключение при вызове "ParseExact" с "3" аргументами: "DateTime, представленный строкой, не поддерживается в календаре System.Globalization.GregorianCalendar."
    В строка:1 знак:63
    + Get-ChildItem E:\Backup_Folder | Where {[DateTime]::ParseExact( <<<< $_,'yyyy-MM-dd',$null) -lt (Get-Date).AddDays(-60)}

    ---Cut---

    Как можно избежать таких ошибок? Может есть какая-нибудь конструкция вида "On Error Resume Next"?

     

    Будет ли правильно следующее или есть способ прямее?:

    $DT=New-Object DateTime
    Get-ChildItem E:\Backup_Folder | Where {[DateTime]::TryParse($_,[ref]$DT)} | Where {[DateTime]::ParseExact($_,'yyyy-MM-dd',$null) -lt (Get-Date).AddDays(-60)}| Del -recurse -WhatIf

    14 апреля 2010 г. 16:40
  • Да, это самый правильный способ, ничего лучше предложить не могу :)

    Как вариант (менее подходящий, зато может пригодится где нибудь где нет TryParse :) ), можно сделать обработчик ошибок (trap) в котором скрывать ошибку:

    trap{continue}

    [datetime]::ParseExact('9999-99-99','yyyy-MM-dd',$null)


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    15 апреля 2010 г. 3:44
    Модератор