如何从PSCustomObject中读取属性的顺序?

时间:2016-02-12 11:37:59

标签: powershell

PSCustomObject是否知道其属性的添加顺序?

# Order of properties
$o21 = New-Object PSCustomObject |
  Add-Member NoteProperty a2 2 -passThru |
  Add-Member NoteProperty a1 1 -passThru
$o21 | fl

a2 : 2
a1 : 1

$o12 = New-Object PSCustomObject |
  Add-Member NoteProperty a1 1 -passThru |
  Add-Member NoteProperty a2 2 -passThru
$o12 | fl

a1 : 1
a2 : 2

我想读这个订单。怎么样?

2 个答案:

答案 0 :(得分:5)

要在PowerShell中获取对象属性的有序列表,您可以通过隐藏的Properties memberset属性访问psobject个集合:

PS C:\> $o12.psobject.Properties

MemberType      : NoteProperty
IsSettable      : True
IsGettable      : True
Value           : 1
TypeNameOfValue : System.Int32
Name            : a1
IsInstance      : True

MemberType      : NoteProperty
IsSettable      : True
IsGettable      : True
Value           : 2
TypeNameOfValue : System.Int32
Name            : a2
IsInstance      : True

如果您只想使用Name的有序属性名列表,请展开Select-Object属性:

$PropertyNames = $o12.psobject.Properties |Select-Object -ExpandProperty Name

或使用属性枚举(PowerShell 3.0 +):

$PropertyNames = $o12.psobject.Properties.Name

答案 1 :(得分:0)

扩展Mathias的答案;如果您想获取对象数组的属性列表,则需要根据数组中对象的不同程度执行以下操作之一:

  1. 数组中的所有对象共享相同的属性: 此示例仅拉取数组的第一个对象并获取其属性名称

    $PropertyNames = $o12[0].PSObject.Properties | Select-Object -ExpandProperty Name
    
  2. 数组中的对象不共享属性:

    $PropertyNames = $o12 | ForEach-Object { $_.PSObject.Properties | Select-Object -ExpandProperty Name}
    
  3. 在这两个例子中,重点是属性枚举将发生在顶层。如果您的顶级是一个对象数组而不是PSCustomObject / PSObject,那么您将返回数组属性而不是数组中对象/对象的属性:

    PS> $obj.PSObject.Properties.Name
    Count
    Length
    LongLength
    Rank
    SyncRoot
    IsReadOnly
    IsFixedSize
    IsSynchronized
    
    PS> $obj[0].PSObject.Properties.Name
    Name
    SamAccountName