none
Скрипт для выборочного удаления файлов RRS feed

  • Вопрос

  • Подскажите скрипт для удаления файлов бакапов. В интернете полно примеров как удалить файлов старше определенной даты, но у меня несколько другая задача.

    В одной папке постепенно копятся файлы бакапов, с датой в имени файла вида:

    FILE-30.03.2012.zip

    FILE-29.03.2012.zip

    и т.д.

    Хочу, чтобы оставлялись все файлы моложе 7 дней, а остальные удалялись, но при этом должно оставаться по одному файлу на конец каждого месяца.



    30 марта 2012 г. 12:45

Ответы

  • Если вывод удовлетворяет ожиданиям,убрать -WhatIf.

    $Date = [DateTime]::Today.AddDays(-7)
    $Files = Get-ChildItem C:\Backup\File-*.zip | Group-Object {$_.BaseName} -AsHashTable -AsString
    	
    #Удалим файлы из набора моложе 7 дней
    Foreach ($i in $Files.Keys | Where { [DateTime]::Parse(($_ -Replace "File-")) -ge $Date})
    {
    	$Files.Remove($i)
    }
    
    #Найдем файлы соответствующие последнему дню месяца и удалим из набора
    Foreach ($i in $Files.Keys | Group {$_ -Replace "File-\d+\."} -NoElement)
    {
    	$month = (Get-Date "01.$($i.Name)").AddMonths(1).AddDays(-1).ToShortDateString()
    	$Files.Remove("File-$month")
    }
    
    $Files.Values | Remove-Item -WhatIf
    

    30 марта 2012 г. 14:39
    Отвечающий

Все ответы

  • ну я бы порекомендовал брать файл не конца месяца, а на первое число последующего. тогда тупо по маске file-01.*.zip копируем файлик в соседнюю директорию и вуаля: задача сводится к "интернете полно примеров как удалить файлов старше определенной даты" :)
    30 марта 2012 г. 13:24
    • Изменено Svolotch 30 марта 2012 г. 13:35
    30 марта 2012 г. 13:26
  • Если вывод удовлетворяет ожиданиям,убрать -WhatIf.

    $Date = [DateTime]::Today.AddDays(-7)
    $Files = Get-ChildItem C:\Backup\File-*.zip | Group-Object {$_.BaseName} -AsHashTable -AsString
    	
    #Удалим файлы из набора моложе 7 дней
    Foreach ($i in $Files.Keys | Where { [DateTime]::Parse(($_ -Replace "File-")) -ge $Date})
    {
    	$Files.Remove($i)
    }
    
    #Найдем файлы соответствующие последнему дню месяца и удалим из набора
    Foreach ($i in $Files.Keys | Group {$_ -Replace "File-\d+\."} -NoElement)
    {
    	$month = (Get-Date "01.$($i.Name)").AddMonths(1).AddDays(-1).ToShortDateString()
    	$Files.Remove("File-$month")
    }
    
    $Files.Values | Remove-Item -WhatIf
    

    30 марта 2012 г. 14:39
    Отвечающий
  • Еще вариант:

    ls | ?{[datetime]::ParseExact(($_.name -replace '^FILE\-(.+)\.zip','$1'),"dd.MM.yyyy",$null) -lt (get-date).adddays(-7)} | Remove-Item -WhatIf

    Подробнее - http://xaegr.wordpress.com/2008/07/02/parsedatetime/


    AKA Xaegr, MVP: PowerShell Блог: http://xaegr.wordpress.com

    30 марта 2012 г. 15:00
    Модератор