【问题标题】:How to get an object's property's value by property name?如何通过属性名称获取对象的属性值?
【发布时间】:2013-01-02 14:23:34
【问题描述】:

在 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”的东西吗?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    没问题

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

    或者就此而言:

    $obj."SomeProp"
    

    【讨论】:

    • 如果您想要该值,请记住展开:select -expand "SomeProp"select "SomeProp" 返回一个带有属性“SomeProp”的自定义对象,然后他几乎回到了第 1 步。
    • 有没有办法在write-host中使用$obj."SomeProp"
    • @TheMuffinMan,是的,这是一个普遍适用的功能,比如 write-host $obj."$somepropertyname"
    • 当您的字符串在变量中时,$obj.($propName) 也可以使用。 (括号不是必需的,但如果没有括号,我觉得它真的很奇怪。)
    • 如果您将$propName 存储在对象中,例如$Headers.PropertyName,则需要括号$obj.($Headers.PropertyName)
    【解决方案2】:

    扩展@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”就切断了几个成员,因此感谢您提供此信息!

    【讨论】:

      【解决方案3】:

      您可以使用Select-Object cmdlet 并指定您感兴趣的属性名称,按名称获取属性。请注意,这不仅仅返回原始值该财产;相反,你得到的东西仍然像一个对象。

      [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
      

      【讨论】:

        【解决方案4】:

        试试这个:

        $obj = @{
            SomeProp = "Hello"
        }
        
        Write-Host "Property Value is $($obj."SomeProp")"
        

        【讨论】:

        • 欢迎来到 StackOverflow,请编辑您的问题并解释为什么他应该尝试这个以及为什么它改进了现有的答案。
        • 我在赞成票和反对票方面存在冲突,因为这个答案是 IMO 最简单的方法,可以根据从对象中获取属性的字符串名称来安全地获取属性,但也没有提供任何解释.
        • ``` $obj = @{ Prop = "Value"; }; $propName = "道具"'; Write-Host "$propName 的值为 $($obj."$propName")" $propName = "NonexistentProp"'; Write-Host "The value of $propName is $($obj."$propName")" ``` 将打印The value of Prop is Value 然后The value of NonexistentProp is
        • 哇!降价文档链接在 cmets 的帮助中,但不适用于它们。非常好的 SO 开发人员
        【解决方案5】:

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

        write-host $(get-something).SomeProp
        

        【讨论】:

        • 与保存在变量中的 propname 一起使用:` $someprop = "SomeProp";写主机 $(get-something).$someprop`
        【解决方案6】:
        $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] 读取-host write-host $arr[$arr.length-1] read-host $arr = $arr -ne $arr[1] write-host $arr read-host foreach ($i in $arr) {write-host $i}
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-17
        • 2014-09-23
        • 2022-08-23
        • 2018-04-19
        • 1970-01-01
        • 1970-01-01
        • 2012-05-23
        相关资源
        最近更新 更多