2009-06-09 11 views
6

のリストは以下のWSHスニペットを考えてみましょう。質問は、利用可能なすべてのプロパティをpからどうやって一覧表示するのですか? for (var i in p) {...}の通常のテクニックは機能しません。pオブジェクトのプロパティは列挙できないようです。JScriptの列挙子とプロパティ

ありがとうございます。

答えて

10

のJScriptのfor...in文は、WMIオブジェクトと互換性がありません。 WMIオブジェクトは、特殊なProperties_プロパティを使用してプロパティコレクションを公開します。したがって、オブジェクトのすべての利用可能なプロパティを一覧表示するには、クエリ結果を列挙して個々のWMIオブジェクトにアクセスするようにこのコレクションを列挙する必要があります。各オブジェクトプロパティは、Name,Valueおよび適切なオブジェクトプロパティに関する情報を提供するその他のプロパティを持つSWbemPropertyオブジェクトで表されます。このスクリプトは、それがWin32_Printerクラスの重要な特性だからまた、DeviceIDプロパティの値が表示されますので、それはまた、一意の順序で検索だと

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

注:あなたがアイデアを得る

この例を助けるべきですクラスインスタンスを識別する。

+0

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

+0

@HenryFlower私はキリル文字を好きですが、英語で書くのが一番です:)しかし、私は、「ヘンリー・フラワー」はロシア人ではないと思います! –

1

私はあなたの質問にあなたが名前を求めているだけ問題があると思います。名前とステータスの両方を求めてみてください。

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

私はいくつかのhttp://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspxから複数のプロパティといくつかの仕事を得ました。私はDriverNameとCommentを問い合わせて、両方ともテキストか少なくとも1つのnullを持っていました。まあ、彼らはネイティブのJScriptのオブジェクトよりも複雑です、ので

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

おかげで、私の問題は、クエリではありません:)かかわらず、SELECT文の、p個のオブジェクトのプロパティは、(「用」で)発見ではなく、これはばかげています:( –

+0

"ええ、私はSELECT * ROM Win32_Printer "を実行してから(i in p)、iとp.iを印刷して何も得られませんでした。しかし、私が投稿したリンクには、あなたが望むことができるすべての属性があります。私がテストしたものはすべてそこにあった。 http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx – artlung

6

あなたが明示的に列挙子を使用すると、1つを必要とするコレクションオブジェクトを反復処理する必要があるたびに使用する必要性を回避したい場合は、あなたがこのような小さなヘルパー関数を定義することができますが:

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

反復コレクションかけてかなり少ない不器用次のようになります。答えを

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); 
    }); 
}); 
関連する問題