Каждый раз, когда вы устанавливаете или обновляете драйвер устройства, Windows продолжает хранить старую версию драйвера на диске в системном хранилище драйверов (Driver Store). Благодаря этому, если система работает некорректно с новым драйвером или возникает какой-нибудь конфликт, пользователь в любой момент может откатить текущую версию драйвер и заменить его более старой версий. На диске хранилище драйверов расположено в папке C:windowssystem32DriverStoreFileRepository. Однако, многие пользователи Windows замечают, что со временем размер каталога %windir%system32DriverStoreFileRepository начинает занимать все больше и больше места на системном диске. В моем случае размер этого каталога на диске составляет почти 11,5 Гб. Это довольно много, особенно для моего не слишком большого SSD диска.
Чтобы очистить хранилище драйверов от старых и неиспользуемых драйверов, я нашел небольшой PowerShell скрипт, который позволяет удалить все версии одного и того же драйвера в хранилище (по сути это частичные дубли), сохранив в системе только самую свежую версию.
Внимание! Ни в коем случае не нужно вручную удалять папки или файлы из каталога FileRepository!
Важные советы.
- Для запуска данного скрипта я использовал версию PowerShell, устанавливаемая вместе с Windows Management Framework 5.1 (нужен как минимум WMF4)
- Перед запуском скрипта убедитесь, у вас под рукой имеются все драйвера для важных компонентов системы (видеокарта, чипсет, звук и т.д.). В случае чего вы сможете с помощью них быстро переустановить драйвер и задействовать проблемное оборудование.
- Также желательно предварительно создать точку восстановления системы. Для этого воспользуйтесь командой:
1Checkpoint-Computer -Description “TochkaPeredOchistkoyDraiverStore”
. Проверить успешность создания точки восстановления можно с помощью команды
1Get-ComputerRestorePoint
Список всех сторонних (не Microsoft) драйверов, которые установлены в системе можно получить с помощью утилиты DISM:
1 |
dism /online /get-drivers |
Вывод данной команды нужно будет распарсить с помощью PowerShell, найти дубликаты одного и того же драйвера и отсортировать их по дате. Из итогового списка нужно исключить самую последнюю (актуальную) версию каждого драйвера.
Затем можно удалить драйверы, оставшиеся в списке с помощью утилиты pnputil. В некоторых случаях, если драйвер не удается удалить, нужно воспользоваться принудительным удалением с помощью ключа -f.
Сам скрипт выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
$dismOutput = dism /online /get-drivers $Lines = $dismOutput | select -Skip 10 $Tbls = "theName" $Drivers = @() foreach ( $Line in $Lines ) { $tmp = $Line $txt = $($tmp.Split( ':' ))[1] switch ($Tbls) { 'theName' { $Name = $txt $Tbls = 'theFileName' break } 'theFileName' { $FileName = $txt.Trim() $Tbls = 'theEntr' break } 'theEntr' { $Entr = $txt.Trim() $Tbls = 'theClassName' break } 'theClassName' { $ClassName = $txt.Trim() $Tbls = 'theVendor' break } 'theVendor' { $Vendor = $txt.Trim() $Tbls = 'theDate' break } 'theDate' { # для более удобной сортировки сменим формат данных $tmp = $txt.split( '.' ) $txt = "$($tmp[2]).$($tmp[1]).$($tmp[0].Trim())" $Date = $txt $Tbls = 'theVersion' break } 'theVersion' { $Version = $txt.Trim() $Tbls = 'theNull' $params = [ordered]@{ 'FileName' = $FileName'Vendor' = $Vendor'Date' = $Date'Name' = $Name'ClassName'= $ClassName'Version' = $Version'Entr' = $Entr } $obj = New-Object -TypeName PSObject -Property $params $Drivers += $obj break } 'theNull' { $Tbls = 'theName' break } } } Write-Host "Все установленные сторонние драйверы" $Drivers | sort Filename | ft Write-Host "Разные версии" $last = '' $NotUnique = @() foreach ( $Dr in $($Drivers | sort Filename) ) { if ($Dr.FileName -eq $last ) { $NotUnique += $Dr } $last = $Dr.FileName } $NotUnique | sort FileName | ft Write-Host "Outdated drivers" $list = $NotUnique | select -ExpandProperty FileName -Unique $ToDel = @() foreach ( $Dr in $list ) { Write-Host "duplicate found" -ForegroundColor Yellow $sel = $Drivers | where { $_.FileName -eq $Dr } | sort date -Descending | select -Skip 1 $sel | ft $ToDel += $sel } Write-Host "Drivers to remove" -ForegroundColor Red $ToDel | ft # удаляем оставшиеся старые версии драйверов с помощью pnputil foreach ( $item in $ToDel ) { $Name = $($item.Name).Trim() Write-Host "deleting $Name" -ForegroundColor Yellow Write-Host "pnputil.exe -d $Name" -ForegroundColor Yellow Invoke-Expression -Command "pnputil.exe -d $Name" } |
Совет. Если вы хотите только вывести список неиспользуемых драйверов на экран, закомментируйте строку с командой Invoke-Expression (поставьте перед ней символ #).
Скопируйте указанный код и сохраните его в текстовый файл cleanupdriver.ps1. Откройте командную строку PowerShell с правами администратора и разрешите выполнение неподписанных скриптов:
1 |
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass |
Запустите скрипт:
1 |
C:PoShdrv_cleanup.ps1 |
Скрипт удалит неиспользуемые драйвера. После его завершения, перезагрузите компьютер и убедитесь, что все работает нормально (если нет – переустановите драйвера устройств, которые работают некорректно).
В моем случае (с момента установки системы прошло чуть больше 2 лет) размер каталога FileRepository уменьшился с 11,5 до 1.5 Гб. Почти в 8 раз, неплохо!
Ваш комментарий будет первым