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

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

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

Примечание.

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

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

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

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

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

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

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

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

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

Меньше (<)

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

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

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

Битовая И (> )

Этот оператор заставляет типы VT_I8 перед выполнением побитового И фактических и тестовых значений.

Операция сравнения (и значение не указано)

Если фактическое значение в атрибуте имеет тип VT_BOOL, соответствие удовлетворяется на основе этого значения, т. е. не требуется оператор сравнения "IsDisable=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, чтобы определить, имеет ли целевой объект символьную связь ключевое слово.

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

Кроме того, атрибуты, которые отсутствуют оператор сравнения, но содержат значение VT_BOOL , имеют неявное сравнение "=true" применяется к ним. Это неявное сравнение означает, что "IsDisableable" эквивалентен IsDisable='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 с отдельными и связанными целевыми объектами.

Метод 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 может принимать только логический оператор OR, но ваши вызовы к IWDTFTargets2::Query, IWDTFTarget2::Eval и IWDTFTarget2::GetValue могут использовать логические операторы AND и OR. Для метода Query и метода Eval операторы будут действовать как обычные логические операторы, возвращая результат, как ожидалось. Однако для метода GetValue и будет создавать значения на обеих сторонах себя, и OR возвращает только первое найденное значение (начиная с левого).

Скобки в SDEL

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

В следующем примере кода VBScript извлекаются все тома и дочерние объекты бабушки и дедушки.

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

В следующем примере кода VBScript извлекаются все устройства с дочерним устройством с съемным носителем, превышающим 1000 000 байт.

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

Синтаксический анализ SDEL

Если вы передаете инструкцию SDEL с неправильным синтаксисом любому из методов в WDTF, метод завершится ошибкой и подробными сведениями об ошибке будут возвращены и объяснить проблему.

Примечание.

Атрибут с ошибкой, пространство имен или маркер отношения не вызывает синтаксическую ошибку, так как SDEL предназначен для динамической обработки на основе целевого объекта: инструкции SDEL должны иметь возможность запрашивать существование атрибута в динамическом наборе полей.