2013-01-18 84 views
68

Trong PowerShell, làm thế nào để bạn nhận được giá trị thuộc tính của đố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:Cách lấy giá trị của thuộc tính của đối tượng theo tên thuộc tính trong 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" 

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

Trả lời

110

chắc

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

Hoặc cho rằng vấn đề:

$obj."SomeProp" 
+7

nhớ mở rộng: 'select -expand" SomeProp "' nếu bạn muốn giá trị. 'select" SomeProp "' trả về một customobject với một thuộc tính "SomeProp", và sau đó anh ta khá nhiều trở lại ở bước 1. –

+2

Có cách nào để sử dụng '$ obj." SomeProp "' trong 'write-host'? –

+0

@TheMuffinMan, vâng, nó là một tính năng thường được áp dụng, như viết $ obj. "$ Somepropertyname" –

24

Mở rộng trên @aquinas:

Get-something | select -ExpandProperty PropertyName 

hoặc

Get-something | select -expand PropertyName 

hoặc

Get-something | select -exp PropertyName 

tôi thực hiện những gợi ý cho những người mà chỉ có thể tìm kiếm một lệnh đơn dòng để có được một số mẩu thông tin và muốn bao gồm một ví dụ thực tế.

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

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

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

2

Hãy thử điều này:

$obj = @{ 
    SomeProp = "Hello" 
} 

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

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 * tại sao * anh ấy nên thử cái này và * tại sao nó cải thiện câu trả lời hiện có. –

8

Bạn có thể có được một tài sản theo tên bằng cách sử dụng Select-Object lệnh và chỉ định tên tài sản (s) mà bạn đang quan tâm đến Lưu ý rằng đây không chỉ đơn giản là trở lại. giá trị thô cho thuộc tính đó; thay vào đó bạn nhận được một cái gì đó mà vẫn cư 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 tài sản đó, bạn vẫn sẽ cần phải xác định được tài sản mà bạn đang theo đuổi, ngay cả khi chỉ có một tài sản:

[PS]> $property.Name 
armsvc 

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

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

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

Theo câu trả lời khác ở đây, nếu bạn muốn sử dụng một thuộc tính duy nhất trong một chuỗi, bạn cần đánh giá biểu thức (đặt các dấu ngoặc xung quanh nó) và tiền tố có ký hiệu đô la ($) để khai báo biểu thức động dưới dạng 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 

Khá 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 tham số -ExpandProperty cho lệnh ghép ngắn Select-Object. Điều này bỏ qua một số nhức đầu bằng cách trả về giá trị của thuộc tính được chỉ định, nhưng bạn sẽ muốn sử dụng các cách tiếp cận khác nhau trong các kịch bản khác nhau.

-ExpandProperty <String>

Chỉ định một tài sản để lựa chọn, và chỉ ra rằng một nỗ lực nên được thực hiện để mở rộng mà tài sản

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

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

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 
+0

$ arr = @ ("Jind", 12 "singh") ghi-host $ arr [1] đọc-host $ arr + = "Reza" ghi-host $ arr [3] đọc-host ghi-host $ arr [$ arr.length-1] đọc-host $ arr = $ arr -ne $ arr [1] ghi-host $ arr đọc-host foreach ($ i trong $ arr) {write-host $ i} – dhanoa

Các vấn đề liên quan