Как настроить автоматическую очистку временных файлов в браузерах через PowerShell

Кэш, куки, история — всё это со временем накапливается, занимает место на диске и может замедлять работу системы. Если вы обслуживаете несколько компьютеров в офисе или просто хотите, чтобы браузеры чистились сами, без ручного вмешательства — PowerShell отлично подходит для этой задачи. Расскажу, как это сделать на практике, без лишней теории.

Что мы будем чистить и почему

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

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

Если не чистить всё это регулярно, через несколько месяцев браузер может занимать на диске несколько гигабайт. На серверах и рабочих станциях с небольшим SSD это реальная проблема.

Где браузеры хранят временные файлы

Прежде чем писать скрипт, нужно знать точные пути. Вот стандартные расположения для трёх популярных браузеров на Windows:

Браузер Путь к временным файлам Что там внутри
Google Chrome %LOCALAPPDATA%\Google\Chrome\User Data\Default\Cache
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Code Cache
Кэш страниц, кэш скриптов, данные расширений
Mozilla Firefox %LOCALAPPDATA%\Mozilla\Firefox\Profiles\*.default\cache2
%LOCALAPPDATA%\Mozilla\Firefox\Profiles\*.default\startupCache
HTTP-кэш, кэш запуска, офлайн-данные
Microsoft Edge %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Cache
%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Code Cache
Аналогично Chrome — кэш страниц и скриптов

Обратите внимание: у Firefox путь содержит звёздочку — имя профиля уникально для каждого пользователя. Это нужно учитывать в скрипте.

Базовый скрипт очистки для одного браузера

Начнём с простого — очистка кэша Chrome для текущего пользователя. Создайте файл Clear-ChromeCache.ps1 и поместите туда следующий код:

# Очистка кэша Google Chrome через PowerShell
# Запускать от имени пользователя, под которым работает Chrome

$chromeCachePaths = @(
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Cache",
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Code Cache",
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Service Worker\CacheStorage"
)

$totalFreed = 0

foreach (path inchromeCachePaths) {
    if (Test-Path $path) {
        size = (Get-ChildItem -Pathpath -Recurse -Force -ErrorAction SilentlyContinue | 
                 Measure-Object -Property Length -Sum).Sum
        totalFreed +=size
        
        try {
            Remove-Item -Path "$path\*" -Recurse -Force -ErrorAction Stop
            Write-Host "Очищено: path (([math]::Round($size / 1MB, 1)) МБ)" -ForegroundColor Green
        }
        catch {
            Write-Host "Не удалось очистить: path -_" -ForegroundColor Red
        }
    }
}

totalMB = [math]::Round(totalFreed / 1MB, 1)
Write-Host "`nИтого освобождено примерно: $totalMB МБ" -ForegroundColor Cyan

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

Скрипт с предварительным закрытием браузера

Чтобы очистка проходила полноценно, добавим принудительное закрытие браузера перед удалением файлов:

# Полная очистка Chrome с предварительным закрытием браузера

$browserProcessName = "chrome"

# Шаг 1: Закрываем Chrome
processes = Get-Process -NamebrowserProcessName -ErrorAction SilentlyContinue
if ($processes) {
    Write-Host "Закрываю Chrome..." -ForegroundColor Yellow
    $processes | ForEach-Object {
        $_.CloseMainWindow() | Out-Null
    }
    # Ждём завершения до 10 секунд
    $timeout = 10
    $elapsed = 0
    while ((Get-Process -Name browserProcessName -ErrorAction SilentlyContinue) -and (elapsed -lt $timeout)) {
        Start-Sleep -Seconds 1
        $elapsed++
    }
    
    # Если процесс всё ещё висит — принудительно завершаем
    remaining = Get-Process -NamebrowserProcessName -ErrorAction SilentlyContinue
    if ($remaining) {
        Write-Host "Принудительное завершение Chrome..." -ForegroundColor Red
        $remaining | Stop-Process -Force
        Start-Sleep -Seconds 2
    }
}

# Шаг 2: Очищаем временные файлы
$chromeCachePaths = @(
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Cache",
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Code Cache",
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Service Worker\CacheStorage",
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\GPUCache"
)

$totalFreed = 0

foreach (path inchromeCachePaths) {
    if (Test-Path $path) {
        size = (Get-ChildItem -Pathpath -Recurse -Force -ErrorAction SilentlyContinue | 
                 Measure-Object -Property Length -Sum).Sum
        totalFreed +=size
        
        try {
            Remove-Item -Path "$path\*" -Recurse -Force -ErrorAction Stop
            Write-Host "Очищено: path (([math]::Round($size / 1MB, 1)) МБ)" -ForegroundColor Green
        }
        catch {
            Write-Host "Пропущено (заблокировано): $path" -ForegroundColor DarkYellow
        }
    }
}

Write-Host "`nОчистка завершена. Освобождено примерно: ([math]::Round(totalFreed / 1MB, 1)) МБ" -ForegroundColor Cyan

Этот скрипт уже можно запускать вручную или через Планировщик задач. Но есть нюанс — если пользователь работает в Chrome и у его открыты важные вкладки, принудительное закрытие вызовет раздражение. Об этом ниже.

Очистка Firefox — особенности

Firefox отличается структурой хранения. У него может быть несколько профилей, и путь к кэшу не фиксированный:

# Очистка кэша Firefox

# Находим все профили Firefox
firefoxProfilesPath = "env:LOCALAPPDATA\Mozilla\Firefox\Profiles"

if (Test-Path $firefoxProfilesPath) {
    profiles = Get-ChildItem -PathfirefoxProfilesPath -Directory
    
    foreach (profile inprofiles) {
        $cachePaths = @(
            Join-Path $profile.FullName "cache2",
            Join-Path $profile.FullName "startupCache",
            Join-Path $profile.FullName "thumbnails",
            Join-Path $profile.FullName "shader-cache"
        )
        
        $totalFreed = 0
        
        # Закрываем Firefox перед очисткой
        $ffProcesses = Get-Process -Name "firefox" -ErrorAction SilentlyContinue
        if ($ffProcesses) {
            ffProcesses | ForEach-Object_.CloseMainWindow() | Out-Null }
            Start-Sleep -Seconds 5
            Get-Process -Name "firefox" -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
            Start-Sleep -Seconds 2
        }
        
        foreach (path incachePaths) {
            if (Test-Path $path) {
                size = (Get-ChildItem -Pathpath -Recurse -Force -ErrorAction SilentlyContinue | 
                         Measure-Object -Property Length -Sum).Sum
                totalFreed +=size
                
                try {
                    Remove-Item -Path "$path\*" -Recurse -Force -ErrorAction Stop
                    Write-Host "Очищено: path (([math]::Round($size / 1MB, 1)) МБ)" -ForegroundColor Green
                }
                catch {
                    Write-Host "Пропущено: $path" -ForegroundColor DarkYellow
                }
            }
        }
        
        Write-Host "Профиль (profile.Name): освобождено ([math]::Round(totalFreed / 1MB, 1)) МБ" -ForegroundColor Cyan
    }
}
else {
    Write-Host "Профили Firefox не найдены" -ForegroundColor Yellow
}

Универсальный скрипт для всех трёх браузеров

Если нужно обслуживать компьютеры, где установлены разные браузеры, логично объединить всё в один скрипт:

# Универсальная очистка временных файлов браузеров
# Запускать с правами администратора для обработки всех пользователей

function Clear-CacheFolder {
    param(
        [string]$Path,
        [string]$Description
    )
    
    if (Test-Path $Path) {
        size = (Get-ChildItem -PathPath -Recurse -Force -ErrorAction SilentlyContinue | 
                 Measure-Object -Property Length -Sum).Sum
        
        try {
            Remove-Item -Path "$Path\*" -Recurse -Force -ErrorAction Stop
            return [math]::Round($size / 1MB, 1)
        }
        catch {
            return 0
        }
    }
    return 0
}

# Закрываем все браузеры
$browserProcesses = @("chrome", "firefox", "msedge")
foreach (proc inbrowserProcesses) {
    running = Get-Process -Nameproc -ErrorAction SilentlyContinue
    if ($running) {
        Write-Host "Закрываю $proc..." -ForegroundColor Yellow
        running | ForEach-Object_.CloseMainWindow() | Out-Null }
    }
}

Start-Sleep -Seconds 5

# Принудительно завершаем то, что не закрылось
foreach (proc inbrowserProcesses) {
    Get-Process -Name $proc -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
}

Start-Sleep -Seconds 2

$totalFreed = 0

# --- Chrome ---
Write-Host "`n--- Google Chrome ---" -ForegroundColor Cyan
$chromePaths = @(
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Cache",
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Code Cache",
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\GPUCache",
    "$env:LOCALAPPDATA\Google\Chrome\User Data\Default\Service Worker\CacheStorage"
)
foreach (p inchromePaths) {
    freed = Clear-CacheFolder -Pathp -Description "Chrome"
    totalFreed +=freed
    if (freed -gt 0) Write-Host " +freed МБ" -ForegroundColor Green }
}

# --- Firefox ---
Write-Host "`n--- Mozilla Firefox ---" -ForegroundColor Cyan
ffProfiles = "env:LOCALAPPDATA\Mozilla\Firefox\Profiles"
if (Test-Path $ffProfiles) {
    foreach (profile in (Get-ChildItem -PathffProfiles -Directory)) {
        $ffPaths = @(
            Join-Path $profile.FullName "cache2",
            Join-Path $profile.FullName "startupCache",
            Join-Path $profile.FullName "shader-cache"
        )
        foreach (p inffPaths) {
            freed = Clear-CacheFolder -Pathp -Description "Firefox"
            totalFreed +=freed
            if (freed -gt 0) Write-Host " +freed МБ ((profile.Name))" -ForegroundColor Green }
        }
    }
}

# --- Edge ---
Write-Host "`n--- Microsoft Edge ---" -ForegroundColor Cyan
$edgePaths = @(
    "$env:LOCALAPPDATA\Microsoft\Edge\User Data\Default\Cache",
    "$env:LOCALAPPDATA\Microsoft\Edge\User Data\Default\Code Cache",
    "$env:LOCALAPPDATA\Microsoft\Edge\User Data\Default\GPUCache",
    "$env:LOCALAPPDATA\Microsoft\Edge\User Data\Default\Service Worker\CacheStorage"
)
foreach (p inedgePaths) {
    freed = Clear-CacheFolder -Pathp -Description "Edge"
    totalFreed +=freed
    if (freed -gt 0) Write-Host " +freed МБ" -ForegroundColor Green }
}

Write-Host "`n==============================" -ForegroundColor Cyan
Write-Host "Итого освобождено: $totalFreed МБ" -ForegroundColor Cyan

Настройка автоматического запуска через Планировщик задач

Теперь самое интересное — настроить автоматический заскрипт расписания. Вот пошаговая инструкция:

  1. Сохраните скрипт в удобное место, например C:\Scripts\Clear-BrowserCache.ps1. Убедитесь, что папка существует.
  2. Откройте Планировщик задач (Task Scheduler) — нажмите Win+R, введите taskschd.msc.
  3. Создайте новую задачу (не «Создать простую задачу», а именно «Создать задачу» — там больше настроек).
  4. Вкладка «Общие»: задайте имя, например «Очистка кэша браузеров». Отметьте «Выполнять с наивысшими привилегиями». В конфигурации выберите вашу версию Windows.
  5. Вкладка «Триггеры»: нажмите «Создать». Установите расписание — например, еженедельно в понедельник в 02:00, или при входе в систему с задержкой 5 минут.
  6. Вкладка «Действия»: нажмите «Создать». В поле «Программа или сценарий» введите:
    powershell.exe

    В поле «Добавить аргументы»:

    -ExecutionPolicy Bypass -File "C:\Scripts\Clear-BrowserCache.ps1"
  7. Вкладка «Условия»: снимите галочку «Выполнять только при питании от сети электропитания», если это ноутбук.
  8. Вкладка «Параметры»: отметьте «Выполнить задачу как можно позже» на случай, если расписание было пропущено.

После создания задачи рекомендую запустить её вручную один раз и проверить, что всё работает корректно.

Если нужно чистить для всех пользователей на компьютере

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

# Очистка кэша для ВСЕХ пользователей на компьютере
# Требуются права администратора

# Получаем все профили пользователей
profiles = Get-ChildItem -Path "C:Users" -Directory | Where-Object_.Name -ne "Public" }

foreach (profile inprofiles) {
    localAppData = Join-Pathprofile.FullName "AppData\Local"
    
    if (Test-Path $localAppData) {
        Write-Host "Обработка пользователя: (profile.Name)" -ForegroundColor Cyan
        
        # Chrome
        chromeCache = Join-PathlocalAppData "Google\Chrome\User Data\Default\Cache"
        if (Test-Path $chromeCache) {
            size = (Get-ChildItem -PathchromeCache -Recurse -Force -ErrorAction SilentlyContinue | 
                     Measure-Object -Property Length -Sum).Sum
            Remove-Item -Path "$chromeCache\*" -Recurse -Force -ErrorAction SilentlyContinue
            Write-Host "  Chrome: ([math]::Round(size / 1MB, 1)) МБ" -ForegroundColor Green
        }
        
        # Edge
        edgeCache = Join-PathlocalAppData "Microsoft\Edge\User Data\Default\Cache"
        if (Test-Path $edgeCache) {
            size = (Get-ChildItem -PathedgeCache -Recurse -Force -ErrorAction SilentlyContinue | 
                     Measure-Object -Property Length -Sum).Sum
            Remove-Item -Path "$edgeCache\*" -Recurse -Force -ErrorAction SilentlyContinue
            Write-Host "  Edge: ([math]::Round(size / 1MB, 1)) МБ" -ForegroundColor Green
        }
        
        # Firefox
        ffProfiles = Join-PathlocalAppData "Mozilla\Firefox\Profiles"
        if (Test-Path $ffProfiles) {
            foreach (ffProfile in (Get-ChildItem -PathffProfiles -Directory)) {
                ffCache = Join-PathffProfile.FullName "cache2"
                if (Test-Path $ffCache) {
                    size = (Get-ChildItem -PathffCache -Recurse -Force -ErrorAction SilentlyContinue | 
                             Measure-Object -Property Length -Sum).Sum
                    Remove-Item -Path "$ffCache\*" -Recurse -Force -ErrorAction SilentlyContinue
                    Write-Host "  Firefox ((ffProfile.Name)): ([math]::Round(size / 1MB, 1)) МБ" -ForegroundColor Green
                }
            }
        }
    }
}

Частые ошибки и как их избежать

Когда люди начинают настраивать автоматическую очистку через PowerShell, есть несколько типичных проблем:

  • Скрипт не может удалить файлы, потому что браузер запущен. Это самая частая ситуация. Решение — обязательно закрывать браузер перед очисткой через Stop-Process, либо использовать параметр -ErrorAction SilentlyContinue и смириться с тем, что часть файлов останется.
  • ExecutionPolicy блокирует запуск скрипта. По умолчанию Windows может запрещать выполнение ps1-файлов. Решение — запускать с ключом -ExecutionPolicy Bypass через Планировщик задач, или установить политику через Set-ExecutionPolicy RemoteSigned (нужны права администратора).
  • Очистка происходит без предупреждения пользователя. Если скрипт закрывает Chrome автоматически, пользователь потеряет открытые вкладки и несохранённые формы. Это раздражает. Лучше либо предупреждать, либо чистить только в нерабочее время.
  • Удаляются нужные данные. Если перестараться и почистить всю папку User Data — пропадут сохранённые пароли, закладки, настройки расширений. Чистите только папки Cache, Code Cache, GPUCache — не трогайте остальное.
  • Нет прав администратора при очистке для всех пользователей. Скрипт отработает без ошибок, но тихо пропустит папки, к которым нет доступа. Проверяйте запуск через Планировщик задач с галочкой «С наивысшими привилегиями».

Что выбрать в зависимости от ситуации

Не существует одного идеального решения. Вот как подходить к выбору:

  • Домашний компьютер, один пользователь. Достаточно простого скрипта без закрытия браузера. Запускайте раз в неделю через Планировщик задач в ночное время. Браузер в это время обычно закрыт, поэтому файлы удалятся без проблем.
  • Рабочая станция в офисе. Используйте скрипт с закрытием браузера, но добавьте проверку времени — не запускать в рабочие часы. Либо настройте очистку на время обеденного перерыва, предварительно предупредив коллег.
  • Сервер с множеством пользователей (RDS/Terminal Server). Здесь критично чистить для всех профилей. Используйте скрипт с перебором папок в C:\Users. Запускайте ночью. Обязательно закрывайте браузеры — на терминальных серверах пользователи часто забывают их закрыть, и они висят днями, раздувая кэш.
  • Нужно почистить только кэш, не трогая куки и пароли. Удаляйте только папки Cache и Code Cache. Не трогайте файлы Cookies, Login Data, Preferences — в них хранится полезная информация.
  • Нужно почистить всё — и кэш, и куки. Добавьте в скрипт удаление файлов Cookies и Web Data. Но помните: после этого пользователи заново войдут на все сайты. На общих компьютерах (например, в библиотеках или на ресепшене) это даже полезно.

Дополнительно: логирование и уведомления

Если вы обслуживаете парк компьютеров, полезно знать, сработал ли скрипт. Добавьте логирование:

# Добавьте в начало скрипта
$logPath = "C:\Scripts\Logs\CacheCleanup.log"
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

# Добавьте в конец скрипта
logEntry = "timestamp | Освобождено: totalFreed МБ | Компьютер:env:COMPUTERNAME"
Add-Content -Path logPath -ValuelogEntry

# Создайте папку для логов, если её нет
if (-not (Test-Path "C:\Scripts\Logs")) {
    New-Item -ItemType Directory -Path "C:\Scripts\Logs" -Force | Out-Null
}

Для критичных серверов можно добавить отправку уведомления по электронной почте, если при очистке возникли ошибки — через Send-MailMessage или webhook.

Итог

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

  • Знайте точные пути к кэшу — они отличаются у разных браузеров и версий.
  • Закрывайте браузер перед очисткой, иначе файлы заблокируются и не удалятся.
  • Используйте Планировщик задач для автоматизации — это надёжнее, чем запуск вручную.
  • Не удаляйте всё подряд — только папки кэша, если не хотите потерять настройки и пароли.
  • Добавьте логирование, чтобы отслеживать, что скрипт отрабатывает.
  • На серверах с несколькими пользователями обязательно запускайте скрипт с правами администратора и перебирайте все профили.

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

Dfncfg.ru
9b8bfda19807cd50