2009-06-09 4 views
6

의 목록은 다음 WSH 조각은 고려해보십시오JScript를 열거하고 속성

 
var query = GetObject("winmgmts:").ExecQuery("SELECT Name FROM Win32_Printer", "WQL", 0); 
var e = new Enumerator(query); 
for (; !e.atEnd(); e.moveNext()) { 
    var p = e.item(); 
    WScript.Echo(p.Name + " (" + p.Status + ")"); 
} 

그것은 모든 라인에 인쇄하는 프린터 이름과 괄호 안에 단어 "정의는"(Status 속성은 p 객체에 존재하지 않기 때문에) . 문제는 : 이용 가능한 모든 속성을 p에서 어떻게 나열 할 수 있습니까? for (var i in p) {...}의 일반적인 기술은 작동하지 않습니다. p 개체의 속성이 열거되지 않는 것으로 보입니다.

미리 감사드립니다.

답변

10

의 JScript의 for...in 문, WMI 개체와 호환되지 않습니다. WMI 개체는 특수한 Properties_ 속성을 통해 속성 컬렉션을 노출하므로 개체의 사용 가능한 모든 속성을 나열하려면 쿼리 결과를 열거하여 개별 WMI 개체에 액세스하는 것처럼이 컬렉션을 열거해야합니다. 각 개체 속성은 Name, Value 및 해당 개체 속성에 대한 정보를 제공하는 다른 속성이있는 SWbemProperty 개체로 나타냅니다.

이 예제는 생각 얻을 수 있도록해야합니다 : 그것은 Win32_Printer 클래스의 키 속성이 있기 때문에이 스크립트는 또한 DeviceID 속성 값을 표시 할 것

var query = GetObject("winmgmts:").ExecQuery("SELECT Name, Status FROM Win32_Printer"); 
var colPrinters = new Enumerator(query); 

var oPrinter, colProps, p; 

// Enumerate WMI objects 
for (; !colPrinters.atEnd(); colPrinters.moveNext()) { 
    oPrinter = colPrinters.item(); 

    // Enumerate WMI object properties 
    colProps = new Enumerator(oPrinter.Properties_); 
    for (; !colProps.atEnd(); colProps.moveNext()) { 
     p = colProps.item(); 
     WScript.Echo(p.Name + ": " + p.Value); 
    } 
} 

주, 그래서 그것은 또한 유일하게하기 위해 검색 있어요 클래스 인스턴스를 식별합니다. 당신이 명시 적으로 열거 당신이 하나를 필요로하는 컬렉션 개체를 반복 할 때마다 사용할 필요가 없도록하려는 경우

+0

Класс. Спасибо! –

+0

@HenryFlower 내가 그 키릴 문자를 좋아하는 한, 영어로 쓰는 것이 가장 좋습니다 :) 그런데 "Henry Flower"가 러시아 출신이 아닐 것이라고 생각합니다! –

1

문제는 귀하의 질문에 귀하가 이름을 묻는 것이라고 생각합니다. 이름 및 상태 모두에 대해 물어보십시오 :

var query = GetObject("winmgmts:").ExecQuery("SELECT Name, Status FROM Win32_Printer", "WQL", 0); 
var e = new Enumerator(query); 
for (; !e.atEnd(); e.moveNext()) { 
    var p = e.item(); 
    WScript.Echo(p.Name + " (" + p.Status + ")"); 
} 

내가 http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx 여러 직장에서 좀 더 속성을 얻었다. 나는 DriverName과 Comment에 대해 질의를했는데 둘 다 텍스트 또는 적어도 null을 가졌다. 물론, 그들은 고유의 JScript 개체보다 더 복잡하기 때문에

var query = GetObject("winmgmts:").ExecQuery("SELECT Name, Status, DriverName, Comment FROM Win32_Printer", "WQL", 0); 
var e = new Enumerator(query); 
for (; !e.atEnd(); e.moveNext()) { 
    var p = e.item(); 
    WScript.Echo(p.Name + " (" + p.Status + ") " + p.DriverName + " " + p.Comment); 
} 
+0

감사합니다,하지만 내 문제는 쿼리에없는 :)에 관계없이 SELECT 문 쪽 개체의 속성과 ("에 대한"로) 검색 할되지 않습니다 : 컬렉션을 통해 다음 오히려 덜 어색하게 이 말도 안돼 : ( –

+0

"그래, 내가 시도한 SELECT *에서 F ROM Win32_Printer "를 실행 한 다음 (i in p) 인쇄하고 i와 p.i를 인쇄하고 아무것도 얻지 못했습니다. 하지만 내가 게시 한 링크에는 원하는 모든 특성이 있으므로 어쩌면 배열에 넣어서 꺼낼 수 있습니다. 내가 시험 한 모든 것들이 거기에 있었다. http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx – artlung

6

,이 같은 작은 도우미 함수를 정의 할 수 있습니다

function forEach(collection, func) { 
for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) { 
    func(e.item()); 
} 
} 

반복을 답에 대한

var queryResult = GetObject("winmgmts:").ExecQuery("SELECT Name, Status FROM Win32_Printer"); 

// Enumerate WMI objects 
forEach (queryResult, function (oPrinter) { 

    // Enumerate WMI object properties 
    forEach (oPrinter.Properties_, function (p) { 
     WScript.Echo(p.Name + ": " + p.Value); 
    }); 
}); 
관련 문제