2013-02-18 154 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