我至少看过另外两个关于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;
}
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
但是c#无法解析那里包含
Select * From Win32_Service
Where Name Like "%SQL%"
语句的双引号,使用%SQL%
转义字符也没有产生任何结果。
为了测试我的代码和下面发布的代码,我使用了Microsoft的WMI Code Creator
答案 0 :(得分:1)
如果您想在WMI
中运行like查询,则可以使用以下示例:
using System;
using System.Management;
using System.Windows.Forms;
namespace WMISample
{
public class MyWMIQuery
{
public static void Main()
{
try
{
string strSearchText="win";
string strSearchQuery=string.Format("SELECT * FROM Win32_Service where Name like '%{0}%'",strSearchText);
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2",strSearchQuery );
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------");
Console.WriteLine("Win32_Service instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("Name: {0}", queryObj["Name"]);
}
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
}
}
}
但是您无法将like
Win32_PNPDevice
作为discussed