Özellik adına göre bir nesnenin özelliğinin değeri nasıl alınır?


132

PowerShell'de, adını (bir dize) belirterek bir nesnenin özellik değerini nasıl alırsınız? Aşağıdakine benzer bir şey istiyorum:

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

PowerShell'de "Get-PropertyByName" e benzer bir şey var mı?

Yanıtlar:


198

Elbette

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

Veya bu konuda:

$obj."SomeProp"

12
genişletmeyi unutmayın: select -expand "SomeProp"eğer değeri istiyorsanız. select "SomeProp""SomeProp" özelliğine sahip bir özel nesne döndürür ve hemen hemen 1. adımda geri döner.
Frode F.

2
Kullanmak için bir yolu var mı $obj."SomeProp"içinde write-host?
Kek Adam

@TheMuffinMan, evet, write-host $ obj gibi genel olarak uygulanabilir bir özelliktir. "$ Somepropertyname"
Elroy Flynn

4
Dizeniz bir değişkendeyken $obj.($propName)de çalışır. (Parantezler gerekli değildir, ancak bunlar olmadan bana gerçekten tuhaf görünüyor .)
jpmc26

3
Eğer varsa $propName, örneğin bir nesne saklanır $Headers.PropertyNamesonra parantezler olmazsa $obj.($Headers.PropertyName).
Jonas Lomholdt

41

@Aquinas üzerine genişleyen:

Get-something | select -ExpandProperty PropertyName

veya

Get-something | select -expand PropertyName

veya

Get-something | select -exp PropertyName

Bu önerileri, bir parça bilgi elde etmek için sadece tek satırlık bir komut arayanlar için yaptım ve gerçek dünyadan bir örnek eklemek istedim.

Office 365'i PowerShell aracılığıyla yönetirken, "BookInPolicy" listesine eklenen tüm kullanıcıları / grupları elde etmek için kullandığım bir örnek:

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

Sadece "Select BookInPolicy" kullanmak birkaç üyeyi kesiyordu, bu yüzden bu bilgi için teşekkürler!


27

Cmdlet'i kullanarak ve ilgilendiğiniz özellik ad (lar) ını belirterek bir özelliği ada göre edinebilirsiniz Select-Object. Bunun yalnızca o özelliğin ham değerini döndürmediğini unutmayın; bunun yerine hala bir nesne gibi davranan bir şey elde edersiniz.

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

[PS]> $property

Name
----
armsvc

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

Söz konusu mülkün değerini kullanmak için , yalnızca bir mülk olsa bile, hangi mülkün peşinde olduğunuzu belirlemeniz gerekir:

[PS]> $property.Name
armsvc

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

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

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

Buradaki diğer yanıtlarda olduğu gibi, bir dize içinde tek bir özellik kullanmak istiyorsanız, ifadeyi dinamik olarak eklenecek bir değişken olarak bildirmek için ifadeyi değerlendirmeniz (etrafına parantez koyun) ve dolar işareti ($) ile ön ek yapmanız gerekir. dizeye:

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

Oldukça doğru bir şekilde, diğerleri bu soruyu cmdlet için -ExpandPropertyparametre Select-Objectönererek yanıtladılar . Bu, belirtilen özelliğin değerini döndürerek baş ağrısının bir kısmını atlar, ancak farklı senaryolarda farklı yaklaşımlar kullanmak isteyeceksiniz.

-ExpandProperty <String>

Seçilecek bir özelliği belirtir ve bu özelliği genişletmek için bir girişimde bulunulması gerektiğini belirtir

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

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


8

Bunu dene :

$obj = @{
    SomeProp = "Hello"
}

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

StackOverflow'daki hoş geldiniz, sorunuzu düzenleyip açıklayınız neden o bu denemelisiniz ve niçin zaten varolan cevapları iyileştirir.
T3 H40

Olumlu oyla olumsuz oylama konusunda çelişkili durumdayım çünkü bu yanıt, bir nesneden mülkün dize adına sahip olmaya dayalı bir özelliği güvenli bir şekilde almanın en basit yoludur ancak aynı zamanda herhangi bir açıklama sunmamaktadır.
Troy Palacino

`` $ obj = @ {Prop = "Değer"; }; $ propName = "Prop" '; Yazma-Ana Bilgisayarı "$ propName değeri $ ($ obj." $ PropName ")" $ propName = "VarolmayanProp" '; Write-Host "$ propName değeri $ ($ obj." $ PropName ")" `` yazdırılacak The value of Prop is Value ve ardındanThe value of NonexistentProp is
Troy Palacino

VAOV! Markdown belgeleri, yorumlar için yardımda bağlantılıdır, ancak onlar için geçerli değildir. gerçekten güzel SO geliştiricileri
Troy Palacino

3

İşte bir nesnenin özellik değerini almanın alternatif bir yolu:

write-host $(get-something).SomeProp

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

$ arr = @ ("jind", 12, "singh") yazma-barındırma $ arr [1] okuma-barındırma $ arr + = "reza" yazma-barındırma $ arr [3] okuma-barındırma yazma-barındırma $ dizi [ $ arr.length-1] read-host $ arr = $ arr -ne $ arr [1] write-host $ arr read-host foreach ($ dizi içinde $ i) {write-host $ i}
dhanoa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.