Bagaimana cara mendapatkan nilai properti objek berdasarkan nama properti?

132

Di PowerShell, bagaimana Anda mendapatkan nilai properti objek dengan menentukan namanya (string)? Saya ingin sesuatu seperti berikut:

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

Apakah ada yang mirip dengan "Dapatkan-PropertyByName" di PowerShell?

KFL
sumber

Jawaban:

198

Tentu

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

Atau dalam hal ini:

$obj."SomeProp"
aquinas
sumber
12
ingat perluas: select -expand "SomeProp"jika Anda menginginkan nilainya. select "SomeProp"mengembalikan objek kustom dengan properti "SomeProp", dan kemudian dia cukup banyak kembali pada langkah 1.
Frode F.
2
Apakah ada cara untuk menggunakan $obj."SomeProp"di write-host?
The Muffin Man
@TheMuffinMan, ya, ini adalah fitur yang berlaku secara umum, seperti $ host-host $ obj. "$ Somepropertyname"
Elroy Flynn
4
Ketika string Anda dalam variabel, $obj.($propName)juga berfungsi. (Tanda kurung tidak diperlukan, tetapi itu terlihat sangat aneh bagi saya tanpa mereka.)
jpmc26
3
Jika Anda $propNamemenyimpannya di objek misalnya $Headers.PropertyNamemaka tanda kurung diperlukan $obj.($Headers.PropertyName).
Jonas Lomholdt
41

Memperluas pada @ aquinas:

Get-something | select -ExpandProperty PropertyName

atau

Get-something | select -expand PropertyName

atau

Get-something | select -exp PropertyName

Saya membuat saran-saran ini untuk mereka yang mungkin hanya mencari perintah single-line untuk mendapatkan beberapa informasi dan ingin memasukkan contoh dunia nyata.

Dalam mengelola Office 365 via PowerShell, berikut adalah contoh yang saya gunakan untuk mendapatkan semua pengguna / grup yang telah ditambahkan ke daftar "BookInPolicy":

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

Hanya menggunakan "Select BookInPolicy" memotong beberapa anggota, jadi terima kasih atas informasi ini!

JustaDaKaje
sumber
27

Anda bisa mendapatkan properti dengan nama menggunakan Select-Objectcmdlet dan menentukan nama properti yang Anda minati. Perhatikan bahwa ini tidak hanya mengembalikan nilai mentah untuk properti itu; alih-alih Anda mendapatkan sesuatu yang masih berperilaku seperti objek.

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

[PS]> $property

Name
----
armsvc

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

Untuk menggunakan nilai properti itu, Anda masih perlu mengidentifikasi properti yang Anda cari, bahkan jika hanya ada satu properti:

[PS]> $property.Name
armsvc

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

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

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

Seperti jawaban lain di sini, jika Anda ingin menggunakan satu properti dalam sebuah string, Anda perlu mengevaluasi ekspresi (letakkan tanda kurung di sekitarnya) dan awali dengan tanda dolar ($) untuk menyatakan ekspresi secara dinamis sebagai variabel yang akan dimasukkan ke dalam string:

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

Cukup benar, orang lain telah menjawab pertanyaan ini dengan merekomendasikan -ExpandPropertyparameter untuk Select-Objectcmdlet. Ini memintas beberapa sakit kepala dengan mengembalikan nilai properti yang ditentukan, tetapi Anda akan ingin menggunakan pendekatan yang berbeda dalam skenario yang berbeda.

-ExpandProperty <String>

Menentukan properti yang akan dipilih, dan menunjukkan bahwa upaya harus dilakukan untuk memperluas properti itu

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

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

Charlie Joynt
sumber
8

Coba ini :

$obj = @{
    SomeProp = "Hello"
}

Write-Host "Property Value is $($obj."SomeProp")"
Rainman-63
sumber
Selamat datang di StackOverflow, harap edit pertanyaan Anda dan jelaskan mengapa ia harus mencoba ini dan mengapa ini meningkatkan jawaban yang sudah ada.
T3 H40
Saya berkonflik dengan upvote versus downvote karena jawaban ini adalah IMO cara paling sederhana untuk mendapatkan properti dengan aman berdasarkan nama string properti dari suatu objek tetapi juga tidak menawarkan penjelasan apa pun.
Troy Palacino
`` `$ obj = @ {Prop =" Value "; }; $ propName = "Prop" '; Host-Tulis "Nilai $ propName adalah $ ($ obj." $ PropName ")" $ propName = "NonexistentProp" '; Host-Tulis "Nilai $ propName adalah $ ($ obj." $ PropName ")" `` `akan mencetak The value of Prop is Value dan kemudianThe value of NonexistentProp is
Troy Palacino
WOW! dokumentasi penurunan harga ditautkan dalam bantuan untuk komentar tetapi tidak berlaku untuk mereka. SO devs sangat bagus
Troy Palacino
3

Berikut ini cara alternatif untuk mendapatkan nilai properti objek:

write-host $(get-something).SomeProp
Duncan Clay
sumber
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
sumber
$ arr = @ ("jind", 12, "singh") host-host $ arr [1] read-host $ arr + = "reza" host-host $ arr [3] host-baca write-host $ arr [ $ arr.length-1] read-host $ arr = $ arr -ne $ arr [1] host-host $ arr read-host foreach ($ i dalam $ arr) {write-host $ i}
dhanoa