Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WQL-Like语句和语法_C#_Wmi_Wql - Fatal编程技术网

C# WQL-Like语句和语法

C# WQL-Like语句和语法,c#,wmi,wql,C#,Wmi,Wql,我已经看到了至少两个关于WMI的其他问题,但没有一个对我的问题有答案,所以在这里 我在代码中试验WMI接口。基本上这就是我现在所拥有的,而且它是有效的。但在我看来,我可以更有效地写作: 公共bool GetUsbStateByIdstring id { bool returnValue=false try { ObjectQuery query = new ObjectQuery(); query.QueryString = string.Format("Select

我已经看到了至少两个关于WMI的其他问题,但没有一个对我的问题有答案,所以在这里

我在代码中试验WMI接口。基本上这就是我现在所拥有的,而且它是有效的。但在我看来,我可以更有效地写作:

公共bool GetUsbStateByIdstring 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.FormatSelect*来自Win32_PnPDevice,其中SystemElement类似“{0}%”,id;

这会持续引发查询不正确的异常

所以我尝试了这个:

query.QueryString=string.format从Win32\u pDevice中选择SystemElement;

这同样有效,所以下一步我尝试了Win32_PnPDevice.SystemElement,但这也不起作用

我在网上看到的任何例子都是这样的

从Win32_服务中选择* 其中的名称类似于%SQL%

但是c无法解析%SQL%语句周围的双引号,使用\escape字符也不会产生任何结果

为了测试我的代码和下面发布的代码,我使用了来自Microsoft的


但是你不能在Win32_PNPDevice上应用like query,因为我尝试在我的代码中使用它,但正如我之前所说的那样,它似乎不起作用,尽管我希望它能起作用。我使用的代码如下所示,来自微软的WMI代码创建者为什么你删除了搜索查询我尝试了你的代码,它确实起了作用。我删除了查询,因为我可以获得正确的格式。请给我一分钟,我将再次添加它。我尝试将其与我的代码一起使用,但正如我之前所述,这似乎不起作用,即使我使用它来工作。我使用的代码是从microsoft try的WMI代码创建者处获取的以下代码{ManagementObjectSearcher searcher=new ManagementObjectSearcherroot\\CIMV2,从Win32\u PnPDevice中选择*系统元素,如“%HDAUDIO%”;}捕获管理异常e{}我的apollogies for the format我得到的错误是查询的语法不正确。我假设这与like语句有关。因为当我用SystemElement替换星号时,它会正确解析并返回值。很显然,microsoft没有像这里讨论的那样为ref类实现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);
            }
        }
    }
}