2009-06-09 28 views
6

listesi aşağıdaki WSH pasajı düşünün:JScript Enumerator ve özelliklerin

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

Her satırda yazdıran bir yazıcı adı ve parantez içinde kelime "tanımsız" (Status mülkiyet p nesne mevcut olmadığı için) . Soru şu: p'dan tüm mevcut özellikleri nasıl listeleyebilirim? for (var i in p) {...} ile olağan teknik çalışmıyor - p nesnesindeki özelliklerin numaralandırılamayacağı görünüyor.

Şimdiden teşekkürler.

cevap

10

JScript'ın for...in açıklamada, WMI nesneleri ile uyumlu değildir. WMI nesneleri özellik koleksiyonunu özel Properties_ özelliği aracılığıyla ortaya çıkarır, böylece bir nesnenin tüm kullanılabilir özelliklerini listelemek için, bu koleksiyonu, tek tek WMI nesnelerine erişmek için sorgu sonuçlarını numaralandırıyormuş gibi numaralandırmanız gerekir. Her nesne özelliği, Name, Value ve uygun nesne özelliği hakkında bilgi sağlayan diğer özellikler içeren SWbemProperty nesnesiyle temsil edilir.

Bu örnek anladınız yardımcı olacaktır: o Win32_Printer sınıfının önemli bir özellik çünkü bu komut dosyası ayrıca, DeviceID özellik değerini göstereceği

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

Not, bu nedenle de benzersiz amacıyla alınan oluyor sınıf örneklerini tanımlar. Eğer açık bir sýralayýcý birini gereken bir koleksiyon nesnesi üzerinde yineleme istediğin zamanlarda kullanma ihtiyacı önlemek istiyorsanız

+0

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

+0

@HenryFlower Bu kiril harfleri sevdiğim kadarıyla, burada İngilizce yazmak en iyisidir :) Bu arada, bir "Henry Çiçeği" nin Rusya'dan geleceğini düşünmüyorum! –

1

Sorunun sadece sorgunuzda olduğunu düşünüyorum. Adı ve statü hem soran deneyin:

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

Ben http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx ve birkaç işten biraz daha özelliklerini aldık. DriverName ve Yorum için sorguya çektim ve her ikisi de metin veya en azından bir null. iyi, onlar yerli JScript nesneleri daha karmaşıktır, çünkü

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

Teşekkür ama benim sorunum sorgusunda olmasa :) Ne olursa olsun SELECT deyimi, s nesnenin özellikleri ve ("için" birlikte) keşfedilebilir değildir: koleksiyonları üzerinde sonra oldukça az hantal hale gelir Bu saçma :( –

+0

"Evet, SELECT * denedim ROM Win32_Printer "ve sonra (i p) için yapıyor ve i ve p.i baskı ve hiçbir şey var. Ancak gönderdiğim bağlantıda istediğiniz tüm özellikler var, bu yüzden bunları bir diziye ekleyiniz. Test ettiğim hepsi oradaydı. http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx – artlung

6

, bu gibi küçük bir yardımcı işlevi tanımlayabilirsiniz:

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

Yineleme cevap için

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