web-dev-qa-db-fra.com

Comment obtenir la valeur d'une propriété d'objet par nom de propriété dans PowerShell?

Dans PowerShell, comment obtenez-vous la valeur de la 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?

89
KFL

Sûr 

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

Ou d'ailleurs:

$obj."SomeProp"
140
aquinas

Étendre @aquinas:

Get-something | select -ExpandProperty PropertyName

ou

Get-something | select -expand PropertyName

ou

Get-something | select -exp PropertyName

J'ai fait ces suggestions à ceux qui recherchent peut-être une commande sur une seule ligne pour obtenir des informations et veulent 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 ajoutés à la liste "BookInPolicy":

Get-CalendarProcessing [email protected] | Select -expand BookInPolicy

Juste utiliser "Select BookInPolicy" coupait plusieurs membres, alors merci pour cette information!

34
JustaDaKaje

Vous pouvez obtenir un property par son nom à l'aide de la cmdlet Select-Object et en spécifiant le nom de la propriété qui vous intéresse. 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 pouvoir utiliser value avec cette propriété, vous devez 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 d'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 de celle-ci) et utiliser le préfixe avec un signe dollar ($) pour déclarer l'expression de manière dynamique en tant que variable à insérer. dans la ficelle:

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

Très correctement, d’autres ont répondu à cette question en recommandant le paramètre -ExpandProperty pour la cmdlet Select-Object. Cela contourne 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 devrait être fait pour développer cette propriété

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

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

Powershellvariables

16
Charlie Joynt

Essaye ça :

$obj = @{
    SomeProp = "Hello"
}

Write-Host "Property Value is $($obj."SomeProp")"
3
rainman-63
$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
0
dhanoa

Voici un autre moyen d'obtenir la valeur de la propriété d'un objet:

write-Host $(get-something).SomeProp
0
Duncan Clay