Làm thế nào để có được giá trị tài sản của một đối tượng theo tên thuộc tính?


132

Trong PowerShell, làm thế nào để bạn có được giá trị thuộc tính của một đối tượng bằng cách chỉ định tên của nó (một chuỗi)? Tôi muốn một cái gì đó như sau:

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

Có thứ gì đó tương tự như "Get-PropertyByName" trong PowerShell không?

Câu trả lời:


198

Chắc chắn rồi

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

Hoặc cho vấn đề đó:

$obj."SomeProp"

12
nhớ mở rộng: select -expand "SomeProp"nếu bạn muốn giá trị. select "SomeProp"trả về một tùy chỉnh với một thuộc tính "someProp", và sau đó anh ta quay lại khá nhiều ở bước 1.
Frode F.

2
Có cách nào để sử dụng $obj."SomeProp"trong write-host?
Người đàn ông Muffin

@TheMuffinMan, vâng, đây là một tính năng thường được áp dụng, như máy chủ ghi $ obj. "$ Somepropertyname"
Elroy Flynn

4
Khi chuỗi của bạn là trong một biến, $obj.($propName)cũng hoạt động. (Không cần phải có dấu ngoặc đơn, nhưng nó thực sự kỳ lạ đối với tôi mà không có chúng.)
jpmc26

3
Nếu bạn có $propNamelưu trữ trong một đối tượng chẳng hạn $Headers.PropertyNamethì dấu ngoặc đơn là bắt buộc $obj.($Headers.PropertyName).
Jonas Lomkeept

41

Mở rộng khi @aquinas:

Get-something | select -ExpandProperty PropertyName

hoặc là

Get-something | select -expand PropertyName

hoặc là

Get-something | select -exp PropertyName

Tôi đã đưa ra những gợi ý này cho những người có thể đang tìm kiếm một dòng lệnh để có được một số thông tin và muốn đưa vào một ví dụ trong thế giới thực.

Khi quản lý Office 365 qua PowerShell, đây là một ví dụ tôi đã sử dụng để có được tất cả người dùng / nhóm đã được thêm vào danh sách "BookInPolicy":

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

Chỉ cần sử dụng "Chọn BookInPolicy" đã cắt đứt một số thành viên, vì vậy cảm ơn bạn về thông tin này!


27

Bạn có thể nhận một thuộc tính theo tên bằng cách sử dụng Select-Objectlệnh ghép ngắn và chỉ định (các) tên thuộc tính mà bạn quan tâm. Lưu ý rằng điều này không chỉ đơn giản trả về giá trị thô cho thuộc tính đó; thay vào đó bạn nhận được một cái gì đó vẫn hành xử như một đối tượng.

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

[PS]> $property

Name
----
armsvc

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

Để sử dụng giá trị cho thuộc tính đó, bạn vẫn sẽ cần xác định thuộc tính nào bạn đang theo đuổi, ngay cả khi chỉ có một thuộc tính:

[PS]> $property.Name
armsvc

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

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

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

Theo các câu trả lời khác ở đây, nếu bạn muốn sử dụng một thuộc tính trong một chuỗi, bạn cần đánh giá biểu thức (đặt dấu ngoặc quanh nó) và tiền tố với ký hiệu đô la ($) để khai báo biểu thức một cách linh hoạt như một biến được chèn vào chuỗi:

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

Hoàn toàn chính xác, những người khác đã trả lời câu hỏi này bằng cách giới thiệu -ExpandPropertytham số cho Select-Objectlệnh ghép ngắn. Điều này bỏ qua một số vấn đề đau đầu bằng cách trả về giá trị của tài sản được chỉ định, nhưng bạn sẽ muốn sử dụng các phương pháp khác nhau trong các tình huống khác nhau.

-ExpandProperty <String>

Chỉ định một thuộc tính cần chọn và chỉ ra rằng cần thực hiện một nỗ lực để mở rộng thuộc tính đó

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

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


8

Thử cái này :

$obj = @{
    SomeProp = "Hello"
}

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

Chào mừng bạn đến với StackOverflow, vui lòng chỉnh sửa câu hỏi của bạn và giải thích lý do tại sao anh ta nên thử điều này và tại sao nó cải thiện các câu trả lời đã có.
T3 H40

Tôi bị mâu thuẫn với upvote so với downvote vì câu trả lời này là IMO cách đơn giản nhất để có được một tài sản an toàn dựa trên việc có tên chuỗi của tài sản từ một đối tượng nhưng cũng không đưa ra bất kỳ lời giải thích nào.
Troy Palacino

`` `$ obj = @ {Prop =" Giá trị "; }; $ propName = "Prop" '; Máy chủ ghi "Giá trị của $ propName là $ ($ obj." $ PropName ")" $ propName = "nonexistentProp" '; Máy chủ ghi "Giá trị của $ propName là $ ($ obj." $ PropName ")" `` `sẽ in The value of Prop is Value và sau đóThe value of NonexistentProp is
Troy Palacino

Ôi! tài liệu đánh dấu được liên kết trong trợ giúp cho ý kiến ​​nhưng không áp dụng cho họ. nhà phát triển SO thực sự tốt đẹp
Troy Palacino

3

Đây là một cách khác để lấy giá trị thuộc tính của đối tượng:

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

$ Array = @ ("jind", 12, "singh") write-host $ Array [1] read-host $ Array + = "reza" write-host $ Array [3] read-host write-host $ Array [ $ Array.length-1] read-host $ Array = $ Array -ne $ Array [1] write-host $ Array read-host foreach ($ i in $ Array) {write-host $ i}
dhanoa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.