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。
我一直试图让一个脚本工作,通过 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。