2009-06-09 9 views
6

Si consideri il seguente frammento di codice WSH:JScript Enumeratore e elenco delle proprietà

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

Esso stampa in ogni riga il nome della stampante e la parola "indefinito" tra parentesi (perché Status proprietà non esistono in p oggetto) . La domanda è: come posso elencare tutte le proprietà disponibili da p? La solita tecnica con for (var i in p) {...} non funziona: sembra che le proprietà nell'oggetto p non siano enumerabili.

Grazie in anticipo.

risposta

10

di JScript non è compatibile con oggetti WMI, perché, bene, sono più complesse di quanto oggetti JScript nativi. Gli oggetti WMI espongono la loro collezione di proprietà tramite la speciale proprietà Properties_, quindi per elencare tutte le proprietà disponibili di un oggetto, è necessario enumerare questa raccolta come si enumerano i risultati della query per accedere ai singoli oggetti WMI. Ogni proprietà dell'oggetto è rappresentata da un oggetto SWbemProperty che ha il Name, Value e altre proprietà che forniscono informazioni sulla proprietà dell'oggetto appropriata.

Questo esempio dovrebbe aiutare a ottenere l'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); 
    } 
} 

Si noti che questo script mostrerà anche il valore DeviceID proprietà, perché è una proprietà fondamentale della classe Win32_Printer, quindi è anche recuperati al fine di univocamente identificare le istanze di classe.

+0

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

+0

@HenryFlower Per quanto mi piacciano quelle lettere cirilliche, è meglio scrivere in inglese qui :) A proposito, non penserei che un "Henry Flower" provenga dalla Russia! –

1

Penso che il problema sia nella tua domanda che stai solo chiedendo il Nome. Prova a chiedere sia per nome e lo 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 + ")"); 
} 

ho avuto qualche altro oggetti di http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx e diversi lavori. Ho chiesto per DriverName e Comment e entrambi avevano il testo o almeno un null. for...in dichiarazione

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

Grazie per la risposta, ma il mio problema non è nella query :) Indipendentemente SELECT, proprietà dell'oggetto P non è rilevabile (con "per") e questo è ridicolo :( –

+0

"Sì, ho provato SELECT * da F ROM Win32_Printer "e quindi facendo per (i in p) e stampando i e p.i e ottenuto nulla. Ma il link che ho pubblicato ha tutti gli attributi che si possono desiderare, quindi forse basta mettere quelli in un array per farli uscire. Tutti quelli che ho provato erano lì. http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx – artlung

6

Se vuoi evitare la necessità di utilizzare un esplicito enumeratore ogni volta che è necessario iterare su un oggetto di collezione che ha bisogno di uno, è possibile definire un po 'di funzione di aiuto in questo modo:

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

Iterazione sugli incassi poi diventa un po 'meno impacciato:

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