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

132

Dans PowerShell, comment obtenir la valeur de propriété d'un objet en spécifiant son nom (une chaîne)? 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?

KFL
la source

Réponses:

198

Sûr

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

Ou d'ailleurs:

$obj."SomeProp"
Aquin
la source
12
n'oubliez pas de développer: select -expand "SomeProp"si vous voulez la valeur. select "SomeProp"renvoie un objet personnalisé avec une propriété "SomeProp", puis il est à peu près de retour à l'étape 1.
Frode F.
2
Est - il possible d'utiliser $obj."SomeProp"dans write-host?
The Muffin Man
@TheMuffinMan, oui, c'est une fonctionnalité généralement applicable, comme write-host $ obj. "$ Somepropertyname"
Elroy Flynn
4
Lorsque votre chaîne est dans une variable, $obj.($propName)fonctionne également. (Les parenthèses ne sont pas obligatoires, mais cela me semble vraiment étrange sans elles.)
jpmc26
3
Si vous avez le $propNamestocké dans un objet par exemple, $Headers.PropertyNameles parenthèses sont obligatoires $obj.($Headers.PropertyName).
Jonas Lomholdt
41

Expansion 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 pourraient simplement rechercher une commande sur une seule ligne pour obtenir des informations et je voulais inclure un exemple réel.

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

Le simple fait d'utiliser "Select BookInPolicy" coupait plusieurs membres, alors merci pour cette information!

JustaDaKaje
la source
27

Vous pouvez obtenir une propriété par nom à l'aide de l' Select-Objectapplet de commande et en spécifiant le ou les noms de propriété qui vous intéressent. Notez que cela ne renvoie pas simplement la valeur brute de cette propriété; au lieu de cela, 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

Pour utiliser la valeur de cette propriété, vous devrez toujours identifier la propriété que vous recherchez, même s'il n'y a qu'une seule propriété:

[PS]> $property.Name
armsvc

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

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

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

Comme pour les autres réponses ici, si vous souhaitez utiliser une seule propriété dans une chaîne, vous devez évaluer l'expression (mettre des crochets autour d'elle) et le préfixe avec un signe dollar ($) pour déclarer l'expression dynamiquement en tant que variable à insérer dans la chaîne:

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

Tout à fait correctement, d'autres ont répondu à cette question en recommandant le -ExpandPropertyparamètre de l' Select-Objectapplet de commande. Cela évite une partie du mal de tête en renvoyant la valeur de la propriété spécifiée, mais vous souhaiterez utiliser différentes approches dans différents scénarios.

-ExpandProperty <String>

Spécifie une propriété à sélectionner et indique qu'une tentative doit être faite pour développer cette propriété

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

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

Charlie Joynt
la source
8

Essaye ça :

$obj = @{
    SomeProp = "Hello"
}

Write-Host "Property Value is $($obj."SomeProp")"
Rainman-63
la source
Bienvenue dans StackOverflow, veuillez modifier votre question et expliquez pourquoi il devrait essayer cela et pourquoi cela améliore les réponses déjà existantes.
T3 H40
Je suis en conflit entre vote positif et vote négatif car cette réponse est IMO le moyen le plus simple d'obtenir en toute sécurité une propriété en fonction du nom de chaîne de la propriété d'un objet, mais n'offre aucune explication.
Troy Palacino
`` `$ obj = @ {Prop =" Valeur "; }; $ propName = "Prop" '; Write-Host "La valeur de $ propName est $ ($ obj." $ PropName ")" $ propName = "NonexistentProp" '; Write-Host "La valeur de $ propName est $ ($ obj." $ PropName ")" `` `s'affichera The value of Prop is Value puisThe value of NonexistentProp is
Troy Palacino le
HOU LA LA! la documentation de démarque est liée dans l'aide pour les commentaires mais ne s'applique pas à eux. vraiment sympa SO devs
Troy Palacino
3

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

write-host $(get-something).SomeProp
Duncan Clay
la source
0
$com1 = new-object PSobject                                                         #Task1
$com2 = new-object PSobject                                                         #Task1
$com3 = new-object PSobject                                                         #Task1



$com1 | add-member noteproperty -name user -value jindpal                           #Task2
$com1 | add-member noteproperty -name code -value IT01                              #Task2
$com1 | add-member scriptmethod ver {[system.Environment]::oSVersion.Version}       #Task3


$com2 | add-member noteproperty -name user -value singh                             #Task2
$com2 | add-member noteproperty -name code -value IT02                              #Task2
$com2 | add-member scriptmethod ver {[system.Environment]::oSVersion.Version}       #Task3


$com3 | add-member noteproperty -name user -value dhanoa                             #Task2
$com3 | add-member noteproperty -name code -value IT03                               #Task2
$com3 | add-member scriptmethod ver {[system.Environment]::oSVersion.Version}        #Task3


$arr += $com1, $com2, $com3                                                          #Task4


write-host "windows version of computer1 is: "$com1.ver()                            #Task3
write-host "user name of computer1 is: "$com1.user                                   #Task6
write-host "code of computer1 is: "$com1,code                                        #Task5
write-host "windows version of computer2 is: "$com2.ver()                            #Task3
write-host "user name of computer2 is: "$com2.user                                   #Task6
write-host "windows version of computer3 is: "$com3.ver()                            #Task3
write-host "user name of computer3 is: "$com1.user                                   #Task6
write-host "code of computer3 is: "$com3,code                                        #Task5

read-host
Dhanoa
la source
$ arr = @ ("jind", 12, "singh") write-host $ arr [1] read-host $ arr + = "reza" write-host $ arr [3] read-host write-host $ arr [ $ arr.length-1] read-host $ arr = $ arr -ne $ arr [1] write-host $ arr read-host foreach ($ i in $ arr) {write-host $ i}
dhanoa