6

次の WSH スニペットを検討してください。

var query = GetObject("winmgmts:").ExecQuery("SELECT Name FROM Win32_Printer", "WQL", 0);
var e = new Enumerator(クエリ);
for ( ; !e.atEnd(); e.moveNext ()) {
    var p = e.item();
    WScript.Echo(p.Name + " (" + p.Status + ")");
}

すべての行にプリンター名と角かっこで囲まれた「未定義」という単語が出力されます (Statusプロパティがpオブジェクトに存在しないため)。問題は、 から利用可能なすべてのプロパティを一覧表示するにはどうすればよいかということpです。の通常の手法はfor (var i in p) {...}機能しません。オブジェクトのプロパティpは列挙できないようです。

前もって感謝します。

4

3 に答える 3

10

JScript のfor...inステートメントは WMI オブジェクトと互換性がありません。なぜなら、WMI オブジェクトはネイティブの JScript オブジェクトよりも複雑だからです。WMI オブジェクトは、特別なProperties_プロパティを介してプロパティ コレクションを公開するため、オブジェクトの使用可能なすべてのプロパティを一覧表示するには、クエリ結果を列挙して個々の WMI オブジェクトにアクセスするように、このコレクションを列挙する必要があります。各オブジェクト プロパティは、 、および適切なオブジェクト プロパティに関する情報を提供するその他のプロパティをSWbemProperty持つオブジェクトによって表されます。NameValue

この例は、アイデアを得るのに役立ちます。

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

このスクリプトはDeviceIDプロパティ値も表示することに注意してください。これはクラスのキー プロパティであり、Win32_Printerクラス インスタンスを一意に識別するためにも取得されるためです。

于 2009-06-10T07:22:07.543 に答える
6

Enumerator を必要とするコレクション オブジェクトを繰り返し処理する必要があるたびに明示的な Enumerator を使用する必要を避けたい場合は、次のような小さなヘルパー関数を定義できます。

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);
    });
});
于 2010-11-16T06:59:04.753 に答える
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 を照会したところ、どちらにもテキストまたは少なくとも 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);
}
于 2009-06-10T00:10:24.607 に答える