WDTF 包含簡單的查詢語言,可簡化根據屬性或關聯性收集目標的工作。 簡單數據評估語言 (SDEL) 類似於 XPath。 如需 XPath 的詳細資訊,請參閱 XPath 參考。
本主題中的下列各節說明如何使用 SDEL。
備註
如需所有命名空間令牌及其內屬性令牌的完整清單,請參閱 SDEL 中的裝置關聯令牌 和 SDEL 中的屬性令牌。
SDEL 語法基本概念
SDEL 會使用屬性令牌來進行匹配並擷取數據。 所有 SDEL 令牌只能包含英數位元和連字元 (-)。
屬性是指附加至目標的數據片段。 屬性中的實際值會儲存為 VARIANT。 如果您將比較運算子放在屬性後面並接上測試值,SDEL 將會執行比較比對。 您應該將測試值放在單引號或雙引號中--此表示法可讓您在測試值中使用實際的單引號或雙引號,但不能同時使用兩者。 如果測試值只包含英數位元和連字元 (-),您可以省略引號。
比較作業
SDEL 允許各種比較運算元遵循屬性令牌。 在比較時,運算子左邊屬性中的實際值會透過 VariantChangeType 方法,轉換為與運算子右邊測試值相同的類型(如 Microsoft Windows SDK 文件所述)。 下表顯示 SDEL 支援的不同比較運算子。
比較運算子的意義:相等 (=)
變更類型之後,會使用 VarCmp 方法進行比較(如 Windows SDK 檔中所述)。
不等(!=)
小於 (<)
小於或等於 (<=)
大於 (>)
大於或等於 (>=)
位元 AND (&)
此運算符會先將類型強制轉換為VT_I8,然後對實際值和測試值執行按位與運算。
未指定任何比較作業 (且未指定任何值)
如果屬性中的實際值類型為 VT_BOOL,則會根據該值滿足比對,也就是說,您不需要比較運算符來執行 “IsDisableable=True”。 否則,如果有任何值(除了 VT_EMPTY 以外),則會滿足比對。
當屬性中有多個實際值(或陣列)時,所有比較運算符都應該被解釋為至少匹配一個值,但不等號運算符除外,其行為正好相反。 如果類型完全無法比較(也就是 VariantChangeType 失敗),則不會有匹配(除了不等運算子,反之亦然)。
瞭解屬性命名空間
SDEL 會使用命名空間標記來群組屬性。 如需所有命名空間令牌及其內屬性令牌的完整清單,請參閱 SDEL 中的屬性令牌。
若要使用根命名空間以外的任何屬性,您必須在屬性前面加上命名空間名稱,然後加上兩個冒號 (::)。 下列 VBScript 程式代碼範例會顯示 Disk::IsRemovable 屬性的值。
WScript.Echo "Is Removable?: " & DeviceObj.GetValue("Disk::IsRemovable")
使用 GetValue 和 Eval 檢查目標
IWDTFTarget2::GetValue 方法讓您查詢目標的屬性。 下列 VBScript 程式代碼範例會列印目標之 FriendlyName 屬性的值。
WScript.Echo "FriendlyName: " & Device.GetValue("FriendlyName")
如需屬性令牌的完整清單,請參閱 SDEL 中的屬性令牌。
您也可以使用 IWDTFTarget2::Eval 方法,針對目標評估 SDEL 語句。 Eval 會 傳回VARIANT_TRUE 或 VARIANT_FALSE。 下列 VBScript 程式代碼範例會使用 Eval 來判斷是否可以停用裝置。
If Device.Eval("IsDisableable=true") Then
WScript.Echo "Target is disableable!"
End If
您也可以使用 Eval 來測試屬性是否存在。 當您將屬性傳遞給Eval但沒有比較運算子或值時,如果屬性或命名空間持有任何非VT_EMPTY的值,Eval 將會傳回VARIANT_TRUE。 下列 VBScript 程式代碼範例會使用 Eval 來判斷目標是否具有 SymbolicLink 關鍵詞。
If Device.Eval("SymbolicLink") Then
WScript.Echo "Target has a SymbolicLink!"
End If
此外,遺漏比較運算符但包含 VT_BOOL 值的屬性會套用隱含 『=true』 比較。 這個隱含比較表示「IsDisableable」相當於「IsDisableable='true'」。
處理人際關係
測試通常牽涉到檢查相關裝置變更狀態時會發生什麼情況。 例如,當USB集線器被停用時,連接到它的裝置能否正確處理狀態變更? 此外,您可能想要根據相關裝置中的資訊來尋找裝置。 為了支援這項功能,SDEL 包含一或多個邏輯關聯性的方法,可在任何屬性或命名空間之前指定一或多個邏輯關聯性(但未在其中一個屬性或命名空間之後)。 關聯標記會以正斜線 (/) 分隔屬性或命名空間。 下列 VBScript 程式代碼範例會列印目標父裝置的 FriendlyName 屬性值。
WScript.Echo "FriendlyName: " & Device.GetValue("parent/FriendlyName")
您也可以結合關聯修飾詞。 下列 VBScript 程式代碼範例會列印目標物件祖系裝置的 FriendlyName 屬性值。
WScript.Echo "FriendlyName: " & Device.GetValue("parent/parent/FriendlyName")
有時候,裝置具有多對多關聯性。 例如,邏輯記憶體磁碟區可能位於許多實體磁碟上,而那些個別磁碟可能會為許多磁碟區貢獻空間。
在 WDTF 中,所有非虛設裝置(也就是實際存在的裝置)都是根裝置的子系(您可以從 RootDevice 屬性擷取)。 如需有關幽靈裝置的詳細資訊,請參閱 建立 WDTF 情境。
使用 GetRelations 來收集目標
下圖顯示 IWDTFTarget2::GetRelations 方法。
IWDTFTarget2::GetRelations 方法只接受 SDEL 語句語法的關聯規範部分,並傳回 IWDTFTargets2 集合介面,其中包含符合關聯準則的所有目標。 下列 VBScript 程式代碼範例會傳回集合,其中包含原始目標及其所有同層級。
Set TestDevices = Device.GetRelations("parent/child/", "")
GetRelations 的第二個參數可以選擇性地包含要傳遞至符合特定關聯性之每個目標的 Eval 方法的語句。 例如,如果您將 IsDisableable=true 新增為第二個參數,上述程式代碼範例只會傳回可以停用的裝置及其同層級。
如果沒有相符項目,將傳回零個項目的集合。
使用查詢語句收集對象
IWDTFDeviceDepot2 介面包含 Query 方法。 這個方法會採用專為 IWDTFTarget2::Eval 方法設計的 SDEL 語句,並傳回 IWDTFTargets2 集合介面的新實例,其中包含符合查詢準則的目標子集。 下列 VBScript 程式代碼範例會列舉所有非虛設裝置,並顯示每個裝置的易記名稱。
For Each Device In WDTF.DeviceDepot.Query("IsPhantom=false")
WScript.Echo Device.GetValue("FriendlyName")
Next
傳回的集合具有 IWDTFTargets2::Query 方法,其實作與 IWDTFDeviceDepot2::Query 完全相同。 IWDTFTargets2::Query 會從符合 SDEL 語句的原始集合傳回目標子集。
SDEL 中的布爾邏輯
IWDTFTarget2::GetRelations 方法只能接受布爾值 OR 運算符,但您對 IWDTFTargets2::Query、IWDTFTarget2::Eval 和 IWDTFTarget2::GetValue 方法的呼叫可以使用布爾值 AND 和 OR 運算符。 針對 Query 方法和 Eval 方法,運算符會像一般布爾運算符一樣運作,如預期般傳回結果。 不過,針對 GetValue 方法, AND 會自行撰寫值, OR 只會傳回找到的第一個值(從左邊開始)。
SDEL 中的括弧
所有 SDEL 語句都可以使用括弧來指定布爾邏輯的評估順序。 您也可以使用括弧,在關聯或命名空間的 語句中將子元素分組。
下列 VBScript 程式代碼範例會擷取祖父母裝置的所有磁碟區和子系。
Set Devices = Device.GetRelations("parent/parent/(child/ OR volume/)", "")
下列 VBScript 程式代碼範例會擷取具有大於 1,000,000 個字節之卸除式媒體之子系的所有裝置。
Set Devices = WDTF.DeviceDepot.Query("child/disk::(IsRemovable=true AND Size>1000000)")
SDEL 語法剖析
如果您將語法錯誤的 SDEL 語句傳遞給 WDTF 中的任何方法,方法將會失敗,並傳回詳細的錯誤資訊並說明問題。
備註
拼錯的屬性、命名空間或關聯標記不會造成語法錯誤,因為 SDEL 的設計是根據目標動態:SDEL 語句必須能夠查詢動態欄位集中的屬性是否存在。