Главная > Powershell > Чистка мусора при помощи Powershell

Чистка мусора при помощи Powershell

Время от времени просматривая файлы на файлопомойке натыкаюсь на так называемые файлы-призраки – временные файлы (как правило скрытые), например вида ~WRL0001.tmp, ~$filename.doc и т.д., созданные разными программами, которые по хорошему должны удаляться по завершению работы, но по каким-то причинам не удалённые вовремя и болтающиеся на сервере, а то и копируемые/перемещаемые вместе со всем каталогом в другое место, и таким образом кочующие по серверу как корабль-призрак по морям, океанам. Пользователям они проблем не доставляют, так как они их просто не видят, а места хоть и немного, но занимают, да и мне глаза мозолят, и удалять их каждый раз как наткнусь надоело. Появилась идея написать простенький скрипт, который будет за меня делать эту неблагодарную работу.

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

Find-Trash

Взяв эти маски за основу и добавив что-то своё получил набор масок для поиска мусора, который меня устроил.

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

Как говорил Гагарин: “Поехали!”

Путь для поиска будет задаваться через параметр $path, если его не указать, поиск будет производиться в подкаталогах текущего каталога:

param
(
    [string]$path = $null
)

# Если путь не задан ищем в текущем каталоге
if (!$path)
{
    $path = Get-Location
    Write-Warning "Путь не задан, по умолчанию используется текущий путь"
}

Ищем мусор в соответствии и заданными выше условиями и если ничего не находим выводим радостное сообщение, что мусора мы не нашли и выходим:

# Отбираем файлы
$trash = Get-ChildItem $path -Recurse -Force -Include "*.~*", "*.$$$", "~*.*",  
    "*.*~", "*.---", "*._mp", "*.chk", "*.bak," "*.old", "*.tmp", "thumbs.db" |
    Where-Object {$_.LastWriteTime -le ((Get-Date).AddDays(-30))}
    
if (-not $trash)
{
    Write-Host -ForegroundColor Green "`nМусор не найден :)"
    exit
}

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

$trash | Select-Object Name, LastWriteTime, FullName, Extension |
    Out-GridView -Title "Старый никому не нужный мусор"

Также для большей информативности можно подсчитать количество найденного мусора и общий объём:

$measure = $trash | Measure-Object -Property length -Sum
$count = $measure.Count
$size = [math]::Round((($measure.Sum) / 1Mb), 2)

@"
`n    Файлов:`t`t$count
    Общий размер:`t$size МБ`n
"@

Напомню, что конструкция @” “@ позволяет выводить несколько строк, чтобы не выводить каждую отдельно, а `n и `t являются Escape-последовательностями, представляющими собой вертикальную и горизонтальную табуляцию для форматирования вывода.

Осталось только удалить найденные файлы, если они действительно являются мусором:

$trash | Remove-Item -Force -Confirm

В завершение хотелось сказать, что проведя чистку таким образом на одной файловой шаре было найдено и удалено более полутора тысяч файлов, общим размером около 40 МБ, некоторые из которых судя по дате пережили как минимум один переезд между серверами и не одно поколение админов 🙂

Реклама
Рубрики:Powershell Метки:
  1. Andrew
    26/09/2012 в 12:31

    А как можно добавить сюда проверку на то что нет прав на каталог?
    А то при исполнении если нет прав — скрипт вываливается с ошибкой:

    Get-ChildItem : Access to the path ‘N:\folder1’ is denied.

    + FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand

  1. 02/03/2012 в 21:15
  2. 26/09/2012 в 15:33

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: