2009-06-09 6 views
6

Envisagez l'extrait de code WSH suivant:JScript recenseur et la liste des propriétés

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

Il imprime dans chaque ligne un nom de l'imprimante et le mot entre parenthèses « non défini » (parce Status propriété est existent pas dans p objet) . La question est: comment puis-je lister toutes les propriétés disponibles de p? La technique habituelle avec for (var i in p) {...} ne fonctionne pas - il semble que les propriétés de l'objet p ne sont pas énumérables.

Merci d'avance.

Répondre

10

déclaration JScript for...in n'est pas compatible avec les objets WMI, parce que, eh bien, ils sont plus complexes que les objets JScript natifs. Les objets WMI exposent leur collection de propriétés via la propriété spéciale Properties_. Pour répertorier toutes les propriétés disponibles d'un objet, vous devez énumérer cette collection comme si vous énumériez les résultats de la requête pour accéder aux objets WMI individuels. Chaque propriété d'objet est représentée par un objet SWbemProperty possédant les propriétés Name, Value et d'autres propriétés fournissant des informations sur la propriété d'objet appropriée.

Cet exemple devrait vous aider à obtenir l'idée:

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

Notez que ce script affiche également la valeur de la propriété DeviceID, car il est une propriété clé de la Win32_Printer classe, il est également récupéré pour unique identifier les instances de classe.

+0

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

+0

@HenryFlower Autant j'aime ces lettres cyrilliques, mieux vaut écrire en anglais ici :) Au fait, je ne pense pas qu'une "Fleur Henry" serait de Russie! –

1

Je pense que le problème est dans votre requête que vous demandez seulement le nom. Essayez de demander le nom et le statut:

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

Je suis arrivé un peu plus de propriétés http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx et plusieurs travaux. J'ai interrogé DriverName et Comment et tous les deux avaient du texte ou au moins un 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

Merci pour la réponse, mais mon problème est pas dans la requête :) Quelle que soit l'instruction SELECT, les propriétés de l'objet p n'est pas découvrable (avec « pour ») et c'est ridicule :( –

+0

"Oui, j'ai essayé SELECT * de F ROM Win32_Printer "et puis faire pour (i en p) et l'impression i et p.i et n'a rien. Mais le lien que j'ai posté a tous les attributs que vous pourriez vouloir, alors peut-être juste les mettre dans un tableau pour les sortir. Tous ceux que j'ai testés étaient là. http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx – artlung

6

Si vous souhaitez éviter la nécessité d'utiliser un recenseur explicite chaque fois que vous devez itérer sur un objet de collection qui a besoin d'un, vous pouvez définir une petite fonction d'aide comme ceci:

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

Iteration sur les collections devient alors un peu moins maladroit:

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