Yesterday

🗑️ Умная очистка Temp в Windows: Интерактивный PowerShell-скрипт для подписчиков, который сам закрывает блокировки.

⚙️ Этот скрипт — лишь малая часть того, что можно автоматизировать в Windows. На канале "Настройки Windows" мы каждую неделю разбираем подобные инструменты, которые превращают часовую рутину в пару кликов.

116

🛡️ ВЗНОС В РАЗВИТИЕ КАНАЛА И СОЗДАНИЕ ПОЛЕЗНЫХ СКРИПТОВ 🛡️

116
116
# ═══════════════════════════════════════════════════════════════
# ️ PROFESSIONAL TEMP CLEANER v3.0 — ИНТЕРАКТИВНЫЙ
# Совместим: Windows 10 (1903+) / Windows 11 (все версии)
# PowerShell: 5.1+ / 7.x
# ═══════════════════════════════════════════════════════════════

# ═══════════════════════════════════════════════════════════════
# АВТОМАТИЧЕСКИЙ ЗАПРОС ПРАВ АДМИНИСТРАТОРА
# ═══════════════════════════════════════════════════════════════
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

if (-not $isAdmin) {
Write-Host "⚠️ Требуются права администратора. Запрашиваю..." -ForegroundColor Yellow
Write-Host ""

$scriptPath = $MyInvocation.MyCommand.Path

if ($scriptPath) {
Start-Process powershell -Verb RunAs -ArgumentList "-ExecutionPolicy Bypass -File `"$scriptPath`""
exit
} else {
# Если скрипт запущен из консоли (не из файла)
Write-Host " Скрипт должен быть сохранён в файл для автозапроса прав." -ForegroundColor Red
Write-Host "💡 Или запустите PowerShell от имени Администратора вручную." -ForegroundColor Yellow
Write-Host ""
Write-Host "Нажмите любую клавишу для выхода..." -ForegroundColor DarkGray
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
exit
}
}

# ═══════════════════════════════════════════════════════════════
# ФУНКЦИИ
# ═══════════════════════════════════════════════════════════════
function Get-FolderSize {
param([string]$Path)
if (Test-Path $Path) {
$size = (Get-ChildItem -Path $Path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum
return [math]::Round($size / 1MB, 2)
}
return 0
}

function Format-Size {
param([double]$MB)
if ($MB -ge 1024) {
return "$([math]::Round($MB / 1024, 2)) GB"
}
return "$MB MB"
}

function Show-Menu {
Write-Host ""
Write-Host "══════════════════════════════════════════════════════" -ForegroundColor Cyan
Write-Host "║ 🗑️ PROFESSIONAL TEMP CLEANER v3.0 ║" -ForegroundColor Cyan
Write-Host "══════════════════════════════════════════════════════" -ForegroundColor Cyan
Write-Host ""
Write-Host " [1] 🧹 Стандартная очистка (безопасно)" -ForegroundColor White
Write-Host " [2] Закрыть известные процессы и очистить" -ForegroundColor Yellow
Write-Host " [3] 💥 Принудительная очистка (закрыть всё кроме системных)" -ForegroundColor Red
Write-Host " [4] ℹ️ Показать информацию о Temp-папках" -ForegroundColor Cyan
Write-Host " [5] 🚪 Выход" -ForegroundColor Gray
Write-Host ""
Write-Host "══════════════════════════════════════════════════════" -ForegroundColor DarkGray
Write-Host ""
}

function Get-BlockingProcesses {
$knownProcesses = @(
@{Name = "chrome"; DisplayName = "Google Chrome"},
@{Name = "msedge"; DisplayName = "Microsoft Edge"},
@{Name = "firefox"; DisplayName = "Mozilla Firefox"},
@{Name = "brave"; DisplayName = "Brave Browser"},
@{Name = "opera"; DisplayName = "Opera"},
@{Name = "vivaldi"; DisplayName = "Vivaldi"},
@{Name = "iexplore"; DisplayName = "Internet Explorer"},
@{Name = "msiexec"; DisplayName = "Windows Installer"},
@{Name = "setup"; DisplayName = "Setup/Installers"},
@{Name = "winword"; DisplayName = "Microsoft Word"},
@{Name = "excel"; DisplayName = "Microsoft Excel"},
@{Name = "powerpnt"; DisplayName = "Microsoft PowerPoint"},
@{Name = "outlook"; DisplayName = "Microsoft Outlook"},
@{Name = "teams"; DisplayName = "Microsoft Teams"},
@{Name = "slack"; DisplayName = "Slack"},
@{Name = "discord"; DisplayName = "Discord"},
@{Name = "spotify"; DisplayName = "Spotify"},
@{Name = "steam"; DisplayName = "Steam"},
@{Name = "epicgameslauncher"; DisplayName = "Epic Games Launcher"},
@{Name = "origin"; DisplayName = "Origin/EA App"},
@{Name = "updater"; DisplayName = "Various Updaters"},
@{Name = "java"; DisplayName = "Java"},
@{Name = "javaw"; DisplayName = "Java (GUI)"},
@{Name = "python"; DisplayName = "Python"},
@{Name = "node"; DisplayName = "Node.js"},
@{Name = "code"; DisplayName = "Visual Studio Code"},
@{Name = "devenv"; DisplayName = "Visual Studio"}
)

$blocking = @()
foreach ($proc in $knownProcesses) {
$running = Get-Process -Name $proc.Name -ErrorAction SilentlyContinue
if ($running) {
$blocking += @{
ProcessName = $proc.Name
DisplayName = $proc.DisplayName
Count = $running.Count
Processes = $running
}
}
}
return $blocking
}

function Stop-ProcessesInteractive {
param([array]$Processes, [string]$Mode)

if ($Processes.Count -eq 0) {
Write-Host "✅ Нет процессов для закрытия" -ForegroundColor Green
return
}

Write-Host ""
Write-Host "🔍 Найдены процессы, которые могут блокировать Temp-файлы:" -ForegroundColor Yellow
Write-Host ""

$index = 1
foreach ($proc in $Processes) {
Write-Host " [$index] $($proc.DisplayName) ($($proc.ProcessName)) — $($proc.Count) экз." -ForegroundColor White
$index++
}

Write-Host ""

if ($Mode -eq "selective") {
Write-Host "Введите номера процессов через запятую для закрытия (или 'all' для всех, 'skip' для пропуска): " -ForegroundColor Cyan -NoNewline
$choice = Read-Host

if ($choice -eq "skip") {
Write-Host "⏭️ Пропуск закрытия процессов" -ForegroundColor Yellow
return
}

$toStop = @()
if ($choice -eq "all") {
$toStop = $Processes
} else {
$indices = $choice -split "," | ForEach-Object { [int]($_.Trim()) }
foreach ($idx in $indices) {
if ($idx -ge 1 -and $idx -le $Processes.Count) {
$toStop += $Processes[$idx - 1]
}
}
}

foreach ($proc in $toStop) {
Write-Host "️ Закрываю $($proc.DisplayName)..." -ForegroundColor Yellow
$proc.Processes | Stop-Process -Force -ErrorAction SilentlyContinue
Start-Sleep -Milliseconds 500
}
} elseif ($Mode -eq "force") {
Write-Host "⚡ Принудительное закрытие всех процессов..." -ForegroundColor Red
foreach ($proc in $Processes) {
Write-Host "⏹️ Закрываю $($proc.DisplayName)..." -ForegroundColor Yellow
$proc.Processes | Stop-Process -Force -ErrorAction SilentlyContinue
Start-Sleep -Milliseconds 300
}
}

Write-Host "✅ Процессы закрыты" -ForegroundColor Green
Start-Sleep -Seconds 1
}

function Clear-TempFiles {
param([string]$Mode)

$tempPaths = @(
@{Path = $env:TEMP; Name = "Пользовательский Temp"},
@{Path = "$env:LOCALAPPDATA\Temp"; Name = "Local AppData Temp"},
@{Path = "$env:windir\Temp"; Name = "Системный Temp (Windows)"}
)

Write-Host ""
Write-Host "══════════════════════════════════════════════════════" -ForegroundColor DarkGray
Write-Host "📊 СТАТИСТИКА ДО ОЧИСТКИ:" -ForegroundColor Cyan
Write-Host "══════════════════════════════════════════════════════" -ForegroundColor DarkGray
Write-Host ""

$totalBefore = 0
foreach ($temp in $tempPaths) {
$size = Get-FolderSize -Path $temp.Path
$totalBefore += $size
$status = if (Test-Path $temp.Path) { "✅ Найдена" } else { "❌ Не найдена" }
Write-Host " $($temp.Name):" -ForegroundColor White
Write-Host " Путь: $($temp.Path)" -ForegroundColor Gray
Write-Host " Размер: $(Format-Size $size)" -ForegroundColor Yellow
Write-Host " Статус: $status" -ForegroundColor Green
Write-Host ""
}

Write-Host "📊 Общий размер Temp-файлов: $(Format-Size $totalBefore)" -ForegroundColor Magenta
Write-Host ""

# Закрываем процессы в зависимости от режима
if ($Mode -eq "standard") {
Write-Host "🧹 Режим: Стандартная очистка (без закрытия процессов)" -ForegroundColor Green
} elseif ($Mode -eq "selective") {
Write-Host " Режим: Закрытие выбранных процессов" -ForegroundColor Yellow
$blocking = Get-BlockingProcesses
Stop-ProcessesInteractive -Processes $blocking -Mode "selective"
} elseif ($Mode -eq "force") {
Write-Host " Режим: Принудительная очистка" -ForegroundColor Red
$blocking = Get-BlockingProcesses
Stop-ProcessesInteractive -Processes $blocking -Mode "force"
}

Write-Host ""
Write-Host "🔄 Начинаем очистку..." -ForegroundColor Green
Write-Host "══════════════════════════════════════════════════════" -ForegroundColor DarkGray
Write-Host ""

$totalDeleted = 0
$totalSkipped = 0
$totalErrors = 0

foreach ($temp in $tempPaths) {
if (-not (Test-Path $temp.Path)) { continue }

Write-Host "🔍 Обрабатываем: $($temp.Name)" -ForegroundColor Cyan

# Удаляем файлы
Get-ChildItem -Path $temp.Path -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { !$_.PSIsContainer } | ForEach-Object {
try {
Remove-Item -Path $_.FullName -Force -ErrorAction Stop
$totalDeleted++
}
catch {
if ($_.Exception.Message -match "being used by another process|Access to the path") {
$totalSkipped++
} else {
$totalErrors++
}
}
}

# Удаляем пустые папки
Get-ChildItem -Path $temp.Path -Recurse -Force -Directory -ErrorAction SilentlyContinue |
Sort-Object { $_.FullName.Length } -Descending |
ForEach-Object {
try {
$items = Get-ChildItem -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue
if ($items.Count -eq 0) {
Remove-Item -Path $_.FullName -Force -ErrorAction Stop
}
}
catch {
$totalSkipped++
}
}

$sizeAfter = Get-FolderSize -Path $temp.Path
$freed = $size - $sizeAfter
if ($freed -gt 0) {
Write-Host " ✅ Освобождено: $(Format-Size $freed)" -ForegroundColor Green
} else {
Write-Host " ️ Файлы заблокированы процессами" -ForegroundColor Yellow
}
Write-Host ""
}

# Итоговая статистика
$totalAfter = 0
foreach ($temp in $tempPaths) {
$totalAfter += Get-FolderSize -Path $temp.Path
}

Write-Host "══════════════════════════════════════════════════════" -ForegroundColor DarkGray
Write-Host "📊 РЕЗУЛЬТАТЫ ОЧИСТКИ:" -ForegroundColor Magenta
Write-Host " ✅ Удалено файлов: $totalDeleted" -ForegroundColor Green
Write-Host " ⏳ Пропущено (заблокировано): $totalSkipped" -ForegroundColor Yellow
Write-Host " ❌ Ошибок: $totalErrors" -ForegroundColor Red
Write-Host ""
Write-Host "💾 Было: $(Format-Size $totalBefore)" -ForegroundColor White
Write-Host "💾 Стало: $(Format-Size $totalAfter)" -ForegroundColor White
Write-Host "🚀 Освобождено: $(Format-Size ($totalBefore - $totalAfter))" -ForegroundColor Green
Write-Host ""

if ($totalSkipped -gt 0) {
Write-Host "💡 Совет: Используйте режим [2] или [3] для закрытия блокирующих процессов" -ForegroundColor Cyan
Write-Host ""
}

Write-Host "✨ Очистка завершена!" -ForegroundColor Green
}

function Show-TempInfo {
Write-Host ""
Write-Host "══════════════════════════════════════════════════════" -ForegroundColor Cyan
Write-Host "ℹ️ ИНФОРМАЦИЯ О TEMP-ПАПКАХ" -ForegroundColor Cyan
Write-Host "══════════════════════════════════════════════════════" -ForegroundColor Cyan
Write-Host ""

$tempPaths = @(
@{Path = $env:TEMP; Name = "Пользовательский Temp"},
@{Path = "$env:LOCALAPPDATA\Temp"; Name = "Local AppData Temp"},
@{Path = "$env:windir\Temp"; Name = "Системный Temp (Windows)"}
)

foreach ($temp in $tempPaths) {
if (Test-Path $temp.Path) {
$size = Get-FolderSize -Path $temp.Path
$fileCount = (Get-ChildItem -Path $temp.Path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object).Count
$folderCount = (Get-ChildItem -Path $temp.Path -Recurse -Force -Directory -ErrorAction SilentlyContinue | Measure-Object).Count

Write-Host "📂 $($temp.Name)" -ForegroundColor White
Write-Host " Путь: $($temp.Path)" -ForegroundColor Gray
Write-Host " Размер: $(Format-Size $size)" -ForegroundColor Yellow
Write-Host " Файлов: $fileCount" -ForegroundColor Cyan
Write-Host " Папок: $folderCount" -ForegroundColor Cyan
Write-Host ""
}
}

Write-Host "🔍 Процессы, которые могут блокировать Temp:" -ForegroundColor Yellow
$blocking = Get-BlockingProcesses
if ($blocking.Count -gt 0) {
foreach ($proc in $blocking) {
Write-Host " ⚙️ $($proc.DisplayName) ($($proc.ProcessName)) — $($proc.Count) экз." -ForegroundColor White
}
} else {
Write-Host " ✅ Нет активных процессов" -ForegroundColor Green
}
Write-Host ""
}

# ═══════════════════════════════════════════════════════════════
# ГЛАВНЫЙ ЦИКЛ
# ═══════════════════════════════════════════════════════════════
Clear-Host

do {
Show-Menu
Write-Host "Ваш выбор: " -ForegroundColor Cyan -NoNewline
$choice = Read-Host

switch ($choice) {
"1" {
Clear-TempFiles -Mode "standard"
}
"2" {
Clear-TempFiles -Mode "selective"
}
"3" {
Write-Host ""
Write-Host "⚠️ ВНИМАНИЕ: Этот режим закроет ВСЕ процессы кроме системных!" -ForegroundColor Red
Write-Host "💾 Сохраните все открытые документы перед продолжением!" -ForegroundColor Yellow
Write-Host ""
Write-Host "Продолжить? (y/n): " -ForegroundColor Red -NoNewline
$confirm = Read-Host
if ($confirm -eq "y" -or $confirm -eq "Y") {
Clear-TempFiles -Mode "force"
} else {
Write-Host "❌ Операция отменена" -ForegroundColor Yellow
}
}
"4" {
Show-TempInfo
}
"5" {
Write-Host ""
Write-Host "👋 До свидания!" -ForegroundColor Green
Write-Host ""
exit
}
default {
Write-Host ""
Write-Host "❌ Неверный выбор. Попробуйте снова." -ForegroundColor Red
}
}

Write-Host ""
Write-Host "Нажмите любую клавишу для возврата в меню..." -ForegroundColor DarkGray
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Clear-Host

} while ($true)
  • 🔔 Подпишись, чтобы забирать готовые решения без лишней воды и скрытых настроек и скинь этот скрипт другу, чей ПК уже задыхается от гигабайтов кэша — точно скажет спасибо!
116

💳 Донат через Ozon (от 10 ₽. Получатель: Александр Г.)

✴️ Дорогие друзья. Если статья оказалась полезна, одна СТЕЛЛА от вас = мощная реклама для сотен людей. Поддержите контент, чтобы проблемы и решения находились быстрее! ✴️

С уважением. Александр, канал "Настройки Windows" на Яндекс.Дзен

dzen.ruСКРИПТЫ | Настройки Windows | Дзен