【发布时间】:2013-02-18 13:40:10
【问题描述】:
我已经看到了至少另外两个关于 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;
}
所以这里发生的是我从ManagementObjectSearcher 获得ManagementObjects 的列表。这可以正常工作,并且还可以返回我期望的确切结果。
但这对我来说似乎是多余的。因为,首先我得到整个列表,然后过滤它。但是因为它使用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
【问题讨论】:
-
所以显然微软没有为 ref 类实现 like 运算符,如此处所述 social.technet.microsoft.com/Forums/nl-BE/winserverpowershell/…