【问题标题】:WQL Like statement & syntaxWQL Like 语句和语法
【发布时间】: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

【问题讨论】:

标签: c# wmi wql


【解决方案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

【讨论】:

  • 我尝试在我的代码中使用它,但正如我之前所说的那样,这似乎不起作用,即使我除了它工作。我使用的代码如下(取自微软的 WMI 代码创建者)
  • 你为什么要删除你的搜索查询
  • 是的,我试过你的代码,它确实有效。我删除了查询,因为我可以获得正确的格式。给我一分钟,我再补充一遍
  • 我尝试在我的代码中使用它,但正如我之前所说的那样,这似乎不起作用,即使我除了它工作。我使用的代码如下(取自微软的 WMI 代码创建者)尝试 { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_PnPDevice where SystemElement like '%HDAUDIO%'"); } catch (ManagementException e) { } 我对格式的道歉
  • 我得到的错误是查询的语法不正确。我认为这与 like 声明有关。因为当我用 SystemElement 替换星号时,它会正确解析并返回值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2012-06-03
  • 1970-01-01
相关资源
最近更新 更多