System.DirectoryServices.ResultPropertyCollection の引用
-
08-06-2019 - |
質問
ここで何かが欠けています:
$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
解決
$_.properties.name を文字列に含めると、プロパティの型名が返されていました。変数が文字列に含まれており、その文字列が評価されると、変数によって参照されるオブジェクトに対して ToString メソッドが呼び出されます (後で指定されたメンバーは含まれません)。
この場合、ToString メソッドは 型名. 。EBGreen が提案したのと同様に、変数とメンバーの評価を強制できますが、次を使用します。
"Server name in quotes $($_.properties.name)"
他のシナリオでは パワーシェル 最初に指定された変数とメンバーを評価し、それを前の文字列に追加します。
プロパティのコレクションを返しているのは正しいです。パイプすれば $computer[0].properties get-member を使用すると、コマンド ラインからオブジェクト モデルを直接探索できます。
重要な部分は以下です。
タイプ名:System.DirectoryServices.ResultPropertyCollection
名前 MemberType 定義
値プロパティ System.Collections.ICollection 値 {get;}
他のヒント
これは、PS が「」内の情報を補間する方法に関係していると思います。これを試して:
「引用符で囲んだサーバー名 $($_.properties).name」
あるいは、$() のセットがもう 1 つ必要になる場合もあります。今はテストできる場所にありません。
閉じる-- 以下は正しく動作しますが、誰かがより深い説明を持っている場合は興味があります。
PS C:\> $computers[0] | %{ "$_.properties.name"; "$($_.properties.name)" }
System.DirectoryServices.SearchResult.properties.name
GORILLA
したがって、$_.properties.name は私が期待していたほど従わないようです。適切に視覚化している場合、name プロパティが複数値であるため、配列が返されます。これで、以下が機能する理由が説明されると思います。
$computers[0] | %{ $_.properties.name[0]}
「name」が文字列の場合、最初の文字が返されるはずですが、配列であるため、最初の文字列が返されます。