2009-06-09 8 views
6

sich der folgende WSH-Schnipsel:JScript Enumerator und die Liste der Eigenschaften

 
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 + ")"); 
} 

Er druckt in jeder Zeile in Klammern ein Druckername und das Wort „undefiniert“ (weil Status Eigenschaft existiert in p Objekt nicht) . Die Frage ist: Wie kann ich alle verfügbaren Eigenschaften von auflisten? Die übliche Technik mit for (var i in p) {...} funktioniert nicht - es scheint, dass Eigenschaften in Objekt nicht aufzählbar sind.

Vielen Dank im Voraus.

Antwort

10

der JScript for...in Aussage ist nicht kompatibel mit WMI-Objekte, weil, na ja, sie komplexer als nativer JScript-Objekte sind. WMI-Objekte stellen ihre Eigenschaftensammlung über die spezielle Eigenschaft Properties_ dar. Um alle verfügbaren Eigenschaften eines Objekts aufzulisten, müssen Sie diese Auflistung auflisten, indem Sie die Abfrageergebnisse auflisten, um auf einzelne WMI-Objekte zuzugreifen. Jede Objekteigenschaft wird durch ein Objekt SWbemProperty dargestellt, das über die Eigenschaften Name, Value und andere Eigenschaften verfügt, die Informationen über die entsprechende Objekteigenschaft bereitstellen.

Dieses Beispiel sollte man auf die Idee kommen helfen:

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); 
    } 
} 

Beachten Sie, dass dieses Skript wird auch den DeviceID Eigenschaftswert angezeigt werden, weil sie eine Schlüsseleigenschaft der Win32_Printer Klasse ist, so ist es auch in Ordnung abgerufen eindeutig Identifizieren von Klasseninstanzen

+0

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

+0

@HenryFlower So viel wie ich diese kyrillischen Buchstaben mag, ist es am besten, hier auf Englisch zu schreiben :) Übrigens würde ich nicht denken, dass eine "Henry Flower" aus Russland wäre! –

1

Ich denke, das Problem ist in Ihrer Abfrage, die Sie nur für den Namen fragen. Versuchen Sie zu fragen, sowohl Name und Status:

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 + ")"); 
} 

ich von http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx und einige Arbeit noch einige Eigenschaften bekam. Ich fragte nach DriverName und Comment und beide hatten Text oder mindestens eine Null.

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

Danke für die Antwort, aber mein Problem ist in der Abfrage nicht :) Unabhängig von der SELECT-Anweisung, die Eigenschaften von p-Objekt nicht auffindbar sind (mit „for“) und Das ist lächerlich :( –

+0

"Ja, ich habe SELECT * von F versucht ROM Win32_Printer "und dann für (i in p) und Drucken von i und p.i tun und nichts bekommen. Aber der Link, den ich gepostet habe, hat alle Attribute, die du dir wünschen kannst, also stell sie einfach in ein Array, um sie herauszubekommen. Alle, die ich getestet habe, waren dort. http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx – artlung

6

Wenn Sie die Notwendigkeit zu vermeiden, möchten Sie eine explizite Enumerator jedes Mal zu verwenden, benötigen eine Sammlung Objekt iterieren, die man braucht, können Sie eine kleine Hilfsfunktion wie folgt definieren:

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

Iteration über Sammlungen wird dann eher weniger ungeschickt:

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); 
    }); 
});