2013-01-18 293 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

相关问题