Introducción al lenguaje de evaluación de datos simple
WDTF incluye un lenguaje de consulta simple para simplificar la tarea de recopilar destinos en función de atributos o relaciones. El lenguaje de evaluación de datos simple (SDEL) es similar a XPath. Para obtener más información sobre XPath, vea Referencia de XPath.
En las secciones siguientes de este tema se describe cómo puede usar SDEL.
Nota:
Para obtener una lista completa de todos los tokens de espacio de nombres y los tokens de atributo dentro de ellos, consulte Tokens de relación de dispositivo en SDEL y Tokens de atributo en SDEL.
Conceptos básicos de la sintaxis SDEL
SDEL usa tokens de atributo para realizar coincidencias y recuperar datos. Todos los tokens SDEL solo pueden contener caracteres alfanuméricos y guiones (-).
Un atributo hace referencia a una parte de los datos adjuntos a un destino. Los valores reales del atributo se almacenan como VARIANT. Si coloca un operador de comparación seguido de un valor de prueba después del atributo, SDEL realizará una coincidencia de comparación. Debe colocar valores de prueba entre comillas simples o dobles; esta notación le permite usar comillas simples o dobles reales en el valor de prueba, pero no ambos. Si el valor de prueba consta solo de caracteres alfanuméricos y guiones (-), puede omitir las comillas.
Operaciones de comparación
SDEL permite que varios operadores de comparación sigan un token de atributo. En el momento de una comparación, el valor real del atributo a la izquierda del operador se realiza para que sea el mismo tipo del valor de prueba situado a la derecha del operador a través del método VariantChangeType (que se describe en la documentación del SDK de Microsoft Windows). En la tabla siguiente se muestran los distintos operadores de comparación que admite SDEL.
Operador de comparación, Igualdad de significado (=)
Después de cambiar los tipos, se comparan mediante el método VarCmp (que se describe en la documentación de Windows SDK).
Desigualdad (!=)
Menor que (<)
Menor o igual que (<=)
Mayor que (>)
Mayor o igual que (>=)
AND bit a bit (&)
Este operador fuerza a los tipos a VT_I8 antes de realizar un AND bit a bit de los valores reales y de prueba.
No se ha especificado ninguna operación de comparación (y ningún valor)
Si el valor real del atributo es de tipo VT_BOOL, la coincidencia se cumple en función de ese valor, es decir, no es necesario que un operador de comparación realice "IsDisableable=True". De lo contrario, si hay algún valor en absoluto (distinto de VT_EMPTY), se cumple la coincidencia.
Cuando hay más de un valor real (o una matriz) en el atributo, todos los operadores de comparación deben interpretarse para que coincidan al menos con uno, excepto el operador de desigualdad, que tiene el comportamiento opuesto. Si los tipos no se pueden comparar en absoluto (es decir, Se produce un error en VariantChangeType ), no hay ninguna coincidencia (excepto con el operador de desigualdad, que tiene el comportamiento opuesto).
Descripción de los espacios de nombres de atributo
SDEL usa tokens de espacio de nombres para agrupar atributos. Para obtener una lista completa de todos los tokens de espacio de nombres y los tokens de atributo dentro de ellos, consulte Tokens de atributo en SDEL.
Para usar cualquier atributo que esté fuera del espacio de nombres raíz, debe prefijar el atributo con el nombre del espacio de nombres y, a continuación, dos puntos (::). En el siguiente ejemplo de código de VBScript se muestra el valor del atributo Disk::IsRemovable.
WScript.Echo "Is Removable?: " & DeviceObj.GetValue("Disk::IsRemovable")
Examen de un destino mediante GetValue y Eval
El método IWDTFTarget2::GetValue le permite preguntar a un destino sobre sus atributos. En el siguiente ejemplo de código de VBScript se imprime el valor del atributo FriendlyName para un destino.
WScript.Echo "FriendlyName: " & Device.GetValue("FriendlyName")
Para obtener una lista completa de los tokens de atributo, consulte Tokens de atributo en SDEL.
También puede usar el método IWDTFTarget2::Eval para evaluar una instrucción SDEL en un destino. Eval devuelve VARIANT_TRUE o VARIANT_FALSE. En el ejemplo de código de VBScript siguiente se usa Eval para determinar si se puede deshabilitar un dispositivo.
If Device.Eval("IsDisableable=true") Then
WScript.Echo "Target is disableable!"
End If
También puede usar Eval para probar la presencia de un atributo. Al pasar Eval un atributo pero ningún operador de comparación o valor, Eval devolverá VARIANT_TRUE si el atributo o el espacio de nombres contiene cualquier valor (distinto de VT_EMPTY). En el siguiente ejemplo de código de VBScript se usa Eval para determinar si el destino tiene una palabra clave SymbolicLink.
If Device.Eval("SymbolicLink") Then
WScript.Echo "Target has a SymbolicLink!"
End If
Además, los atributos que faltan en un operador de comparación, pero que contienen un valor de VT_BOOL tienen aplicada una comparación implícita "=true". Esta comparación implícita significa que "IsDisableable" es equivalente a "IsDisableable='true'".
Navegar por relaciones
Las pruebas suelen implicar examinar lo que sucede cuando los dispositivos relacionados cambian de estado. Por ejemplo, cuando se deshabilita un concentrador USB, ¿los dispositivos que están conectados a él controlan el estado cambian correctamente? Además, es posible que quiera buscar un dispositivo en función de la información de los dispositivos relacionados. Para admitir esta funcionalidad, SDEL incluye una manera de especificar una o varias relaciones lógicas antes de cualquier atributo o espacio de nombres (pero no después de ninguno de ellos). Los tokens de relación se separan del atributo o espacio de nombres mediante una barra diagonal (/). En el siguiente ejemplo de código de VBScript se imprime el valor del atributo FriendlyName para el dispositivo primario de un destino.
WScript.Echo "FriendlyName: " & Device.GetValue("parent/FriendlyName")
También puede combinar modificadores de relación. En el siguiente ejemplo de código de VBScript se imprime el valor del atributo FriendlyName del dispositivo abuelo del objeto de destino.
WScript.Echo "FriendlyName: " & Device.GetValue("parent/parent/FriendlyName")
A veces, los dispositivos tienen relaciones de varios a varios. Por ejemplo, un volumen de almacenamiento lógico podría residir en muchos discos físicos y esos discos individuales podrían contribuir al espacio en muchos volúmenes.
En WDTF, todos los dispositivos no fantasma (es decir, los dispositivos físicamente presentes) son descendientes del dispositivo raíz (que puede recuperar de la propiedad RootDevice). (Para obtener más información sobre los dispositivos fantasma, consulte Creación de escenarios WDTF).
Recopilación de destinos mediante GetRelations
En la ilustración siguiente se muestra el método IWDTFTarget2::GetRelations.
El método IWDTFTarget2::GetRelations acepta solo la parte del especificador de relación de la sintaxis de la instrucción SDEL y devuelve una interfaz de colección IWDTFTargets2 que contiene todos los destinos que cumplen los criterios de relación. El siguiente ejemplo de código de VBScript devuelve una colección que contiene el destino original y todos sus elementos del mismo nivel.
Set TestDevices = Device.GetRelations("parent/child/", "")
El segundo parámetro para GetRelations puede incluir opcionalmente una instrucción que se pasará al método Eval de cada destino que cumpla la relación específica. Por ejemplo, si agrega IsDisableable=true como segundo parámetro, el ejemplo de código anterior devolverá solo el dispositivo y sus elementos del mismo nivel que se pueden deshabilitar.
Si no hay coincidencias, se devuelve una colección con cero elementos.
Recopilación de destinos mediante la consulta
La interfaz IWDTFDeviceDepot2 contiene un método Query . Este método toma una instrucción SDEL diseñada para el método IWDTFTarget2::Eval y devuelve una nueva instancia de la interfaz de colección IWDTFTargets2 que contiene un subconjunto de los destinos que cumplen los criterios de la consulta. En el siguiente ejemplo de código de VBScript se enumeran todos los dispositivos no fantasma y se muestra el nombre descriptivo de cada dispositivo.
For Each Device In WDTF.DeviceDepot.Query("IsPhantom=false")
WScript.Echo Device.GetValue("FriendlyName")
Next
La colección devuelta tiene el método IWDTFTargets2::Query, que tiene una implementación idéntica a IWDTFDeviceDepot2::Query. IWDTFTargets2::Query devuelve un subconjunto de destinos de la colección original que cumple la instrucción SDEL.
Lógica booleana en SDEL
El método IWDTFTarget2::GetRelations solo puede aceptar el operador OR booleano, pero las llamadas a los métodos IWDTFTargets2::Query, IWDTFTarget2::Eval e IWDTFTarget2::GetValue pueden usar operadores Boolean AND yOR. Para el método Query y el método Eval, los operadores actuarán como operadores booleanos normales, devolviendo el resultado según lo previsto. Sin embargo, para el método GetValue , AND creará los valores en ambos lados de sí mismo, y OR devolverá solo el primer valor que se encuentra (empezando por la izquierda).
Paréntesis en SDEL
Todas las instrucciones SDEL pueden usar paréntesis para especificar la secuencia de evaluación para la lógica booleana. También puede usar paréntesis para agrupar subelementos en una instrucción bajo una relación o un espacio de nombres.
En el siguiente ejemplo de código de VBScript se recuperan todos los volúmenes y elementos secundarios de un dispositivo abuelo.
Set Devices = Device.GetRelations("parent/parent/(child/ OR volume/)", "")
En el siguiente ejemplo de código de VBScript se recuperan todos los dispositivos que tienen un elemento secundario con medios extraíbles que tienen más de 1000 000 bytes.
Set Devices = WDTF.DeviceDepot.Query("child/disk::(IsRemovable=true AND Size>1000000)")
Análisis de sintaxis SDEL
Si pasa una instrucción SDEL con una sintaxis incorrecta a cualquiera de los métodos de WDTF, se producirá un error en el método y se devolverá información detallada del error y se explicará el problema.
Nota:
Un atributo mal escrito, un espacio de nombres o un token de relación no provoca un error de sintaxis, ya que SDEL está diseñado para ser dinámico en función del destino: las instrucciones SDEL deben poder consultar la existencia de un atributo en un conjunto de campos dinámicos.