173 votes

Comment obtenir la valeur d'une propriété d'un objet par son nom ?

En PowerShell, comment obtenir la valeur d'une propriété d'un objet en spécifiant son nom (une chaîne de caractères) ? Je veux quelque chose comme ce qui suit :

$obj = get-something

# View the object's members:
$obj | gm

# I could retrieve a property by doing so:
write-host $obj.SomeProp

# But for many purposes, I would really want to:
write-host $obj | Get-PropertyByName "SomeProp"

Existe-t-il quelque chose de similaire à "Get-PropertyByName" dans PowerShell ?

265voto

aquinas Points 10517

Bien sûr

write-host ($obj | Select -ExpandProperty "SomeProp")

Ou pour cette question :

$obj."SomeProp"

54voto

JustaDaKaje Points 31

Développant sur @aquinas :

Get-something | select -ExpandProperty PropertyName

ou

Get-something | select -expand PropertyName

ou

Get-something | select -exp PropertyName

J'ai fait ces suggestions pour ceux qui cherchent simplement une commande d'une seule ligne pour obtenir un élément d'information et je voulais inclure un exemple concret.

Dans la gestion d'Office 365 via PowerShell, voici un exemple que j'ai utilisé pour obtenir tous les utilisateurs/groupes qui avaient été ajoutés à la liste "BookInPolicy" :

Get-CalendarProcessing conferenceroom@domain.com | Select -expand BookInPolicy

En utilisant simplement "Select BookInPolicy", plusieurs membres ont été exclus, merci pour cette information !

37voto

Charlie Joynt Points 2052

Vous pouvez obtenir un propriété par nom en utilisant le Select-Object et en spécifiant le(s) nom(s) de la propriété qui vous intéresse(nt). Notez que cela ne renvoie pas simplement la valeur brute de cette propriété ; vous obtenez quelque chose qui se comporte toujours comme un objet.

[PS]> $property = (Get-Process)[0] | Select-Object -Property Name

[PS]> $property

Name
----
armsvc

[PS]> $property.GetType().FullName
System.Management.Automation.PSCustomObject

Afin d'utiliser le valeur pour ce bien, vous devrez toujours identifier le bien que vous recherchez, même s'il n'y a qu'un seul bien :

[PS]> $property.Name
armsvc

[PS]> $property -eq "armsvc"
False

[PS]> $property.Name -eq "armsvc"
True

[PS]> $property.Name.GetType().FullName
System.String

Comme dans d'autres réponses, si vous voulez utiliser une seule propriété dans une chaîne de caractères, vous devez évaluer l'expression (en la mettant entre parenthèses) et la préfixer avec le signe dollar ($) pour déclarer l'expression dynamiquement comme une variable à insérer dans la chaîne de caractères :

[PS]> "The first process in the list is: $($property.Name)"
The first process in the list is: armsvc

A juste titre, d'autres ont répondu à cette question en recommandant le -ExpandProperty pour le paramètre Select-Object cmdlet. Cela permet de contourner une partie du casse-tête en renvoyant la valeur de la propriété spécifiée, mais vous voudrez utiliser différentes approches dans différents scénarios.

-ExpandProperty <String>

Spécifie une propriété à sélectionner et indique qu'il faut tenter de de développer cette propriété

https://technet.microsoft.com/en-us/library/hh849895.aspx

[PS]> (Get-Process)[0] | Select-Object -ExpandProperty Name
armsvc

powershell variables

13voto

rainman-63 Points 121

Essayez ceci :

$obj = @{
    SomeProp = "Hello"
}

Write-Host "Property Value is $($obj."SomeProp")"

7voto

Duncan Clay Points 61

Voici une autre façon d'obtenir la valeur d'une propriété d'un objet :

write-host $(get-something).SomeProp

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X