При установке или обновлении драйверов устройств в Windows, старые версии драйверов сохраняются в системе. Это позволяет пользователю откатиться к предыдущей версии драйвера, если новый драйвер работает нестабильно. Однако Windows автоматически не удаляет старые и неиспользуемые версии драйверов, поэтому со временем размер места, занимаемого драйверами на системном диске становится довольно большим. В этой статье мы рассмотрим несколько способов удаления старых версий драйверов (дубликатов) в Windows с помощью встроенных и сторонних средств.
Windows хранит все файлы в драйверов в своем репозитории драйверов (Driver Store), находящемся в каталоге
%WINDIR%\System32\DriverStore\FileRepository.
Размер каталога с драйверами можно получить с помощью PowerShell (
"{0:N2} GB" -f ((gci –force $Env:windir\System32\DriverStore\FileRepository –Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb)
) или графических утилит. В моем случае на домашнем ноутбуке с Windows каталог FileRepository занимает на диске около 11 Гб и содержит >5000 файлов. В частности, в этом каталоге хранится более 20 различных версий видеодрайвера Nvidia.
- Не удаляйте файлы и каталоги драйверов из папки DriverStore вручную;
- Перед очисткой драйверов настоятельно рекомендуется создать точку восстановления системы (
Checkpoint-Computer -Description "BeforeDriversDelete"
) или резервную копию образа системы; - При подключении новых устройств вам придется загружать и устанавливать драйвера заново.
Поиск и удаление старых версий драйверов в Windows с помощью PowerShell
Рассмотрим способ поиска и удаления старых версий драйверов в Windows. Вы можете вывести полный список установленных драйверов с помощью PowerShell и WMI (CIM) класса Win32_PnPSignedDriver:
Get-WmiObject Win32_PnPSignedDriver| select DeviceName, DeviceClass,Manufacturer, DriverVersion, DriverDate,InfName|Out-GridView
В нашем примере мы получили таблицу Out-GridView со списком драйверов в репозитории Windows в формате: имя устройства, класс устройства, производитель, версия драйвера, дата установки, имя inf файла драйвера (oemXXX.inf).
Вы можете получить список сторонних драйверов, установленных в Windows с помощью командлета:
Get-WindowsDriver –Online| select Driver, ClassName, BootCritical, ProviderName, Date, Version, OriginalFileName|Out-GridView
Вы можете удалить любой из установленный драйверов с помощью утилиты pnputil:
pnputil.exe /remove-device oemxxx.inf
pnputil /remove-device oemxxx.inf /force
Найдите в таблице драйвера, для которых присутствуют несколько версий и удалите все старые версии драйвера (кроме самой последней) с помощью pnputil.
BootCritical=True
)Также вы можете выгрузить список драйверов в текстовый файл и импортировать его в Excel:
dism /online /get-drivers /format:table > c:\tmp\drivers.txt
Удалите все лишние данные в таблице и оставьте только столбцы: файл драйвера в системе (oemXXX.inf), имя оригинального inf файла, класс устройства, производителя, даты установки и версии драйвера. Отсортируйте таблицу по столбцам B (содержит имя оригинального inf файл) и столбцу F (дата установки драйвера). Среди групп одноименных драйверов отметьте для удаления все версии драйверов, кроме последней. В моем случае видно, что большинство старых версий драйверов принадлежит NVIDIA.
Для удобства сформируйте в пустом столбце команду для удаления каждого драйвера с помощью формулы
=CONCATENATE("pnputil.exe -d ";A21)
Осталось скопировать команды pnputil и выполнить их командной строке или bat файле.
В моем случае я удалил в Windows порядка 40 старых версий драйверов и освободил около 8 Гб места (в основном за счет драйверов видеокарты NVIDIA).
Для автоматического поиска драйверов устройств, для которых установлено несколько версий драйверов (дубликаты) можно использовать готовый PowerShell скрипт FindDriverDuplicates.ps1 (https://github.com/winadm/posh/blob/master/Desktop/FindDriverDuplicates.ps1).
Скрипт выведет список старых версий драйверов, которые можно удалить, т.к. для этих устройств установлены более новые версии. Строки с автоматическим удалением найденных драйверов по-умолчанию закомментированы в скрипте.
Удаление старых драйверов в Windows с помощью утилиты очистки диска cleanmgr
В современных версиях Windows 10 и 11 вы можете использовать утилиту очистки диска
cleanmgr.exe
для удаления старых версий драйверов (эта же утилита позволяет удалить устаревшие обновления).
- Запустите утилиту «Очистка диска»: Win+R -> cleanmgr
- Выберите системный диск
- Нажмите на кнопку Clean up system files
- Отметьте в списке Device driver packages (Пакеты драйверов устройств)
- Нажмите ОК;
- Данное задание очистки удалит все предыдущие версии драйверов, установленные через Windows Update или вручную. В Windows останется только последняя версия для каждого из драйверов. При этом устройств кнопка “Откатить драйвер” (RollBack Driver) в свойствах драйвера в диспетчере устройств станет неактивной. Задание очистки cleanmgr удаляет только дубликаты (версии) драйверов. Неиспользуемые драйверы устройств вам придется удалить вручную.
Удаляем неиспользуемые драйвера с помощью DevManView
Для просмотра списка установленных драйверов в Windows можно использовать небольшую бесплатную утилиту DevManView от NirSoft (https://www.nirsoft.net/utils/device_manager_view.html)
Утилита DevManView предоставляет собой альтернативу стандартному диспетчеру устройств Windows и позволяет представить список драйверов, установленных на компьютере, в виде плоского списка (таблицы).
- Скачайте и запустите утилиту DevManView;
- Включите следующие параметры в меню Options: Mark Connected Devices и Show Non Plug and Play Drivers;
- Отсортируйте таблицу по столбцу Connected. Это позволит понять какие устройства сейчас подключены, а какие нет;
- В целях стабильности рекомендуем сначала отключить выбранные драйвера (Disable Selected Devices –> F6) и только после перезагрузки удалять драйвера с помощью опции Uninstall Selected Devices.
а какие параметры импорта в Excel? У меня с ходу в одном столбце при импорте находятся оба названия драйвера, разделённых вертикальной чертой:
oem94.inf | prnms009.inf
oem95.inf | prnms001.inf
oem68.inf | akspccard.inf
oem69.inf | aksusb.inf
oem26.inf | pfc027.inf
oem56.inf | wpdrapi.inf
oem11.inf | teamviewervpn.inf
oem28.inf | sm953bw.inf
oem53.inf | netrtx64.inf
типа так….
и ещё вопрос — сортировка по столбцам одновременно не получается, что сортировать в первую очередь?
Почистите файл от мусора и откройте в Excel — разделитель |.
В Excel есть уровни сортировки. Сначала сортируете по столбцу с именем inf файла, потом — по версии.
Меня интересует какой утилитой можно очистить все драйвера, которые могут привести к конфликту если перенести винду на другой пк перед созданием резервной копии акрониксом
На самом деле довольно странное желание. Тут можно только теоретически рассуждать. В теории вы можете удалить все сторонние драйвера (не Microsoft). Их список можно сформировать с помощью командлета Export-WindowsDriver (на подробный мануал есть ссылка в статье).
Потом удалите все найденные драйверы с помощью команд типа:
pnputil -f -d oemxxx.inf
Вопрос? Как удалить НЕ oem драйверы, pnputil не позволяет удалять системные драйверы ..
Скорее всего никак, она только с OEM драйверами умеет работать …
Этот драйвер не отображается в списке?
pnputil.exe /enum-drivers
Насколько я помню,
dism /Remove-Driver
тоже позволяет удалить только сторонние драйвера.pnputil в принципе можно оставить в покое, так как dism может почти всё.
DISM.exe /директория /Get-Drivers /all (вывести список всех драйверов)
но для удаления старых системных драйверов видимо каких то привилегий не хватает
Как очистить диск, от старых драйверов, которые заняли у меня 20 гигов памяти, хотя я, ничто не скачивал на диск? Также невозможно удалить временные файлы, поле закрытия программы или выхода из системы. Почему раньше мне, ваш совет помогал, теперь нет, что нужно делать для виндоус 10?
Размер каталога с драйверами можно получить с помощью PowerShell ( "{0:N2} GB" -f ((gci –force $Env:windir\System32\DriverStore\FileRepository –Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb) )
А полностью команду можно отдельно получить? Эта, из текста, как-то не работает
Заработало
Заменил
«{0:N2} GB» -f ((gci –force $Env:windir\System32\DriverStore\FileRepository –Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb) )
на
«{0:N2} GB» -f ((Get-ChildItem C:\Windows\System32\DriverStore\FileRepository -force -Recurse -ErrorAction SilentlyContinue| measure Length -sum).sum / 1Gb)
Хрень. И так, и ак работает. Где-то не то или не так скопипастил