2008-08-17 33 views
1

Ich bin etwas fehlt hier:Zitiert System.DirectoryServices.ResultPropertyCollection

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

Die Frage ist also, warum sie die beiden folgenden Ausgaben unterscheiden?

Antwort

1

Wenn Sie $ _. Properties.name in die Zeichenfolge eingaben, wurde der Typname der Eigenschaft zurückgegeben. Wenn eine Variable in einer Zeichenfolge enthalten ist und die Zeichenfolge ausgewertet wird, ruft sie die ToString-Methode für das Objekt auf, auf das die Variable verweist (ohne die angegebenen Elemente).

In diesem Fall gibt die ToString-Methode den Typenname zurück. Sie können die Auswertung der variablen Kraft und Mitglieder ähnlich dem, was EBGreen vorgeschlagen, aber von

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

Im anderen Szenario mit Powershell die Variable auswertet und den Mitgliedern angegebenen ersten und Hinzufügen dann auf die vorherige Zeichenfolge.

Sie haben recht, dass Sie eine Sammlung von Eigenschaften zurückbekommen. Wenn Sie $ computer [0] .properties an get-member übergeben, können Sie das Objektmodell direkt von der Befehlszeile aus untersuchen.

Der wichtige Teil ist unten.

Type-Name: System.DirectoryServices.ResultPropertyCollection

Namen Member Definition


Werte Eigenschaft System.Collections.ICollection Werte {get;}

0

Ich glaube, es hat mit der Art und Weise zu tun, dass PS Informationen in der "" interpoliert. Versuchen Sie folgendes:

"Server-Namen in Anführungszeichen $ ($ _. Objekte) .name"

Oder Sie können sogar noch einen Satz von $ benötigen(). Ich bin nicht irgendwo, wo ich es jetzt testen kann.

0

Schließen-- Das unten funktioniert richtig, aber ich würde mich interessieren, wenn jemand eine tiefere Erklärung hat.

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

So scheint es, dass $ _. Properties.name nicht wie ich es erwartet hatte. Wenn ich richtig visualisiere, bewirkt die Tatsache, dass die Eigenschaft name mehrwertig ist, dass sie ein Array zurückgibt. Welche (glaube ich) würde erklären, warum die folgenden Werke:

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

Wenn „name“ ein String waren dies das erste Zeichen zurückgeben sollte, sondern weil es ein Array ist gibt es die erste Saite.