如何通过属性名称获取对象的属性值?


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"

在PowerShell中是否有类似于“ Get-PropertyByName”的内容?

Answers:


198

当然

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

或就此而言:

$obj."SomeProp"

12
记住扩展:select -expand "SomeProp"如果您想要值。select "SomeProp"返回一个带有属性“ SomeProp”的自定义对象,然后他又回到了第一步。–
Frode F.

2
有没有办法使用的方式$obj."SomeProp"write-host
松饼人

@TheMuffinMan,是的,它是一个普遍适用的功能,例如写入主机$ obj。“ $ somepropertyname”
Elroy Flynn

4
当您的字符串在变量中时,$obj.($propName)也可以使用。(不需要括号,但如果没有括号,这对我来说真的很奇怪。)
jpmc26 '18

3
例如,如果您将$propName存储在一个对象中,$Headers.PropertyName则需要括号$obj.($Headers.PropertyName)
乔纳斯·洛姆霍尔特

41

扩展@aquinas:

Get-something | select -ExpandProperty PropertyName

要么

Get-something | select -expand PropertyName

要么

Get-something | select -exp PropertyName

我为那些可能只是在寻找单行命令以获取一些信息的人提出了这些建议,并希望提供一个真实的示例。

通过PowerShell管理Office 365时,这是一个示例,我用它来获取已添加到“ BookInPolicy”列表中的所有用户/组:

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

仅使用“ Select BookInPolicy”就切断了几个成员,因此感谢您提供此信息!


27

您可以使用cmdlet并通过指定所需的属性名称来按名称获取属性Select-Object。请注意,这不仅会返回该属性的原始值;相反,您得到的东西仍然像对象一样。

[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

相当正确的是,其他人通过推荐cmdlet 的-ExpandProperty参数来回答此问题Select-Object。通过返回指定的属性的值,可以绕过某些麻烦的事情,但是您将需要在不同的情况下使用不同的方法。

-ExpandProperty <String>

指定要选择的属性,并指示应尝试扩展该属性

https://technet.microsoft.com/zh-CN/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

我在upvote与downvote上存在冲突,因为此答案是IMO基于具有对象的属性的字符串名称而安全获取属性的最简单方法,但也未提供任何解释。
特洛伊·帕拉奇诺

$$ = @ {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开发人员
Troy Palacino

3

这是获取对象的属性值的另一种方法:

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

$ arr = @(“ jind”,12,“ singh”)写主机$ arr [1]读主机$ arr + =“ reza”写主机$ arr [3]读主机写主机$ arr [ $ arr.length-1]读主机$ arr = $ arr -ne $ arr [1]写主机$ arr读主机foreach($ i in $ arr){写主机$ i}
dhanoa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.