Frage

Mir fehlt hier etwas:

$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 sich die beiden folgenden Ausgaben unterscheiden?

$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
War es hilfreich?

Lösung

Wenn Sie $_.properties.name in die Zeichenfolge eingefügt haben, 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 nachfolgend angegebenen Mitglieder).

In diesem Fall gibt die ToString-Methode Folgendes zurück Modellname.Sie können die Auswertung der Variablen und Elemente ähnlich wie von EBGreen vorgeschlagen erzwingen, jedoch mithilfe von

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

Im anderen Szenario Power Shell wertet die zuerst angegebene Variable und die angegebenen Mitglieder aus und fügt sie dann zur vorherigen Zeichenfolge hinzu.

Sie haben Recht, dass Sie eine Sammlung von Eigenschaften zurückerhalten.Wenn Sie pfeifen $computer[0].properties Um ein Mitglied zu erhalten, können Sie das Objektmodell direkt über die Befehlszeile erkunden.

Der wichtige Teil ist unten.

Modellname:System.DirectoryServices.ResultPropertyCollection

Name MemberType-Definition


Values-Eigenschaft System.Collections.ICollection Values ​​{get;}

Andere Tipps

Ich glaube, es hat mit der Art und Weise zu tun, wie PS Informationen im „“ interpoliert.Versuche dies:

„Servername in Anführungszeichen $($_.properties).name“

Oder Sie benötigen möglicherweise sogar einen weiteren Satz $().Ich bin derzeit nicht an einem Ort, an dem ich es testen kann.

Schließen – Das Folgende funktioniert korrekt, aber es würde mich interessieren, wenn jemand eine tiefergehende Erklärung hat.

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

Es scheint also, dass $_.properties.name nicht so respektiert, wie ich es erwartet hatte.Wenn ich es richtig visualisiere, führt die Tatsache, dass die Namenseigenschaft mehrwertig ist, dazu, dass sie ein Array zurückgibt.Was (glaube ich) erklären würde, warum Folgendes funktioniert:

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

Wenn „name“ eine Zeichenfolge wäre, sollte dies das erste Zeichen zurückgeben. Da es sich jedoch um ein Array handelt, wird die erste Zeichenfolge zurückgegeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top