Question

Il me manque quelque chose ici :

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

La question est donc de savoir pourquoi les deux résultats suivants diffèrent ?

$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
Était-ce utile?

La solution

Lorsque vous incluiez $_.properties.name dans la chaîne, le nom de type de la propriété était renvoyé.Lorsqu'une variable est incluse dans une chaîne et que la chaîne est évaluée, elle appelle la méthode ToString sur cet objet référencé par la variable (sans compter les membres spécifiés après).

Dans ce cas, la méthode ToString renvoie le tapez le nom.Vous pouvez forcer l'évaluation de la variable et des membres de la même manière que ce que suggère EBGreen, mais en utilisant

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

Dans l'autre scénario PowerShell évalue d'abord la variable et les membres spécifiés, puis l'ajoute à la chaîne précédente.

Vous avez raison, vous récupérez une collection de propriétés.Si vous canalisez $ordinateur[0].propriétés pour obtenir un membre, vous pouvez explorer le modèle objet directement depuis la ligne de commande.

La partie importante est ci-dessous.

Nom du type :System.DirectoryServices.ResultPropertyCollection

Nom Type de membre Définition


Propriété Values ​​System.Collections.ICollection Values ​​{get;}

Autres conseils

Je pense que cela a à voir avec la façon dont PS interpole les informations dans le "".Essaye ça:

"Nom du serveur entre guillemets $($_.properties).name"

Ou vous aurez peut-être même besoin d'un ensemble supplémentaire de $().Je ne suis pas dans un endroit où je peux le tester pour le moment.

Fermer - Ce qui suit fonctionne correctement, mais je serais intéressé si quelqu'un a une explication plus approfondie.

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

Il semblerait donc que $_.properties.name ne fasse pas preuve de déférence comme je m'y attendais.Si je visualise correctement, le fait que la propriété name soit à plusieurs valeurs l'amène à renvoyer un tableau.Ce qui (je pense) expliquerait pourquoi les éléments suivants fonctionnent :

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

Si "nom" était une chaîne, cela devrait renvoyer le premier caractère, mais comme il s'agit d'un tableau, il renvoie la première chaîne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top