Intel显卡驱动冲突处理脚本:Pnp-DisableDevice Instance ID为空问题排查
问题描述
我们公司存在Intel Display驱动31.0.101.*自动覆盖新版本的问题,该版本与Citrix及其他企业工具存在已知兼容性问题。Intel支持页面建议保留31版本安装,同时从官网获取32.0.101.*版本。目前已有大量设备在强制更新后从32版本回退到31版本,我需要编写SCCM脚本禁用31版本驱动并启用32版本。
当前使用的PowerShell代码片段如下:
$Driver31 = "31.0.101." $Driver32 = "32.0.101." $oldDriver = Get-PnpDevice | Where-Object { $_.Version -like $Driver31 } $newDriver = Get-PnpDevice | Where-Object { $_.Version -like $Driver32 } if ($oldDriver) { Disable-PnpDevice -InstanceId $oldDriver.InstanceId -Confirm:$false }
运行脚本时提示.InstanceId为null值,请问问题出在哪里?
问题原因分析
- 多设备匹配导致数组无InstanceId属性:
Get-PnpDevice | Where-Object { $_.Version -like $Driver31 }可能返回多个PnP设备对象(比如同一驱动版本对应多个显示相关组件),此时$oldDriver是对象数组,直接访问$oldDriver.InstanceId会返回null——因为数组本身没有这个属性,只有数组内的单个设备对象才具备。 - 版本匹配规则错误:你的匹配字符串
31.0.101.缺少通配符*,无法正确匹配完整版本号(如31.0.101.2114)。如果没有匹配到任何设备,$oldDriver会是null,访问null.InstanceId自然报错。 - 权限不足导致属性缺失:若脚本未以管理员权限运行,
Get-PnpDevice可能无法完整获取设备的InstanceId属性,导致返回值为空。
修复后的脚本示例
$Driver31 = "31.0.101.*" $Driver32 = "32.0.101.*" # 仅过滤显示适配器类别的设备,避免匹配无关PnP设备 $oldDrivers = Get-PnpDevice -Class Display | Where-Object { $_.Version -like $Driver31 } $newDrivers = Get-PnpDevice -Class Display | Where-Object { $_.Version -like $Driver32 } # 遍历禁用所有旧版本驱动 if ($oldDrivers) { foreach ($driver in $oldDrivers) { if (-not [string]::IsNullOrEmpty($driver.InstanceId)) { Disable-PnpDevice -InstanceId $driver.InstanceId -Confirm:$false -ErrorAction SilentlyContinue } } } # 遍历启用所有新版本驱动 if ($newDrivers) { foreach ($driver in $newDrivers) { if (-not [string]::IsNullOrEmpty($driver.InstanceId)) { Enable-PnpDevice -InstanceId $driver.InstanceId -Confirm:$false -ErrorAction SilentlyContinue } } }
额外说明
- 添加
-Class Display参数精准过滤显示适配器设备,减少无效匹配; - 用
foreach遍历设备数组,确保每个符合条件的设备都被处理; - 加入
-ErrorAction SilentlyContinue可以忽略个别设备操作失败的情况(比如设备正在占用); - 必须以管理员权限运行脚本,否则会出现权限不足导致的属性缺失或操作失败问题。
内容的提问来源于stack exchange,提问作者McJones9631
相关产品推荐
相关产品推荐

