質問

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

$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」が文字列の場合、最初の文字が返されるはずですが、配列であるため、最初の文字列が返されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top