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

Powershell 如何从PSCustomObject读取属性的顺序?,powershell,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 NoteProp

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

我想看这份订单。如何获取?

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

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
如果您只想使用“选择对象”获得属性名称的有序列表,请展开“名称”属性:

或使用属性枚举PowerShell 3.0+:

$PropertyNames = $o12.psobject.Properties.Name

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

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
如果您只想使用“选择对象”获得属性名称的有序列表,请展开“名称”属性:

或使用属性枚举PowerShell 3.0+:

$PropertyNames = $o12.psobject.Properties.Name

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

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

数组中的对象不共享属性:

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

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

PS> $obj[0].PSObject.Properties.Name
Name
SamAccountName

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

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

数组中的对象不共享属性:

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

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

PS> $obj[0].PSObject.Properties.Name
Name
SamAccountName