Общие сведения о языке простой оценки данных

WDTF включает простой язык запросов, упрощающий задачу сбора целевых объектов на основе атрибутов или связей. Простой язык оценки данных (SDEL) аналогичен XPath. Дополнительные сведения о XPath см. в справочнике по XPath.

В следующих разделах этого раздела описывается, как можно использовать SDEL.

Примечание

Полный список всех маркеров пространства имен и маркеров атрибутов в них см. в разделах Токены связи устройств в SDEL и Токены атрибутов в SDEL.

Основы синтаксиса SDEL

SDEL использует маркеры атрибутов для выполнения совпадений и извлечения данных. Все токены SDEL могут содержать только буквенно-цифровые символы и дефис (-).

Атрибут ссылается на элемент данных, присоединенный к целевому объекту. Фактические значения в атрибуте хранятся в виде VARIANT. Если вы размещаете оператор сравнения, за которым следует тестовое значение после атрибута, SDEL выполнит сопоставление сравнения. Тестовые значения следует помещать в одинарные или двойные кавычки. Эта нотация позволяет использовать в тестовых значениях фактические одинарные или двойные кавычки, но не оба. Если тестовое значение состоит только из буквенно-цифровых символов и дефисов (-), можно опустить кавычки.

Операции сравнения

SDEL позволяет различным операторам сравнения следовать маркеру атрибута. Во время сравнения фактическое значение в атрибуте слева от оператора становится таким же типом тестового значения справа от оператора с помощью метода VariantChangeType (описанного в документации по Microsoft Windows SDK). В следующей таблице показаны различные операторы сравнения, поддерживаемые SDEL.

Оператор сравнения— значение равенства (=)

После изменения типов они сравниваются с помощью метода VarCmp (который описан в документации по Windows SDK).

Неравенство (!=)

Знак "меньше" (<)

Меньше или равно (<=)

Знак "больше" (>)

Больше или равно (>=)

Побитовое И (&)

Этот оператор заставляет типы 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 без оператора или значения сравнения Eval возвращает VARIANT_TRUE , если атрибут или пространство имен содержит любое значение (кроме VT_EMPTY). В следующем примере кода 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 .

Схема, иллюстрирующая метод Target::GetRelations в WDTF с отдельными и rlated целевыми объектами.

Метод IWDTFTarget2::GetRelations принимает только часть описателя отношения синтаксиса инструкции SDEL и возвращает интерфейс коллекции IWDTFTargets2 , содержащий все целевые объекты, соответствующие критериям связи. Следующий пример кода VBScript возвращает коллекцию, содержащую исходный целевой объект и все его одноуровневые элементы.

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

Второй параметр для GetRelations может при необходимости включать инструкцию, передаваемую методу Eval каждого целевого объекта, соответствующего определенной связи. Например, если добавить IsDisableable=true в качестве второго параметра, предыдущий пример кода вернет только устройство и его одноуровневые значения, которые можно отключить.

Если совпадений нет, возвращается коллекция с нулевыми элементами.

Сбор целевых объектов с помощью запроса

Интерфейс IWDTFDeviceDepot2 содержит метод Query . Этот метод принимает инструкцию SDEL, предназначенную для метода IWDTFTarget2::Eval , и возвращает новый экземпляр интерфейса коллекции 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 может принимать только оператор Boolean OR , но вызовы методов IWDTFTargets2::Query, IWDTFTarget2::Eval и IWDTFTarget2::GetValue могут использовать операторы Boolean 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 должны иметь возможность запрашивать наличие атрибута в динамическом наборе полей.