다음을 통해 공유


간단한 데이터 평가 언어 개요

WDTF에는 특성 또는 관계를 기반으로 대상을 수집하는 작업을 간소화하는 간단한 쿼리 언어가 포함되어 있습니다. SDEL(단순 데이터 평가 언어)은 XPath와 유사합니다. XPath에 대한 자세한 내용은 XPath 참조를 참조 하세요.

이 항목 내의 다음 섹션에서는 SDEL을 사용하는 방법을 설명합니다.

참고 항목

모든 네임스페이스 토큰 및 해당 토큰 내의 특성 토큰의 전체 목록은 SDEL의 디바이스 관계 토큰 및 SDEL의 특성 토큰을 참조하세요.

SDEL 구문 기본 사항

SDEL은 특성 토큰을 사용하여 일치를 수행하고 데이터를 검색합니다. 모든 SDEL 토큰은 영숫자 문자와 하이픈(-)만 포함할 수 있습니다.

특성대상에 연결된 데이터를 나타냅니다. 특성의 실제 값은 VARIANT저장됩니다. 비교 연산자를 배치한 다음 특성 뒤에 테스트 값을 배치하면 SDEL이 비교 일치를 수행합니다. 테스트 값을 작은따옴표나 큰따옴표로 묶어야 합니다. 이 표기법을 사용하면 테스트 값에 실제 작은따옴표나 큰따옴표를 사용할 수 있지만 둘 다 사용할 수는 없습니다. 테스트 값이 영숫자 문자와 하이픈(-)으로만 구성된 경우 따옴표를 생략할 수 있습니다.

비교 작업

SDEL을 사용하면 다양한 비교 연산자가 특성 토큰을 따를 수 있습니다. 비교 시 연산자 왼쪽에 있는 특성의 실제 값은 VariantChangeType 메서드(Microsoft Windows SDK 설명서에 설명됨)를 통해 연산자 오른쪽에 있는 테스트 값의 동일한 형식으로 만들어집니다. 다음 표에서는 SDEL에서 지원하는 다양한 비교 연산자를 보여 줍니다.

비교 연산자 의미 같음(=)

형식이 변경된 후 VarCmp 메서드(Windows SDK 설명서에 설명됨)를 사용하여 비교됩니다.

같지 않음(!=)

미만(<)

작거나 같음(<=)

보다 큼(>)

크거나 같음(>=)

비트 AND(>)

이 연산자는 실제 및 테스트 값의 비트 AND를 수행하기 전에 형식을 강제로 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 특성을 전달하지만 비교 연산자나 값은 전달하지 않으면 특성 또는 네임스페이스에 VT_EMPTY 이외의 값이 있으면 Eval이 VARIANT_TRUE 반환합니다. 다음 VBScript 코드 예제에서는 Eval을 사용하여 대상에 SymbolicLink 키워드(keyword) 있는지 확인합니다.

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

또한 비교 연산자가 누락되었지만 VT_BOOL 값이 포함된 특성에는 암시적 '=true' 비교가 적용됩니다. 이 암시적 비교는 "IsDisable"이 "IsDisable='true'"에 해당한다는 것을 의미합니다.

테스트에는 관련 디바이스가 상태를 변경할 때 발생하는 작업을 검사하는 작업이 포함되는 경우가 많습니다. 예를 들어 USB 허브를 사용하지 않도록 설정한 경우 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 메서드를 보여 줍니다 .

개별 및 관련 대상을 보여 주는 WDTF의 Target::GetRelations 메서드를 보여 주는 다이어그램

IWDTFTarget2::GetRelations 메서드는 SDEL 문 구문의 관계 지정자 부분만 허용하고 관계 조건을 충족하는 모든 대상이 포함된 IWDTFTargets2 컬렉션 인터페이스를 반환합니다. 다음 VBScript 코드 예제에서는 원래 대상과 모든 형제를 포함하는 컬렉션을 반환합니다.

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

GetRelations두 번째 매개 변수는 필요에 따라 특정 관계를 충족하는 각 대상의 Eval 메서드에 전달할 문을 포함할 수 있습니다. 예를 들어 IsDisable=true를 두 번째 매개 변수로 추가하는 경우 앞의 코드 예제에서는 사용하지 않도록 설정할 수 있는 디바이스와 해당 형제만 반환합니다.

일치하는 항목이 없으면 항목이 0인 컬렉션이 반환됩니다.

쿼리를 사용하여 대상 수집

IWDTFDeviceDepot2 인터페이스에는 Query 메서드가 포함되어 있습니다. 이 메서드는 IWDTFTarget2::Eval 메서드용으로 설계된 SDEL 문을 사용하고 쿼리 조건을 충족하는 대상의 하위 집합을 포함하는 IWDTFTargets2 컬렉션 인터페이스의 새 인스턴스를 반환합니다. 다음 VBScript 코드 예제에서는 가상이 아닌 모든 디바이스를 열거하고 각 디바이스의 이름을 보여 줍니다.

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

반환된 컬렉션에는 IWDTFDeviceDepot2::Query와 동일한 구현을 포함하는 IWDTFTargets2::Query 메서드가 있습니다. IWDTFTargets2::Query 는 SDEL 문을 충족하는 원래 컬렉션에서 대상의 하위 집합을 반환합니다.

SDEL의 부울 논리

IWDTFTarget2::GetRelations 메서드는 부울 OR 연산자만 수락할 수 있지만 IWDTFTargets2::Query, IWDTFTarget2::Eval IWDTFTarget2::GetValue 메서드에 대한 호출은 부울 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 문은 동적 필드 집합에 특성이 있는지 쿼리할 수 있어야 합니다.