Каждый раз, когда вы устанавливаете или обновляете драйвер устройства, Windows продолжает хранить старую версию драйвера на диске в системном хранилище драйверов (Driver Store). Благодаря этому, если система работает некорректно с новым драйвером или возникает какой-нибудь конфликт, пользователь в любой момент может откатить текущую версию драйвер и заменить его более старой версий. На диске хранилище драйверов расположено в папке C:\windows\system32\DriverStore\FileRepository. Однако, многие пользователи Windows замечают, что со временем размер каталога %windir%\system32\DriverStore\FileRepository начинает занимать все больше и больше места на системном диске. В моем случае размер этого каталога на диске составляет почти 11,5 Гб. Это довольно много, особенно для моего не слишком большого SSD диска.
Чтобы очистить хранилище драйверов от старых и неиспользуемых драйверов, я нашел небольшой PowerShell скрипт, который позволяет удалить все версии одного и того же драйвера в хранилище (по сути это частичные дубли), сохранив в системе только самую свежую версию.
Внимание! Ни в коем случае не нужно вручную удалять папки или файлы из каталога FileRepository!
Важные советы.
- Для запуска данного скрипта я использовал версию PowerShell, устанавливаемая вместе с Windows Management Framework 5.1 (нужен как минимум WMF4)
- Перед запуском скрипта убедитесь, у вас под рукой имеются все драйвера для важных компонентов системы (видеокарта, чипсет, звук и т.д.). В случае чего вы сможете с помощью них быстро переустановить драйвер и задействовать проблемное оборудование.
- Также желательно предварительно создать точку восстановления системы. Для этого воспользуйтесь командой:
Checkpoint-Computer -Description “TochkaPeredOchistkoyDraiverStore”
. Проверить успешность создания точки восстановления можно с помощью командыGet-ComputerRestorePoint
Список всех сторонних (не Microsoft) драйверов, которые установлены в системе можно получить с помощью утилиты DISM:dism /online /get-drivers
Вывод данной команды нужно будет распарсить с помощью PowerShell, найти дубликаты одного и того же драйвера и отсортировать их по дате. Из итогового списка нужно исключить самую последнюю (актуальную) версию каждого драйвера.
Затем можно удалить драйверы, оставшиеся в списке с помощью утилиты pnputil. В некоторых случаях, если драйвер не удается удалить, нужно воспользоваться принудительным удалением с помощью ключа -f.
Сам скрипт выглядит следующим образом:
$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 с правами администратора и разрешите выполнение неподписанных скриптов:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
Запустите скрипт: C:\PoSh\drv_cleanup.ps1
Скрипт удалит неиспользуемые драйвера. После его завершения, перезагрузите компьютер и убедитесь, что все работает нормально (если нет – переустановите драйвера устройств, которые работают некорректно).
В моем случае (с момента установки системы прошло чуть больше 2 лет) размер каталога FileRepository уменьшился с 11,5 до 1.5 Гб. Почти в 8 раз, неплохо!