Найти тему
Мысли вслух

Как очистить систему от мусора самостоятельно, без использования платных утилит?

Мне чуть ли не каждый день попадаются статьи о всяческих "чудесных" способах очистки системы от мусора. Как правило, эти способы сводятся к запуску очередной утилиты, мол, запусти эту программу и будет тебе счастье.

Да, ряд программ зарекомендовал себя весьма хорошо, но никто, кроме разработчиков, не знает, что там "под капотом".

Если хочешь точно знать, что у тебя и как работает, такую утилиту лучше написать самостоятельно. Сейчас не требуется для этого каких-то "очень секретных" знаний - в операционные системы, начиная с Windows 7/Vista, встроен прекрасный инструмент - Windows Powershell, который имеет просто потрясающие возможности. Я немного расскажу об этих возможностях.

Итак, для основной очистки системы нам нужно провести чистку по двум направлениям:

1. Почистить некоторые папки в системной папке Windows.

2. Почистить папки в пользовательских профилях.

С первым пунктом все просто - задаем простой список путей и, что надо удалить, например так:

$path_system=5 - Эта переменная для цикла, чтобы все пути были обработаны

for ($i=1; $i -le $path_system; $i++){

switch ($i)

{

1 {$p=$env:SystemDrive+"\$RECYCLE.BIN\*.*"}

2 {$p=$env:SystemDrive+"\recycled\*.*"}

3 {$p=$env:SystemDrive+"\recycler\*.*"}

4 {$p=$env:SystemDrive+"\windows\SoftwareDistribution\Download\*.*"}

5 {$p=$env:SystemDrive+"\windows\Temp\*.*"}

}

Remove-Item $p -Force -ErrorAction SilentlyContinue

}

$env:SystemDrive - этой командой мы выясняем букву системного раздела.

Теперь посмотрим, что можно сделать с профилями пользователей.

С профилями все практически так же:

$uprof=Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" | ForEach { (Get-ItemProperty -Name "ProfileImagePath" -Path $_.PSPath).ProfileImagePath}| where {$_ -like "*Users*"} - этой конструкцией мы получим список папок локальных профилей пользователей (тех, что находятся в папке C:\Users\)

$path_count=6

foreach ($u in $uprof){

for ($i=1; $i -le $path_count; $i++){

switch ($i)

{

1 {$p=$u+"\appdata\local\temp\*.*"}

2 {$p=$u+"\appdata\local\microsoft\windows\temporary internet files\content.ie5\*.*"}

3 {$p=$u+"\appdata\local\microsoft\media player\Кэш файлов графики\localmls\*.*"}

4 {$p=$u+"\appdata\local\google\update\download\*.*"}

5 {$p=$u+"\AppData\Roaming\Microsoft\Windows\Cookies\*.*"}

6 {$p=$u+"\AppData\Roaming\Microsoft\Windows\Recent\*.*"}

}

Remove-Item $p -Force -recurse -ErrorAction SilentlyContinue

}

При группировке путей для очистки, нужно учитывать, что некоторые папки надо чистить рекурсивно (полностью или от определенных файлов), а некоторые не рекурсивно. В приведенном фрагменте очистки профилей, папки чистятся рекурсивно - со всеми подпапками, если таковые будут.

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

После очистки можно провести дефрагментацию:

$sysvol=$env:systemdrive

$SysDrive=$sysvol[0]

Optimize-Volume -DriveLetter $SysDrive -Defrag -ErrorAction SilentlyContinue

Надеюсь, что этой небольшой заметкой я сподвигну хоть кого-то к изучению чего-то нового (пока мы все сидим на самоизоляции ;-) ).

Windows Powershell - чрезвычайно мощный и не очень сложный инструмент.

Для тех, кто заинтересовался, могу посоветовать ознакомиться с этой книгой: "Волшебство Windows Powershell".

P.S.: Операции очистки путей можно сделать и без цикла For, и без оператора выбора Switch. Можно просто перечислить пути списком (особенно при очистке системных путей). Приведенные фрагменты кода рабочие - я писал небольшую утилиту для своих нужд, а там такой подход мне удобен для формирования строки прогресса выполнения.