2009-06-09 17 views
6

considerar el siguiente fragmento de WSH:JScript enumerador y la lista de propiedades

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

Se imprime en cada línea un nombre de impresora y la palabra "indefinido" entre paréntesis (porque Status propiedad no existen en p objeto) . La pregunta es: ¿cómo puedo enumerar todas las propiedades disponibles desde p? La técnica habitual con for (var i in p) {...} no funciona; parece que las propiedades del objeto p no son enumerables.

Gracias de antemano.

Respuesta

10

de JScript no es compatible con los objetos WMI, porque, bueno, son más complejos que los objetos de JScript nativos. Los objetos WMI exponen su colección de propiedades a través de la propiedad especial Properties_, por lo que para enumerar todas las propiedades disponibles de un objeto, debe enumerar esta colección como si enumerara los resultados de la consulta para acceder a objetos WMI individuales. Cada propiedad de objeto está representada por un objeto SWbemProperty que tiene el Name, y otras propiedades que proporcionan información sobre la propiedad de objeto adecuada.

Este ejemplo debería ayudarle a obtener la idea:

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

Tenga en cuenta que este script también mostrará el valor DeviceID propiedad, porque es una propiedad clave de la clase Win32_Printer, por lo que también ha recuperado con el fin de forma exclusiva identificar instancias de clase.

+0

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

+0

@HenryFlower Por mucho que me gustan esas letras cirílicas, es mejor escribir en inglés aquí :) Por cierto, ¡no creo que una "Flor de Henry" sea de Rusia! –

1

Creo que el problema es que en su consulta solo solicita el Nombre. Intentar pedir el nombre y el estado:

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

Tengo algunas más propiedades de http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx y varios trabajos. Solicité DriverName y Comment y ambos tenían texto o al menos un nulo. for...in comunicado

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

Gracias por la respuesta, pero mi problema no está en la consulta :) Independientemente de la instrucción SELECT, p propiedades de objeto no es detectable (con "a") y esto es ridículo :( –

+0

"Sí, lo intenté SELECCIONAR * de F ROM Win32_Printer "y luego hacer por (i en p) e imprimir i y p.i y no obtuvo nada. Pero el enlace que publiqué tiene todos los atributos que podría desear, así que tal vez solo coloque esos en una matriz para sacarlos. Todos los que probé estaban allí. http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx – artlung

6

Si desea evitar la necesidad de utilizar un enumerador explícita cada vez que necesita para iterar sobre un objeto de colección que necesita uno, se puede definir un poco de función auxiliar de esta manera:

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

iteración sobre colecciones entonces se convierte en algo menos torpe:

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