Windows 24 марта 2026 9 мин чтения
ЕС
Евгений Семёнов
Генеральный директор ООО АйТи Фреш · 15+ лет в IT

Очистка диска Windows Server: удаляем мусор Windows Update и временные файлы

windows-disk-cleanup-update-cache

Классическая ситуация: системный диск сервера заполнен, хотя никаких «своих» данных там нет. Смотришь в проводнике — и вот оно: папка C:\Windows\SoftwareDistribution весит 18 ГБ, WinSxS под 20 ГБ, Temp разросся непонятно чем. Стандартная утилита Очистка диска (cleanmgr.exe) помогает слабо, а на серверах её вообще нередко не хватает. Разбираем полный арсенал PowerShell-инструментов для системной очистки — без лишних кликов и без риска сломать обновления.

Почему системный диск заполняется сам по себе

Windows Server накапливает мусор из нескольких источников одновременно:

Совет: Перед любой чисткой выполните быструю диагностику — сколько места занимает каждый источник. Это поможет расставить приоритеты и не тратить время на папки размером 100 МБ.

Диагностика: что именно ест место

Первым делом — посмотреть реальный размер подозреваемых папок. PowerShell справляется с этим в одну команду:

# Размер ключевых системных папок (в ГБ)
$paths = @(
    "C:\Windows\SoftwareDistribution\Download",
    "C:\Windows\WinSxS",
    "C:\Windows\System32\catroot2",
    "C:\Windows\Temp",
    "$env:TEMP"
)
foreach ($p in $paths) {
    if (Test-Path $p) {
        $size = (Get-ChildItem $p -Recurse -ErrorAction SilentlyContinue |
                 Measure-Object -Property Length -Sum).Sum / 1GB
        Write-Host ("{0,-50} {1:N2} GB" -f $p, $size)
    }
}

Запускайте от имени администратора. Результат сразу покажет главных «пожирателей» пространства.

Для быстрой проверки свободного места на всех дисках:

Get-PSDrive -PSProvider FileSystem |
  Select-Object Name,
    @{N='Used GB';E={[math]::Round($_.Used/1GB,1)}},
    @{N='Free GB';E={[math]::Round($_.Free/1GB,1)}},
    @{N='Total GB';E={[math]::Round(($_.Used+$_.Free)/1GB,1)}} |
  Format-Table -AutoSize

Очистка кэша Windows Update через PowerShell

Кэш обновлений — самый частый виновник. Алгоритм прост: останавливаем зависимые службы, переименовываем папки (Windows сам пересоздаст пустые), запускаем службы обратно.

# Остановка служб Windows Update
$services = 'wuauserv','bits','cryptsvc','msiserver'
foreach ($svc in $services) {
    Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
    Write-Host "Остановлена: $svc"
}

# Переименовываем папки кэша (с меткой времени, чтобы можно было откатить)
$ts = Get-Date -Format "yyyyMMdd_HHmmss"
$sd = "C:\Windows\SoftwareDistribution"
$cr = "C:\Windows\System32\catroot2"

if (Test-Path $sd) { Rename-Item $sd "${sd}_bak_$ts" }
if (Test-Path $cr) { Rename-Item $cr "${cr}_bak_$ts" }

# Запускаем службы обратно
foreach ($svc in $services) {
    Start-Service -Name $svc -ErrorAction SilentlyContinue
    Write-Host "Запущена: $svc"
}
Write-Host "Готово. Windows Update создаст новые папки при следующей проверке."
Важно: После переименования SoftwareDistribution Windows при следующем запуске Центра обновления заново скачает список обновлений. Это займёт несколько минут и создаст небольшой трафик. Старые папки с суффиксом _bak_ можно удалить через неделю, убедившись, что обновления работают нормально.

Сжатие хранилища компонентов WinSxS

Папку WinSxS удалять нельзя — это хранилище компонентов ОС. Но её можно безопасно сжать с помощью встроенной утилиты DISM. Команда удаляет устаревшие версии компонентов, которые уже не нужны для отката.

# Анализ — сколько можно освободить (не удаляет ничего)
Dism.exe /Online /Cleanup-Image /AnalyzeComponentStore

# Фактическая очистка (требует перезагрузки на некоторых версиях)
Dism.exe /Online /Cleanup-Image /StartComponentCleanup

# Агрессивный вариант — удаляет пакеты обновлений (нельзя откатиться)
Dism.exe /Online /Cleanup-Image /StartComponentCleanup /ResetBase
Осторожно: Флаг /ResetBase необратим — после него откатить установленные обновления будет невозможно. Используйте только на серверах, которые прошли тестирование и стабильно работают.

На Windows Server 2019/2022 DISM с StartComponentCleanup обычно освобождает 2–6 ГБ без каких-либо рисков.

Удаление временных файлов (Temp и %TEMP%)

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

# Очистка системного Temp
Get-ChildItem "C:\Windows\Temp" -Recurse -Force -ErrorAction SilentlyContinue |
  Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

# Очистка пользовательского Temp (текущего пользователя)
Get-ChildItem $env:TEMP -Recurse -Force -ErrorAction SilentlyContinue |
  Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

# Очистка Temp всех профилей (запускать от SYSTEM или локального администратора)
$profiles = Get-ChildItem "C:\Users" -Directory
foreach ($profile in $profiles) {
    $tempPath = Join-Path $profile.FullName "AppData\Local\Temp"
    if (Test-Path $tempPath) {
        Get-ChildItem $tempPath -Recurse -Force -ErrorAction SilentlyContinue |
          Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
        Write-Host "Очищен Temp для профиля: $($profile.Name)"
    }
}

Очистка Prefetch и журналов событий

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

# Очистка Prefetch (опционально, только если есть веская причина)
$prefetch = "C:\Windows\Prefetch"
if (Test-Path $prefetch) {
    Get-ChildItem $prefetch -Force -ErrorAction SilentlyContinue |
      Remove-Item -Force -ErrorAction SilentlyContinue
    Write-Host "Prefetch очищен"
}

# Проверка размера журналов событий
Get-WinEvent -ListLog * -ErrorAction SilentlyContinue |
  Where-Object { $_.FileSize -gt 50MB } |
  Select-Object LogName,
    @{N='Size MB';E={[math]::Round($_.FileSize/1MB,1)}},
    MaximumSizeInBytes |
  Sort-Object 'Size MB' -Descending |
  Format-Table -AutoSize

# Очистка конкретного журнала (пример: Application)
wevtutil cl Application
Совет: Вместо ручной очистки журналов настройте их максимальный размер и политику перезаписи через GPO: Computer Configuration → Windows Settings → Security Settings → Event Log. Оптимальный размер для производственного сервера — 128–256 МБ на журнал.

Оптимизация тома: TRIM для SSD, дефрагментация для HDD

После очистки файлов полезно запустить оптимизацию тома. PowerShell-командлет Optimize-Volume автоматически выбирает нужную операцию в зависимости от типа диска:

# Анализ всех томов
Get-Volume | Where-Object { $_.DriveLetter } |
  ForEach-Object {
    Optimize-Volume -DriveLetter $_.DriveLetter -Analyze -Verbose
  }

# Оптимизация системного диска
# Для SSD — выполняет TRIM (ReTrim)
# Для HDD — выполняет дефрагментацию
Optimize-Volume -DriveLetter C -ReTrim -Verbose

# Принудительная дефрагментация HDD (если Analyze рекомендует)
Optimize-Volume -DriveLetter D -Defrag -Verbose

На виртуальных машинах (Hyper-V, VMware) дополнительно имеет смысл запустить -SlabConsolidate — это уменьшает физический размер динамических VHDX-дисков:

Optimize-Volume -DriveLetter C -SlabConsolidate -Verbose

Автоматизация: планировщик задач для регулярной очистки

Разовая чистка — полумера. Правильный подход — автоматический запуск скрипта по расписанию. Создадим задачу, которая запускается раз в неделю в ночное время:

# Сохраняем скрипт очистки
$scriptContent = @'
# Cleanup script - auto maintenance
$services = 'wuauserv','bits','cryptsvc'
$services | ForEach-Object { Stop-Service $_ -Force -EA SilentlyContinue }
$ts = Get-Date -Format "yyyyMMdd"
$sd = "C:\Windows\SoftwareDistribution"
if (Test-Path $sd) {
    $free = (Get-PSDrive C).Free / 1GB
    if ($free -lt 10) {  # чистим только если меньше 10 ГБ свободно
        Rename-Item $sd "${sd}_bak_$ts" -EA SilentlyContinue
    }
}
$services | ForEach-Object { Start-Service $_ -EA SilentlyContinue }
Get-ChildItem "C:\Windows\Temp" -Recurse -Force -EA SilentlyContinue |
    Remove-Item -Recurse -Force -EA SilentlyContinue
# Удаляем старые бэкапы SoftwareDistribution (старше 14 дней)
Get-ChildItem "C:\Windows" -Filter "SoftwareDistribution_bak_*" -Directory |
    Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-14) } |
    Remove-Item -Recurse -Force -EA SilentlyContinue
'@
$scriptPath = "C:\Scripts\WeeklyCleanup.ps1"
New-Item -ItemType Directory -Path "C:\Scripts" -Force | Out-Null
$scriptContent | Out-File $scriptPath -Encoding UTF8

# Регистрируем задачу в планировщике
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-NonInteractive -ExecutionPolicy Bypass -File `"$scriptPath`""
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At "03:00"
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Hours 1) `
    -RunOnlyIfIdle $false -StartWhenAvailable
Register-ScheduledTask -TaskName "WeeklyDiskCleanup" `
    -Action $action -Trigger $trigger -Settings $settings `
    -RunLevel Highest -User "SYSTEM" -Force
Write-Host "Задача WeeklyDiskCleanup зарегистрирована."
Совет: В скрипте выше стоит проверка if ($free -lt 10) — очистка SoftwareDistribution запускается только если свободного места осталось меньше 10 ГБ. Это снижает нагрузку в штатных условиях и при этом гарантирует срабатывание в критических ситуациях.

Полный скрипт: единая точка входа

Все описанные шаги собраны в одном скрипте с проверкой прав администратора и отчётом до/после:

#Requires -RunAsAdministrator
<#
.SYNOPSIS
    Комплексная очистка диска Windows Server
.DESCRIPTION
    Очищает кэш Windows Update, Temp, Prefetch, запускает DISM и оптимизацию тома.
#>

function Get-FolderSize($path) {
    if (-not (Test-Path $path)) { return 0 }
    (Get-ChildItem $path -Recurse -Force -ErrorAction SilentlyContinue |
     Measure-Object -Property Length -Sum).Sum
}

$drive = "C"
$freeBefore = (Get-PSDrive $drive).Free

Write-Host "=== Начало очистки ===" -ForegroundColor Cyan
Write-Host "Свободно до: $([math]::Round($freeBefore/1GB,2)) ГБ"

# 1. Остановка служб обновления
$svcs = 'wuauserv','bits','cryptsvc','msiserver'
$svcs | ForEach-Object { Stop-Service $_ -Force -EA SilentlyContinue }

# 2. Сброс кэша обновлений
$ts = Get-Date -Format "yyyyMMdd_HHmm"
@("C:\Windows\SoftwareDistribution","C:\Windows\System32\catroot2") | ForEach-Object {
    if (Test-Path $_) { Rename-Item $_ "${_}_bak_$ts" -EA SilentlyContinue }
}

# 3. Запуск служб
$svcs | ForEach-Object { Start-Service $_ -EA SilentlyContinue }

# 4. Очистка Temp
@("C:\Windows\Temp", $env:TEMP) | ForEach-Object {
    Get-ChildItem $_ -Recurse -Force -EA SilentlyContinue |
      Remove-Item -Recurse -Force -EA SilentlyContinue
}

# 5. DISM: очистка хранилища компонентов
Write-Host "Запуск DISM /StartComponentCleanup..." -ForegroundColor Yellow
Dism.exe /Online /Cleanup-Image /StartComponentCleanup /Quiet

# 6. Оптимизация тома
Optimize-Volume -DriveLetter $drive -ReTrim -EA SilentlyContinue

$freeAfter = (Get-PSDrive $drive).Free
$freed = [math]::Round(($freeAfter - $freeBefore)/1GB, 2)
Write-Host "=== Готово ===" -ForegroundColor Green
Write-Host "Свободно после: $([math]::Round($freeAfter/1GB,2)) ГБ"
Write-Host "Освобождено: +$freed ГБ" -ForegroundColor Green

Что делать, если диск снова заполняется быстро

Если через неделю-две всё возвращается — проблема глубже. Вот чек-лист для дальнейшей диагностики:

# Проверка VSS / теневых копий
vssadmin list shadowstorage
vssadmin list shadows

# Ограничение хранилища VSS (максимум 5 ГБ)
vssadmin resize shadowstorage /For=C: /On=C: /MaxSize=5GB

# Проверка дампов памяти
Get-ChildItem C:\Windows -Filter "*.dmp" -Recurse -ErrorAction SilentlyContinue |
  Sort-Object Length -Descending |
  Select-Object FullName,
    @{N='Size MB';E={[math]::Round($_.Length/1MB,1)}},
    LastWriteTime |
  Format-Table -AutoSize
Важно: Не удаляйте дампы памяти сразу — они могут понадобиться для расследования BSOD или краша службы. Сначала убедитесь, что система стабильна, и только потом очищайте.

Официальная документация: Microsoft Learn — Windows Server, Microsoft Learn — PowerShell

Часто задаваемые вопросы

Что такое Очистка диска Windows Server: удаляем мусор Windows Update и временные файлы?

Очистка диска Windows Server: удаляем мусор Windows Update и временные файлы — это важный аспект системного администрирования, который позволяет настроить и оптимизировать работу IT-инфраструктуры. В данной статье подробно рассматриваются все ключевые моменты.

Как правильно настроить Очистка диска Windows Server: удаляем мусор Windows Update и временные файлы?

Для корректной настройки Очистка диска Windows Server: удаляем мусор Windows Update и временные файлы необходимо следовать пошаговой инструкции, представленной в статье выше. Важно учитывать особенности вашей инфраструктуры и требования безопасности.

Какие типичные ошибки возникают при работе с Очистка диска Windows Server: удаляем мусор Windows Update и временные файлы?

Наиболее частые ошибки при работе с Очистка диска Windows Server: удаляем мусор Windows Update и временные файлы: некорректная конфигурация, недостаточные права доступа и несовместимость версий. Рекомендуем обратиться к специалистам ITFresh для профессиональной настройки.

Нужна помощь специалистов?

ООО «АйТи Фреш» возьмёт это на себя

Не хватает времени или своих специалистов — мы настроим, оптимизируем и возьмём вашу IT-инфраструктуру на постоянное сопровождение. Работаем с юридическими лицами в Москве и регионах. Собственный дата-центр, команда из 8 серверов Dell Xeon Platinum 8280 на базе МТС.

15+лет опыта
25+клиентов
40Gсвоя сеть
24/7поддержка