我已经看到了至少另外两个关于 WMI 的问题,但没有人回答我的问题,所以在这里;
我正在我的代码中试验WMI
接口。基本上这就是我现在所拥有的并且它有效。但在我看来,我可以更有效地编写它:
public bool GetUsbStateById(string id)
{
bool returnValue = false;
try
{
ObjectQuery query = new ObjectQuery();
query.QueryString = string.Format("Select * From Win32_PnPDevice");
ManagementObjectSearcher mySearcher = new ManagementObjectSearcher(query);
List<ManagementObject> results = (from ManagementObject mo in mySearcher.Get().AsParallel()
where mo["SystemElement"].ToString().ToUpper().Contains(id.ToUpper())
select mo).ToList();
if (results.Count > 0)
returnValue = true;
}
catch (Exception ex)
{
// TODO: implement logging
}
return returnValue;
}
所以这里发生的是我ManagementObjects
从ManagementObjectSearcher
. 这工作正常,并且还返回我期望它工作的确切结果。
但这对我来说似乎是多余的。因为,首先我得到整个列表,然后过滤它。但是因为它用于WQL
填充列表,我假设我可以实现这样的东西:
query.QueryString = string.Format("Select * From Win32_PnPDevice where SystemElement Like '%{0}%'",id);
这不断抛出一个exception
查询不正确。
所以我尝试了这个:
query.QueryString = string.Format("Select SystemElement From Win32_PnPDevice);
这也有效,所以接下来我尝试Win32_PnPDevice.SystemElement
了,但这也没有用。
我在互联网上查看的任何示例都显示了类似的内容
Select * From Win32_Service
Where Name Like "%SQL%"
但是 c# 无法解析%SQL%
那里的语句周围的双引号,使用\
转义字符也不会产生任何结果。
为了测试我的代码和下面发布的代码,我使用了Microsoft的WMI Code Creator