วิธีรับค่าคุณสมบัติของวัตถุตามชื่อคุณสมบัติ?


132

ใน PowerShell คุณจะได้รับค่าคุณสมบัติของวัตถุโดยการระบุชื่อ (สตริง) ได้อย่างไร ฉันต้องการสิ่งต่อไปนี้:

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

มีบางอย่างที่คล้ายกับ "Get-PropertyByName" ใน PowerShell หรือไม่

คำตอบ:


198

แน่ใจ

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

หรือสำหรับเรื่องนั้น:

$obj."SomeProp"

12
จำขยาย: select -expand "SomeProp"ถ้าคุณต้องการค่า select "SomeProp"ส่งคืนวัตถุที่กำหนดเองด้วยคุณสมบัติ "SomeProp" จากนั้นเขาก็กลับมาที่ขั้นตอนที่ 1
Frode F.

2
มีวิธีใช้$obj."SomeProp"ในwrite-host?
The Muffin Man

@TheMuffinMan ใช่มันเป็นคุณสมบัติที่ใช้ได้ทั่วไปเช่น write-host $ obj "$ somepropertyname"
Elroy Flynn

4
เมื่อสตริงของคุณอยู่ในตัวแปร$obj.($propName)ก็ใช้ได้เช่นกัน (วงเล็บไม่จำเป็น แต่มันก็ดูมันแปลก ๆ กับผมโดยที่พวกเขา.)
jpmc26

3
หากคุณมี$propNameเก็บไว้ในวัตถุตัวอย่างแล้ววงเล็บจะต้อง$Headers.PropertyName $obj.($Headers.PropertyName)
Jonas Lomholdt

41

ขยายไปที่ @aquinas:

Get-something | select -ExpandProperty PropertyName

หรือ

Get-something | select -expand PropertyName

หรือ

Get-something | select -exp PropertyName

ฉันให้คำแนะนำเหล่านี้สำหรับผู้ที่อาจกำลังมองหาคำสั่งบรรทัดเดียวเพื่อรับข้อมูลบางส่วนและต้องการรวมตัวอย่างในโลกแห่งความเป็นจริง

ในการจัดการ Office 365 ผ่าน PowerShell นี่คือตัวอย่างที่ฉันใช้เพื่อรับผู้ใช้ / กลุ่มทั้งหมดที่ถูกเพิ่มลงในรายการ "BookInPolicy":

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

เพียงแค่ใช้ "Select BookInPolicy" ก็ตัดสมาชิกหลายคนออกไปแล้วดังนั้นขอขอบคุณสำหรับข้อมูลนี้!


27

คุณสามารถรับคุณสมบัติตามชื่อโดยใช้Select-Objectcmdlet และระบุชื่อคุณสมบัติที่คุณสนใจโปรดทราบว่าสิ่งนี้ไม่เพียงส่งคืนค่าดิบสำหรับคุณสมบัตินั้น แทนที่จะได้รับสิ่งที่ยังคงทำตัวเหมือนสิ่งของ

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

[PS]> $property

Name
----
armsvc

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

ในการใช้ค่าสำหรับคุณสมบัตินั้นคุณจะต้องระบุว่าคุณอยู่หลังพร็อพเพอร์ตี้ใดแม้ว่าจะมีเพียงคุณสมบัติเดียว:

[PS]> $property.Name
armsvc

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

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

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

ตามคำตอบอื่น ๆ ที่นี่หากคุณต้องการใช้คุณสมบัติเดียวภายในสตริงคุณต้องประเมินนิพจน์ (ใส่วงเล็บรอบ ๆ ) และนำหน้าด้วยเครื่องหมายดอลลาร์ ($) เพื่อประกาศนิพจน์แบบไดนามิกเป็นตัวแปรที่จะแทรก ลงในสตริง:

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

ค่อนข้างถูกต้องคนอื่น ๆ ตอบคำถามนี้โดยแนะนำ-ExpandPropertyพารามิเตอร์สำหรับSelect-Objectcmdlet สิ่งนี้จะหลีกเลี่ยงความปวดหัวบางอย่างโดยการส่งคืนค่าคุณสมบัติที่ระบุ แต่คุณจะต้องใช้วิธีการที่แตกต่างกันในสถานการณ์ต่างๆ

-ExpandProperty <String>

ระบุคุณสมบัติที่จะเลือกและระบุว่าควรพยายามขยายคุณสมบัตินั้น

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

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


8

ลองสิ่งนี้:

$obj = @{
    SomeProp = "Hello"
}

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

ยินดีต้อนรับสู่ StackOverflow โปรดแก้ไขคำถามของคุณและอธิบายว่าเหตุใดเขาจึงควรลองสิ่งนี้และเหตุใดจึงปรับปรุงคำตอบที่มีอยู่แล้ว
T3 H40

ฉันขัดแย้งกันในการโหวตขึ้นและลงคะแนนเนื่องจากคำตอบนี้เป็นวิธีที่ง่ายที่สุดในการรับคุณสมบัติอย่างปลอดภัยโดยใช้ชื่อสตริงของคุณสมบัติจากวัตถุ แต่ยังไม่มีคำอธิบายใด ๆ
Troy Palacino

`` $ obj = @ {Prop = "มูลค่า"; }; $ propName = "ข้อเสนอ" '; เขียนโฮสต์ "ค่าของ $ propName คือ $ ($ obj." $ propName ")" $ propName = "NonexistentProp" '; Write-Host "ค่าของ $ propName คือ $ ($ obj." $ propName ")" `` จะพิมพ์ The value of Prop is Value แล้วThe value of NonexistentProp is
Troy Palacino

ว้าว! เอกสาร Markdown เชื่อมโยงอยู่ในความช่วยเหลือสำหรับความคิดเห็น แต่ใช้ไม่ได้กับพวกเขา ดีมาก SO devs
Troy Palacino


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") 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 ใน $ arr) {write-host $ i}
dhanoa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.