Get-WmiObject 在过滤 PNPDeviceID 时未显示所需的结果

Get-WmiObject not showing desired results while filtering for PNPDeviceID

我一直试图让一个脚本工作,通过 hardwareID 识别当前安装在 Windows 10 系统中的显卡是否是 Nvidia 卡。但无论出于何种原因,我无法让它只获取我想要的 PNPDeviceID 行。我已经设置了 2 个不同的测试脚本来尝试让它工作:

$VideoCardID = Get-WmiObject -ClassName Win32_VideoController | Where-Object { $_.PNPDeviceID -like "PCI\VEN_10DE*"}
Write-Host $VideoCardID
Write-Host "Press any key to exit..."
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
exit

输出:\DESKTOP-UPTIVUP\root\cimv2:Win32_VideoController.DeviceID="VideoController1" Press any key to exit...

另一个:

$VideoCardID = Get-WmiObject -Class CIM_VideoController PNPDeviceID | Where-Object { $_."PCI\VEN_10DE*"}
Write-Host $VideoCardID
Write-Host "Press any key to exit..."
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
exit

只输出 Press any key to exit...

期望的结果是它只检测显卡的硬件 ID(又名 PNPDeviceID),然后通过 if/else 语句确定它是否是 Nvidia 型号。

几天来我一直在尝试找出问题所在,但此时我已经放弃了,因此我在这里寻求建议。 对于具有丰富 Powershell 经验的人来说,这可能很容易解决,尽管我充其量只是个脚本小子。

对于您的第一个片段,您只需要使用点符号来引用对象 $VideoCardID:

PNPDeviceID 属性
Write-Host $VideoCardID.PNPDeviceID

你看到 _PATH 属性 的原因是因为 Write-Host 正在对你的对象进行字符串化,这类似于我们调用 .ToString() 方法时发生的情况这个对象:

PS /> $VideoCardID.ToString()
\computername\root\cimv2:Win32_VideoController.DeviceID="VideoController1"

在你的第二个片段中,你的 Where-Object 陈述不正确:

Where-Object { $_."PCI\VEN_10DE*"}

应该和你的第一个例子一样:

Where-Object { $_.PNPDeviceID -like "PCI\VEN_10DE*"}

至于如何使用 if / else 语句处理代码:

if((Get-CimInstance -Class CIM_VideoController).PNPDeviceID -like "PCI\VEN_10DE*") {
    "It's NVIDIA!"
}
else {
    "It's not NVIDIA!"
}

另外,建议使用CIM cmdlets而不是WMI。