Panoramica del linguaggio simple data evaluation
WDTF include un linguaggio di query semplice per semplificare l'attività di raccolta di destinazioni in base a attributi o relazioni. Simple Data Evaluation Language (SDEL) è simile a XPath. Per altre informazioni su XPath, vedere Informazioni di riferimento su XPath.
Le sezioni seguenti di questo argomento descrivono come usare SDEL.
Nota
Per un elenco completo di tutti i token dello spazio dei nomi e dei token di attributo all'interno di essi, vedere Token di relazione del dispositivo in SDEL e Token di attributo in SDEL.
Nozioni di base sulla sintassi SDEL
SDEL usa token di attributo per eseguire corrispondenze e recuperare i dati. Tutti i token SDEL possono contenere solo caratteri alfanumerici e trattini (-).
Un attributo fa riferimento a una parte di dati collegati a una destinazione. I valori effettivi nell'attributo vengono archiviati come VARIANT. Se si inserisce un operatore di confronto seguito da un valore di test dopo l'attributo, SDEL eseguirà una corrispondenza di confronto. È consigliabile inserire valori di test tra virgolette singole o doppie. Questa notazione consente di usare virgolette singole o doppie effettive nel valore di test, ma non entrambe. Se il valore di test è costituito solo da caratteri alfanumerici e trattini (-), è possibile omettere le virgolette.
Operazioni di confronto
SDEL consente a vari operatori di confronto di seguire un token di attributo. Al momento di un confronto, il valore effettivo nell'attributo a sinistra dell'operatore viene eseguito per essere lo stesso tipo del valore di test a destra dell'operatore tramite il metodo VariantChangeType (descritto nella documentazione di Microsoft Windows SDK). La tabella seguente illustra i diversi operatori di confronto supportati da SDEL.
Operatore di confronto Significato uguaglianza (=)
Dopo aver modificato i tipi, questi vengono confrontati usando il metodo VarCmp (descritto nella documentazione di Windows SDK).
Disuguaglianza (!=)
Meno di (<)
Minore o uguale (<=)
Maggiore di (>)
Maggiore o uguale a (>=)
AND bit per bit (&)
Questo operatore forza i tipi a VT_I8 prima di eseguire un AND bit per bit dei valori effettivi e di test.
Nessuna operazione di confronto (e nessun valore) specificata
Se il valore effettivo nell'attributo è di tipo VT_BOOL, la corrispondenza viene soddisfatta in base a tale valore, ovvero non è necessario un operatore di confronto per eseguire "IsDisableable=True". In caso contrario, se è presente un valore (diverso da VT_EMPTY), la corrispondenza viene soddisfatta.
Quando nell'attributo è presente più di un valore effettivo (o una matrice), tutti gli operatori di confronto devono essere interpretati in modo che corrispondano almeno uno, ad eccezione dell'operatore di disuguaglianza, che ha il comportamento opposto. Se i tipi non possono essere confrontati affatto (ovvero VariantChangeType ha esito negativo), non esiste alcuna corrispondenza (tranne che con l'operatore di disuguaglianza, che ha il comportamento opposto).
Informazioni sugli spazi dei nomi degli attributi
SDEL usa i token dello spazio dei nomi per raggruppare gli attributi. Per un elenco completo di tutti i token dello spazio dei nomi e dei token di attributo all'interno di essi, vedere Token di attributo in SDEL.
Per usare qualsiasi attributo esterno allo spazio dei nomi radice, è necessario anteporre all'attributo il nome dello spazio dei nomi e quindi due punti (::). Nell'esempio di codice VBScript seguente viene visualizzato il valore dell'attributo Disk::IsRemovable.
WScript.Echo "Is Removable?: " & DeviceObj.GetValue("Disk::IsRemovable")
Esame di una destinazione tramite GetValue ed Eval
Il metodo IWDTFTarget2::GetValue consente di chiedere a una destinazione i relativi attributi. Nell'esempio di codice VBScript seguente viene stampato il valore dell'attributo FriendlyName per una destinazione.
WScript.Echo "FriendlyName: " & Device.GetValue("FriendlyName")
Per un elenco completo dei token di attributo, vedere Token di attributo in SDEL.
È anche possibile usare il metodo IWDTFTarget2::Eval per valutare un'istruzione SDEL rispetto a una destinazione. Eval restituisce VARIANT_TRUE o VARIANT_FAL edizione Standard. Nell'esempio di codice VBScript seguente viene usato Eval per determinare se un dispositivo può essere disabilitato.
If Device.Eval("IsDisableable=true") Then
WScript.Echo "Target is disableable!"
End If
È anche possibile usare Eval per verificare la presenza di un attributo. Quando si passa un attributo Eval ma non viene passato alcun operatore o valore di confronto, Eval restituirà VARIANT_TRUE se l'attributo o lo spazio dei nomi contiene qualsiasi valore (diverso da VT_EMPTY). Nell'esempio di codice VBScript seguente viene usato Eval per determinare se la destinazione ha una parola chiave SymbolicLink.
If Device.Eval("SymbolicLink") Then
WScript.Echo "Target has a SymbolicLink!"
End If
Inoltre, gli attributi che mancano un operatore di confronto ma contengono un valore VT_BOOL hanno un confronto implicito '=true' applicato. Questo confronto implicito indica che "IsDisableable" equivale a "IsDisableable='true'".
Spostamento tra relazioni
I test spesso comportano l'analisi di cosa accade quando i dispositivi correlati cambiano lo stato. Ad esempio, quando un hub USB è disabilitato, i dispositivi collegati gestiscono correttamente la modifica dello stato? Inoltre, potrebbe essere necessario individuare un dispositivo in base alle informazioni nei dispositivi correlati. Per supportare questa funzionalità, SDEL include un modo per specificare una o più relazioni logiche prima di qualsiasi attributo o spazio dei nomi (ma non dopo entrambi). I token di relazione sono separati dall'attributo o dallo spazio dei nomi da una barra (/). Nell'esempio di codice VBScript seguente viene stampato il valore dell'attributo FriendlyName per il dispositivo padre di una destinazione.
WScript.Echo "FriendlyName: " & Device.GetValue("parent/FriendlyName")
È anche possibile combinare modificatori di relazione. Nell'esempio di codice VBScript seguente viene stampato il valore dell'attributo FriendlyName del dispositivo padre dell'oggetto di destinazione.
WScript.Echo "FriendlyName: " & Device.GetValue("parent/parent/FriendlyName")
In alcuni casi, i dispositivi hanno relazioni molti-a-molti. Ad esempio, un volume di archiviazione logico potrebbe risiedere in molti dischi fisici e questi singoli dischi potrebbero contribuire a molti volumi.
All'interno di WDTF, tutti i dispositivi non fantasma (ovvero i dispositivi fisicamente presenti) sono discendenti del dispositivo radice (che è possibile recuperare dalla proprietà RootDevice ). Per altre informazioni sui dispositivi fantasma, vedere Creazione di scenari WDTF.
Raccolta di destinazioni tramite GetRelations
La figura seguente mostra il metodo IWDTFTarget2::GetRelations.
Il metodo IWDTFTarget2::GetRelations accetta solo la parte dell'identificatore di relazione della sintassi dell'istruzione SDEL e restituisce un'interfaccia di raccolta IWDTFTargets2 che contiene tutte le destinazioni che soddisfano i criteri di relazione. Nell'esempio di codice VBScript seguente viene restituita una raccolta contenente la destinazione originale e tutti i relativi elementi di pari livello.
Set TestDevices = Device.GetRelations("parent/child/", "")
Il secondo parametro per GetRelations può facoltativamente includere un'istruzione da passare al metodo Eval di ogni destinazione che soddisfa la relazione specifica. Ad esempio, se si aggiunge IsDisableable=true come secondo parametro, l'esempio di codice precedente restituirà solo il dispositivo e i relativi elementi di pari livello che possono essere disabilitati.
Se non sono presenti corrispondenze, viene restituita una raccolta con zero elementi.
Raccolta di destinazioni tramite query
L'interfaccia IWDTFDeviceDepot2 contiene un metodo Query. Questo metodo accetta un'istruzione SDEL progettata per il metodo IWDTFTarget2::Eval e restituisce una nuova istanza dell'interfaccia dell'insieme IWDTFTargets2 che contiene un subset delle destinazioni che soddisfano i criteri della query. Nell'esempio di codice VBScript seguente vengono enumerati tutti i dispositivi non fantasma e viene visualizzato il nome descrittivo per ogni dispositivo.
For Each Device In WDTF.DeviceDepot.Query("IsPhantom=false")
WScript.Echo Device.GetValue("FriendlyName")
Next
La raccolta restituita ha il metodo IWDTFTargets2::Query , che ha un'implementazione identica a IWDTFDeviceDepot2::Query. IWDTFTargets2::Query restituisce un subset di destinazioni dalla raccolta originale che soddisfa l'istruzione SDEL.
Logica booleana in SDEL
Il metodo IWDTFTarget2::GetRelations può accettare solo l'operatore OR booleano, ma le chiamate agli operatori IWDTFTargets2::Query, IWDTFTarget2::Eval e IWDTFTarget2::GetValue possono usare operatori AND eOR booleani. Per il metodo Query e il metodo Eval , gli operatori funzioneranno come normali operatori booleani, restituendo il risultato come previsto. Tuttavia, per il metodo GetValue , AND comporrà i valori su entrambi i lati di se stesso e OR restituirà solo il primo valore trovato (a partire dalla sinistra).
Parentesi in SDEL
Tutte le istruzioni SDEL possono usare parentesi per specificare la sequenza di valutazione per la logica booleana. È anche possibile usare le parentesi per raggruppare i sottoelementi in un'istruzione in una relazione o in uno spazio dei nomi.
Nell'esempio di codice VBScript seguente vengono recuperati tutti i volumi e gli elementi figlio di un dispositivo nonno.
Set Devices = Device.GetRelations("parent/parent/(child/ OR volume/)", "")
Nell'esempio di codice VBScript seguente vengono recuperati tutti i dispositivi con un elemento figlio con supporti rimovibili maggiori di 1.000.000 byte.
Set Devices = WDTF.DeviceDepot.Query("child/disk::(IsRemovable=true AND Size>1000000)")
Analisi della sintassi SDEL
Se si passa un'istruzione SDEL con sintassi non valida a uno dei metodi in WDTF, il metodo avrà esito negativo e verranno restituite informazioni dettagliate sull'errore e verrà spiegato il problema.
Nota
Un attributo, uno spazio dei nomi o un token di relazione con errori di ortografia non causa un errore di sintassi, perché SDEL è progettato per essere dinamico in base alla destinazione: le istruzioni SDEL devono essere in grado di eseguire query per l'esistenza di un attributo in un set di campi dinamici.