WQL Like声明&句法

时间:2013-02-18 13:40:11

标签: c# wmi wql

我至少看过另外两个关于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

1 个答案:

答案 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

进行查询