1

ここに何かが欠けています:

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher  
$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry  
$objSearcher.Filter = ("(objectclass=computer)")  
$computers = $objSearcher.findall()  

問題は、なぜ次の 2 つの出力が異なるのかということです。

$computers | %{ 
"Server name in quotes $_.properties.name" 
"Server name not in quotes " + $_.properties.name 
}
PS> $computers[0] | %{"$_.properties.name"; $_.properties.name}
System.DirectoryServices.SearchResult.properties.name
GORILLA
4

3 に答える 3

1

$_.properties.name を文字列に含めると、プロパティの型名が返されました。変数が文字列に含まれ、その文字列が評価されると、変数によって参照されるオブジェクト (後に指定されたメンバーは含まれません) で ToString メソッドが呼び出されます。

この場合、ToString メソッドは型名を返しています。EBGreen が提案したものと同様に、変数とメンバーの評価を強制できますが、

"Server name in quotes $($_.properties.name)"  

もう 1 つのシナリオでは、 PowerShellは最初に指定された変数とメンバーを評価し、それを前の文字列に追加します。

プロパティのコレクションを取得しているのは正しいです。$computer[0].propertiesを get-member にパイプすると、コマンド ラインから直接オブジェクト モデルを調べることができます。

重要な部分は以下です。

TypeName: System.DirectoryServices.ResultPropertyCollection

名前 MemberType 定義


Values プロパティ System.Collections.ICollection 値 {get;}

于 2008-08-17T22:10:02.907 に答える
0

PSが「」の情報を補間する方法と関係があると思います。これを試して:

"引用符で囲まれたサーバー名$($ _。properties).name"

または、もう1セットの$()が必要になる場合もあります。私は今それをテストできる場所にいません。

于 2008-08-17T17:41:14.103 に答える
0

閉じる-- 以下は正しく動作しますが、より深い説明があれば興味があります。

PS C:\> $computers[0] | %{ "$_.properties.name"; "$($_.properties.name)" }
System.DirectoryServices.SearchResult.properties.name
GORILLA

したがって、 $_.properties.name は、私が期待していたようには従わないようです。適切に視覚化している場合、name プロパティが多値であるという事実により、配列が返されます。これは(私が思うに)以下が機能する理由を説明します:

$computers[0] | %{ $_.properties.name[0]}

「名前」が文字列の場合、これは最初の文字を返す必要がありますが、配列であるため、最初の文字列を返します。

于 2008-08-17T19:37:45.070 に答える