Jak uzyskać wartość właściwości obiektu według nazwy właściwości?

139

W PowerShell, jak uzyskać wartość właściwości obiektu, określając jego nazwę (ciąg znaków)? Chcę coś takiego:

$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"

Czy w PowerShell jest coś podobnego do „Get-PropertyByName”?

KFL
źródło

Odpowiedzi:

211

Pewnie

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

Albo o to:

$obj."SomeProp"
Akwiny
źródło
12
pamiętaj, rozwiń: select -expand "SomeProp"jeśli chcesz wartość. select "SomeProp"zwraca obiekt niestandardowy z właściwością „SomeProp”, a następnie prawie wrócił do kroku 1.
Frode F.
2
Czy jest sposób na użycie $obj."SomeProp"w write-host?
The Muffin Man,
@TheMuffinMan, tak, jest to powszechnie stosowana funkcja, taka jak write-host $ obj. "$ Somepropertyname"
Elroy Flynn
4
Kiedy twój ciąg jest w zmiennej, $obj.($propName)również działa. (
Nawiasy
3
Jeśli na przykład masz $propNameprzechowywane w obiekcie, $Headers.PropertyNamewymagane są nawiasy $obj.($Headers.PropertyName).
Jonas Lomholdt
45

Rozszerzanie @aquinas:

Get-something | select -ExpandProperty PropertyName

lub

Get-something | select -expand PropertyName

lub

Get-something | select -exp PropertyName

Przedstawiłem te sugestie dla tych, którzy mogą po prostu szukać jednowierszowego polecenia, aby uzyskać jakąś informację, i chciałem dołączyć przykład ze świata rzeczywistego.

W zarządzaniu Office 365 przez PowerShell, oto przykład, którego użyłem do uzyskania wszystkich użytkowników / grup, które zostały dodane do listy „BookInPolicy”:

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

Samo użycie „Select BookInPolicy” pozbawiło kilku członków, więc dziękuję za te informacje!

JustaDaKaje
źródło
29

Możesz pobrać właściwość według nazwy za pomocą polecenia Select-Objectcmdlet i określając nazwy właściwości, które Cię interesują. Należy pamiętać, że to nie zwraca po prostu wartości surowej dla tej właściwości; zamiast tego otrzymujesz coś, co nadal zachowuje się jak przedmiot.

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

[PS]> $property

Name
----
armsvc

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

Aby użyć wartości dla tej właściwości, nadal będziesz musiał określić, której właściwości szukasz, nawet jeśli istnieje tylko jedna właściwość:

[PS]> $property.Name
armsvc

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

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

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

Podobnie jak w przypadku innych odpowiedzi tutaj, jeśli chcesz użyć pojedynczej właściwości w ciągu, musisz oszacować wyrażenie (umieścić wokół niego nawiasy) i przedrostek ze znakiem dolara ($), aby zadeklarować wyrażenie dynamicznie jako zmienną do wstawienia do ciągu:

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

Całkiem poprawnie, inni odpowiedzieli na to pytanie, zalecając -ExpandPropertyparametr dla polecenia Select-Objectcmdlet. To omija niektóre problemy, zwracając wartość określonej właściwości, ale będziesz chciał użyć różnych podejść w różnych scenariuszach.

-ExpandProperty <String>

Określa właściwość do wybrania i wskazuje, że należy podjąć próbę rozwinięcia tej właściwości

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

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

Charlie Joynt
źródło
8

Spróbuj tego :

$obj = @{
    SomeProp = "Hello"
}

Write-Host "Property Value is $($obj."SomeProp")"
Rainman-63
źródło
Witamy w StackOverflow, edytuj swoje pytanie i wyjaśnij, dlaczego powinien spróbować i dlaczego poprawia to już istniejące odpowiedzi.
T3 H40
Jestem w konflikcie między głosami za i przeciw, ponieważ ta odpowiedź jest IMO najprostszym sposobem na bezpieczne uzyskanie właściwości w oparciu o posiadanie ciągu nazwy właściwości z obiektu, ale również nie oferuje żadnego wyjaśnienia.
Troy Palacino
`` $ obj = @ {Prop = "Value"; }; $ propName = "Prop" '; Write-Host "Wartość $ propName to $ ($ obj." $ PropName ")" $ propName = "NonexistentProp" '; Write-Host "Wartość $ propName to $ ($ obj." $ PropName ")" `` zostanie wydrukowane, The value of Prop is Value a następnieThe value of NonexistentProp is
Troy Palacino
ŁAŁ! dokumentacja dotycząca wypłat jest połączona w pomocy z komentarzami, ale nie ma do nich zastosowania. naprawdę
fajni twórcy
4

Oto alternatywny sposób uzyskania wartości właściwości obiektu:

write-host $(get-something).SomeProp
Duncan Clay
źródło
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
źródło
$ 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