2013-02-18 106 views
1

我见过至少两个关于WMI的其他问题,但没有人回答我的问题,所以在这里;WQL Like语句和语法

我在我的代码中试验了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; 
} 

所以这里所发生的是,我从ManagementObjectSearcherManagementObjects列表。这工作正常,并返回确切的结果,因为我期望它的工作。

但对我来说似乎是多余的。因为,首先我得到整个列表,然后过滤它。但是,因为它使用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%声明有双引号,使用的\转义字符没有结果无论是。

为了测试我的代码和代码下面贴我从微软

+1

显然微软没有像这里讨论的那样为ref类实现类似的运算符http://social.technet.microsoft.com/Forums/nl-BE/winserverpowershell/thread/24981775-e105-42a8-8313-b0b86972f6c3 – wterbeek 2013-02-18 15:15:50

回答

1

使用WMI Code Creator,如果你想运行在WMIlike查询,那么你可以用下面的例子:

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); 
      } 
     } 
    } 
} 

您无法在Win32_PNPDevice上应用like查询discussed

+0

我试着用我的代码,但正如我以前所说,似乎并不奏效,即使我除了它的工作。我使用的代码如下(取自微软的WMI代码创建者) – wterbeek 2013-02-18 14:31:24

+0

你测试了上面的代码吗? – Arshad 2013-02-18 14:32:44

+0

为什么你删除了你的搜索查询 – Arshad 2013-02-18 14:34:18