PnPUtil
是Windows内置的一个命令行工具,位于%windir%\system32
目录下,用于管理员对驱动程序包执行安装、删除、枚举等相关操作:
通过管理员权限打开cmd,执行PnPUtil命令,其参数如下:
pnputil [/add-driver <...> | /delete-driver <...> | /export-driver <...> | /enum-drivers | /disable-device <...> | /enable-device <...> | /restart-device <...> | /remove-device <...> | /scan-devices <...> | /enum-devices <...> | /enum-interfaces <...> | /?]
/add-driver
* <文件名.inf | .inf> [/subdirs][/install][/reboot]此命令用于将驱动程序包添加到驱动程序存储区中,也是最常用的安装驱动程序的PnPUtil命令。
/subdirs 参数将遍历驱动程序包的子目录,
/install 参数将在匹配的设备上安装或者更新驱动,
/reboot 参数将通过必要重启操作来完成驱动程序包的添加生效。
示例1:添加驱动程序包
pnputil /add-driver x:\driver.inf
(对应旧式命令:pnputil /a x:\driver.inf)
示例2:添加多个驱动程序包
pnputil /add-driver c:\oem\*.inf
(对应旧式命令:pnputil /a c:\oem\*.inf)
示例3:遍历子目录进行添加并安装驱动程序包
pnputil /add-driver *.inf /subdirs /install
(对应旧式命令:pnputil /a *.inf /subdirs /i)
/delete-driver
此命令用于从驱动程序存储区中删除驱动程序包,有时直接删除设备管理器可能无效,通过管理员身份打开命令行窗口查看当前安装的驱动程序,然后通过PnPUtil命令进行驱动程序包的删除。这是PnPUtil的常用命令之一。
/uninstall 卸载驱动程序包
/force 强制卸载
/reboot 重启以完成卸载操作
示例1:删除驱动程序包
pnputil /delete-driver oem0.inf
(对应旧式命令:pnputil /d oem0.inf)
示例2:强制删除并卸载驱动程序包
pnputil /delete-driver oem0.inf /force /uninstall
(对应旧式命令:pnputil /d oem0.inf /f /uninstall)
/export-driver
将驱动程序包从驱动程序存储区导出到目标目录。
/enum-driver
枚举驱动程序存储区中的所有第三方驱动程序包。
示例1:枚举OEM驱动程序包 pnputil /enum-drivers (对应旧式命令:pnputil /e)
/disable-device
[/reboot]禁用系统上的设备。
/enable-device
[/reboot]启用系统上的设备。
/restart-device
[/reboot]重新启用系统上的设备。
/remove-device
[/subtree][/reboot]从系统中删除设备。
/subtree 删除整个设备子树,包括子设备
/scan-devices
[/instanceid ][/async]扫描系统中是否有任何设备硬件更改。
/instanceid 扫描设备子树改变 /async 异步扫描改变
10、/enum-devices
[/connected][/disconnected][/instanceid ][/class 枚举系统上所有的设备。
/connnect | /disconnect 筛选连接的或者没有连接的设备
/instanceid 通过设备实例ID筛选
/class
/problem [] 筛选有问题的设备或者指定问题代码
/ids 显示硬件ID或者兼容ID
/drivers 显示匹配的或者已安装的驱动
/enum-interfaces
[/enabled | /disable][/class 相同 ]枚举系统上的所有设备接口。
/enabled | disabled 筛选启用的或者禁用的接口
/class 筛选接口类GUID
显示命令行语法。
此工具平时最常用的操作就是安装、卸载与枚举第三方的驱动程序。
通常,我们在安装pureOS后需要安装第三方的驱动程序,如蓝牙、WiFi、音频Audio等驱动,来实现蓝牙、WiFi等功能的使用。一般通过/add-driver参数、/subdirs参数以及/install参数来实现一次性添加并安装驱动程序。
pnputil /a *.inf /subdirs /install
有时候,对于同一个驱动,有可能安装了多次,那么在系统已安装的驱动程序包中可能存在多个inf文件,所以这会导致一个现象:通过在设备管理器中进行卸载设备,过一会卸载的设备又再次出现在设备管理器中,可能需要多次操作才能卸载成功。
这是因为选择进行卸载的设备会对应系统中的一个inf文件,在设备管理器中点击删除设备会把对应的inf删除,但是这个时候系统中关于此设备可能进行过多次安装,所以一个驱动文件系统中的三方驱动程序列表会对应多个inf名称。
那么,我们可以通过dism命令来直观的查看三方驱动程序列表,查看设备对应的原始inf文件在列表中对应的oem#.inf文件名称。
dism /online /get-drivers /format:table
然后通过pnputil命令来删除并卸载对应的oem#.inf文件,以确保某一设备对应的驱动被卸载,系统中无残留。
pnputil /d oem1.inf /uninstall
通过/enum-driver即可枚举系统中安装的所有三方驱动程序:
pnputil /enum-driver (pnputil /e)
四、排查
检查系统日志:%windir%\inf\setupapi.dev.log
五、参考资料
1、MSFT-PnPUtil