Freigeben über


Übersicht über einfache Datenauswertungssprache

WDTF enthält eine einfache Abfragesprache, um die Aufgabe zu vereinfachen, Ziele basierend auf Attributen oder Beziehungen zu sammeln. Die Einfache Datenauswertungssprache (Simple Data Evaluation Language, SDEL) ähnelt XPath. Weitere Informationen zu XPath finden Sie in der XPath-Referenz.

In den folgenden Abschnitten in diesem Thema wird beschrieben, wie Sie SDEL verwenden können.

Hinweis

Eine vollständige Liste aller Namespacetoken und der darin enthaltenen Attributtoken finden Sie unter Gerätebeziehungstoken in SDEL und Attributtoken in SDEL.

Grundlagen der SDEL-Syntax

SDEL verwendet Attributtoken, um Übereinstimmungen auszuführen und Daten abzurufen. Alle SDEL-Token können nur alphanumerische Zeichen und Bindestriche (-) enthalten.

Ein Attribut bezieht sich auf ein Element , das an ein Ziel angefügt ist. Tatsächliche Werte im Attribut werden als VARIANT gespeichert. Wenn Sie einen Vergleichsoperator gefolgt von einem Testwert nach dem Attribut platzieren, führt SDEL eine Vergleichsvergleichsvergleichung durch. Sie sollten Testwerte in einfache oder doppelte Anführungszeichen setzen – mit dieser Notation können Sie tatsächliche einfache oder doppelte Anführungszeichen in Ihrem Testwert verwenden, aber nicht beides. Wenn der Testwert aus nur alphanumerischen Zeichen und Bindestrichen (-) besteht, können Sie die Anführungszeichen weglassen.

Vergleichsvorgänge

SDEL ermöglicht es verschiedenen Vergleichsoperatoren, einem Attributtoken zu folgen. Zum Zeitpunkt eines Vergleichs wird der tatsächliche Wert im Attribut links vom Operator als derselbe Typ des Testwerts rechts vom Operator über die VariantChangeType-Methode (die in der Microsoft Windows SDK-Dokumentation beschrieben wird) festgelegt. Die folgende Tabelle zeigt die verschiedenen Vergleichsoperatoren, die SDEL unterstützt.

Vergleichsoperator Bedeutung Gleichheit (=)

Nachdem die Typen geändert wurden, werden sie mithilfe der VarCmp-Methode verglichen (die in der Windows SDK-Dokumentation beschrieben wird).

Ungleichheit (!=)

Kleiner als (<)

Kleiner als oder gleich (<=)

Größer als (>)

Größer als oder gleich (>=)

Bitweise UND (&)

Dieser Operator erzwingt typen VT_I8, bevor ein bitweises UND der tatsächlichen und Testwerte ausgeführt werden.

Kein Vergleichsvorgang (und kein Wert) angegeben

Wenn der tatsächliche Wert im Attribut vom Typ VT_BOOL ist, wird die Übereinstimmung basierend auf diesem Wert erfüllt, d. h., Sie benötigen keinen Vergleichsoperator, um "IsDisableable=True" zu tun. Andernfalls ist die Übereinstimmung erfüllt, wenn überhaupt ein Wert vorhanden ist (außer VT_EMPTY).

Wenn mehr als ein tatsächlicher Wert (oder ein Array) im Attribut vorhanden ist, sollten alle Vergleichsoperatoren so interpretiert werden, dass sie mit mindestens einem übereinstimmen, mit Ausnahme des Ungleichheitsoperators, der das gegenteilige Verhalten aufweist. Wenn die Typen überhaupt nicht verglichen werden können (d. a . VariantChangeType schlägt fehl), gibt es keine Übereinstimmung (außer mit dem Ungleichheitsoperator, der das gegenteilige Verhalten aufweist).

Grundlegendes zu Attributnamespaces

SDEL verwendet Namespacetoken zum Gruppieren von Attributen. Eine vollständige Liste aller Namespacetoken und der darin enthaltenen Attributtoken finden Sie unter Attributtoken in SDEL.

Wenn Sie ein Attribut verwenden möchten, das sich außerhalb des Stammnamespaces befindet, müssen Sie dem Attribut den Namespacenamen und dann zwei Doppelpunkte (::)) voranstellen. Im folgenden VBScript-Codebeispiel wird der Wert des Attributs Disk::IsRemovable angezeigt.

WScript.Echo "Is Removable?: " & DeviceObj.GetValue("Disk::IsRemovable")

Untersuchen eines Ziels mithilfe von GetValue und Eval

Mit der IWDTFTarget2::GetValue-Methode können Sie ein Ziel zu seinen Attributen fragen. Im folgenden VBScript-Codebeispiel wird der Wert des FriendlyName-Attributs für ein Ziel gedruckt.

WScript.Echo "FriendlyName: " & Device.GetValue("FriendlyName")

Eine vollständige Liste der Attributtoken finden Sie unter Attributtoken in SDEL.

Sie können auch die IWDTFTarget2::Eval-Methode verwenden, um eine SDEL-Anweisung für ein Ziel auszuwerten. Eval gibt VARIANT_TRUE oder VARIANT_FALSE zurück. Im folgenden VBScript-Codebeispiel wird mithilfe von Eval ermittelt, ob ein Gerät deaktiviert werden kann.

If Device.Eval("IsDisableable=true") Then
    WScript.Echo "Target is disableable!"
End If

Sie können auch Eval verwenden, um das Vorhandensein eines Attributs zu testen. Wenn Sie Eval ein Attribut, aber keinen Vergleichsoperator oder -wert übergeben, gibt Eval VARIANT_TRUE zurück, wenn das Attribut oder der Namespace einen anderen Wert (außer VT_EMPTY) enthält. Im folgenden VBScript-Codebeispiel wird Eval verwendet, um zu ermitteln, ob das Ziel ein Symbollink-Schlüsselwort (keyword) aufweist.

If Device.Eval("SymbolicLink") Then
    WScript.Echo "Target has a SymbolicLink!"
End If

Darüber hinaus haben Attribute, die einen Vergleichsoperator fehlen, aber einen VT_BOOL Wert enthalten, einen impliziten Vergleich "=true" angewendet. Dieser implizite Vergleich bedeutet, dass "IsDisableable" gleichbedeutend mit "IsDisableable='true'" ist.

Bei Tests wird häufig untersucht, was passiert, wenn sich der Zustand der zugehörigen Geräte ändert. Wenn beispielsweise ein USB-Hub deaktiviert ist, ändern sich die an ihn angeschlossenen Geräte ordnungsgemäß? Darüber hinaus können Sie ein Gerät basierend auf Informationen in verwandten Geräten suchen. Um diese Funktionalität zu unterstützen, bietet SDEL eine Möglichkeit zum Angeben einer oder mehrerer logischer Beziehungen vor einem Attribut oder Namespace (aber nicht nach einem dieser Beziehungen). Beziehungstoken werden durch einen Schrägstrich (/) vom Attribut oder Namespace getrennt. Im folgenden VBScript-Codebeispiel wird der Wert des FriendlyName-Attributs für das übergeordnete Gerät eines Ziels gedruckt.

WScript.Echo "FriendlyName: " & Device.GetValue("parent/FriendlyName")

Sie können auch Beziehungsmodifizierer kombinieren. Im folgenden VBScript-Codebeispiel wird der Wert des FriendlyName-Attributs des Großelterngeräts des Zielobjekts gedruckt.

WScript.Echo "FriendlyName: " & Device.GetValue("parent/parent/FriendlyName")

Manchmal verfügen Geräte über n:n-Beziehungen. Beispielsweise kann sich ein logisches Speichervolume auf vielen physischen Datenträgern befinden, und diese einzelnen Datenträger können Speicherplatz zu vielen Volumes beitragen.

Innerhalb von WDTF sind alle Nicht-Phantomgeräte (d. a. geräte physisch vorhanden) untergeordnete Elemente des Stammgeräts (die Sie aus der RootDevice-Eigenschaft abrufen können). (Weitere Informationen zu Phantomgeräten finden Sie unter Erstellen von WDTF-Szenarien.)

Sammeln von Zielen mithilfe von GetRelations

Die folgende Abbildung zeigt die IWDTFTarget2::GetRelations-Methode.

Diagramm, das die Target::GetRelations-Methode in WDTF veranschaulicht, die einzelne und verwandte Ziele anzeigt.

Die IWDTFTarget2::GetRelations-Methode akzeptiert nur den Beziehungsbezeichnerteil der SDEL-Anweisungssyntax und gibt eine IWDTFTargets2-Auflistungsschnittstelle zurück, die alle Ziele enthält, die die Beziehungskriterien erfüllen. Im folgenden VBScript-Codebeispiel wird eine Auflistung zurückgegeben, die das ursprüngliche Ziel und alle gleichgeordneten Elemente enthält.

Set TestDevices = Device.GetRelations("parent/child/", "")

Der zweite Parameter für GetRelations kann optional eine Anweisung enthalten, die an die Eval-Methode jedes Ziels übergeben wird, das die spezifische Beziehung erfüllt. Wenn Sie beispielsweise IsDisableable=true als zweiten Parameter hinzufügen, würde im vorherigen Codebeispiel nur das Gerät und die gleichgeordneten Elemente zurückgegeben, die deaktiviert werden können.

Wenn keine Übereinstimmungen vorhanden sind, wird eine Auflistung mit null Elementen zurückgegeben.

Sammeln von Zielen mithilfe von Abfrage

Die IWDTFDeviceDepot2-Schnittstelle enthält eine Query-Methode . Diese Methode verwendet eine SDEL-Anweisung, die für die IWDTFTarget2::Eval-Methode entwickelt wurde, und gibt eine neue Instanz der IWDTFTargets2-Auflistungsschnittstelle zurück, die eine Teilmenge der Ziele enthält, die den Kriterien der Abfrage entsprechen. Im folgenden VBScript-Codebeispiel werden alle Nicht-Phantomgeräte aufgelistet und der Anzeigename für jedes Gerät angezeigt.

For Each Device In WDTF.DeviceDepot.Query("IsPhantom=false")
    WScript.Echo Device.GetValue("FriendlyName")
Next

Die zurückgegebene Auflistung weist die IWDTFTargets2::Query-Methode auf, die eine identische Implementierung mit IWDTFDeviceDepot2::Query aufweist. IWDTFTargets2::Query gibt eine Teilmenge von Zielen aus der ursprünglichen Auflistung zurück, die die SDEL-Anweisung erfüllt.

Boolesche Logik in SDEL

Die IWDTFTarget2::GetRelations-Methode kann nur den booleschen OR-Operator akzeptieren, aber Ihre Aufrufe an die IWDTFTargets2::Query-, IWDTFTarget2::Eval- und IWDTFTarget2::GetValue-Methoden können boolesche AND- und OR-Operatoren verwenden. Bei der Query-Methode und der Eval-Methode funktionieren die Operatoren wie normale boolesche Operatoren und geben das Ergebnis wie erwartet zurück. Für die GetValue-Methodeerstellt AND jedoch die Werte auf beiden Seiten von sich selbst, und OR gibt nur den ersten gefundenen Wert zurück (beginnend mit der linken Seite).

Klammern in SDEL

Alle SDEL-Anweisungen können Klammern verwenden, um die Auswertungssequenz für boolesche Logik anzugeben. Sie können auch Klammern verwenden, um Unterelemente in einer Anweisung unter einer Beziehung oder einem Namespace zu gruppieren.

Im folgenden VBScript-Codebeispiel werden alle Volumes und untergeordneten Elemente eines Großelterngeräts abgerufen.

Set Devices = Device.GetRelations("parent/parent/(child/ OR volume/)", "")

Im folgenden VBScript-Codebeispiel werden alle Geräte mit untergeordneten Medien mit Wechselmedien abgerufen, die größer als 1.000.000 Byte sind.

Set Devices = WDTF.DeviceDepot.Query("child/disk::(IsRemovable=true AND Size>1000000)")

SDEL-Syntaxanalyse

Wenn Sie eine SDEL-Anweisung mit einer ungültigen Syntax an eine der Methoden in WDTF übergeben, schlägt die Methode fehl, und detaillierte Fehlerinformationen werden zurückgegeben und das Problem erläutert.

Hinweis

Ein falsch geschriebenes Attribut, Namespace oder Beziehungstoken verursacht keinen Syntaxfehler, da SDEL so konzipiert ist, dass es dynamisch auf der Grundlage des Ziels ist: SDEL-Anweisungen müssen in der Lage sein, das Vorhandensein eines Attributs in einem dynamischen Feldsatz abzufragen.