Мне чуть ли не каждый день попадаются статьи о всяческих "чудесных" способах очистки системы от мусора. Как правило, эти способы сводятся к запуску очередной утилиты, мол, запусти эту программу и будет тебе счастье.
Да, ряд программ зарекомендовал себя весьма хорошо, но никто, кроме разработчиков, не знает, что там "под капотом".
Если хочешь точно знать, что у тебя и как работает, такую утилиту лучше написать самостоятельно. Сейчас не требуется для этого каких-то "очень секретных" знаний - в операционные системы, начиная с 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. Можно просто перечислить пути списком (особенно при очистке системных путей). Приведенные фрагменты кода рабочие - я писал небольшую утилиту для своих нужд, а там такой подход мне удобен для формирования строки прогресса выполнения.