Кэш, куки, история — всё это со временем накапливается, занимает место на диске и может замедлять работу системы. Если вы обслуживаете несколько компьютеров в офисе или просто хотите, чтобы браузеры чистились сами, без ручного вмешательства — PowerShell отлично подходит для этой задачи. Расскажу, как это сделать на практике, без лишней теории.
- Что мы будем чистить и почему
- Где браузеры хранят временные файлы
- Базовый скрипт очистки для одного браузера
- Скрипт с предварительным закрытием браузера
- Очистка Firefox — особенности
- Универсальный скрипт для всех трёх браузеров
- Настройка автоматического запуска через Планировщик задач
- Если нужно чистить для всех пользователей на компьютере
- Частые ошибки и как их избежать
- Что выбрать в зависимости от ситуации
- Дополнительно: логирование и уведомления
- Итог
Что мы будем чистить и почему
Каждый браузер хранит временные файлы в определённых папках на диске. Вот что обычно накапливается:
- Кэш страниц — изображения, скрипты, стили, которые браузер сохраняет для быстрой загрузки.
- Куки — файлы с данными авторизации, настройками сайтов, трекингом.
- История посещений — записи о том, какие сайты открывались и когда.
- Скачанные файлы (частично) — некоторые браузеры хранят промежуточные данные в своих папках.
- Данные расширений и локальное хранилище — может занимать сотни мегабайт.
Если не чистить всё это регулярно, через несколько месяцев браузер может занимать на диске несколько гигабайт. На серверах и рабочих станциях с небольшим 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 Настройка автоматического запуска через Планировщик задач
Теперь самое интересное — настроить автоматический заскрипт расписания. Вот пошаговая инструкция:
- Сохраните скрипт в удобное место, например
C:\Scripts\Clear-BrowserCache.ps1. Убедитесь, что папка существует. - Откройте Планировщик задач (Task Scheduler) — нажмите Win+R, введите
taskschd.msc. - Создайте новую задачу (не «Создать простую задачу», а именно «Создать задачу» — там больше настроек).
- Вкладка «Общие»: задайте имя, например «Очистка кэша браузеров». Отметьте «Выполнять с наивысшими привилегиями». В конфигурации выберите вашу версию Windows.
- Вкладка «Триггеры»: нажмите «Создать». Установите расписание — например, еженедельно в понедельник в 02:00, или при входе в систему с задержкой 5 минут.
- Вкладка «Действия»: нажмите «Создать». В поле «Программа или сценарий» введите:
powershell.exe
В поле «Добавить аргументы»:
-ExecutionPolicy Bypass -File "C:\Scripts\Clear-BrowserCache.ps1"
- Вкладка «Условия»: снимите галочку «Выполнять только при питании от сети электропитания», если это ноутбук.
- Вкладка «Параметры»: отметьте «Выполнить задачу как можно позже» на случай, если расписание было пропущено.
После создания задачи рекомендую запустить её вручную один раз и проверить, что всё работает корректно.
Если нужно чистить для всех пользователей на компьютере
Скрипты выше работают для текущего пользователя. Но на рабочей станции может быть несколько учётных записей. Вот как модифицировать скрипт для обработки всех профилей:
# Очистка кэша для ВСЕХ пользователей на компьютере
# Требуются права администратора
# Получаем все профили пользователей
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 — это простая задача, которая приносит заметный результат. Вот что нужно запомнить:
- Знайте точные пути к кэшу — они отличаются у разных браузеров и версий.
- Закрывайте браузер перед очисткой, иначе файлы заблокируются и не удалятся.
- Используйте Планировщик задач для автоматизации — это надёжнее, чем запуск вручную.
- Не удаляйте всё подряд — только папки кэша, если не хотите потерять настройки и пароли.
- Добавьте логирование, чтобы отслеживать, что скрипт отрабатывает.
- На серверах с несколькими пользователями обязательно запускайте скрипт с правами администратора и перебирайте все профили.
Начните с простого скрипта для одного браузера, протестируйте на одном компьютере, а потом уже масштабируйте на всю сеть. Так вы избежите сюрпризов и будете точно знать, что делает скрипт на каждом этапе.
