2013-01-18 216 views
68

在PowerShell中,如何通過指定其名稱(字符串)來獲取對象的屬性值?我想要類似以下內容:如何通過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" 

在PowerShell中是否有類似於「Get-PropertyByName」的東西?

回答

110

當然

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

或與此有關:

$obj."SomeProp" 
+7

記得展開:'select -expand「SomeProp」'如果你想要的值。 ''選擇「SomeProp」'返回一個屬性爲「SomeProp」的customobject,然後他幾乎回到第1步。 –

+2

有沒有在'write-host'中使用'$ obj。「SomeProp」'的方法? –

+0

@TheMuffinMan,是的,它是一個普遍適用的功能,像寫主機$ obj。「$ somepropertyname」 –

24

擴大在@aquinas:

Get-something | select -ExpandProperty PropertyName 

Get-something | select -expand PropertyName 

Get-something | select -exp PropertyName 

我提出這些建議對於那些可能只是尋找一個單行命令來獲取一些信息,並希望包括一個真實世界的例子。

在通過PowerShell中管理Office 365,這裏是我用來獲取所有已添加到「BookInPolicy」列表中的用戶/組的示例:

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

只需使用「選擇BookInPolicy」被切斷幾個成員,所以感謝您提供這些信息!

2

試試這個:

$obj = @{ 
    SomeProp = "Hello" 
} 

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

歡迎來到StackOverflow,請編輯你的問題,並解釋*爲什麼*他應該嘗試這個和*爲什麼*它改善了已經現有答案。 –

8

可以按名稱使用Select-Object cmdlet,並指定屬性名(S)你有興趣得到財產請注意,這不是簡單地返回。該財產的原始價值;相反,你得到的東西仍然像對象一樣。

[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 

相當正確的是,其他人通過推薦Select-Object cmdlet的-ExpandProperty參數來回答此問題。這通過返回指定屬性的值繞過了一些頭痛的問題,但是您會希望在不同的場景中使用不同的方法。

-ExpandProperty <String>

指定屬性來選擇,並指出應該嘗試 進行拓展,物業

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 = @( 「吉恩德」,12, 「星」) 寫主機$ ARR [1] 讀主機 $ ARR + = 「禮」 寫主機$ ARR [3] 讀主機 寫主機$ ARR [$ arr.length-1] 讀主機 $ ARR = $ ARR -ne $ ARR [1] 寫主機$ ARR 讀主機 的foreach($ i的$ ARR ) {write-host $ i} – dhanoa