使用-Descending时,Sort-Object会生成不同的对象

时间:2017-12-23 21:45:01

标签: powershell sorting

为什么Sort-Object在使用-Descending时会产生不同的对象? NoteProperty成员不一样。

此外,写入控制台时,除非使用Name,否则不会显示-Descending属性。那是为什么?

C:>Get-Type | Select-Object -Property BaseType,Name | gm

   TypeName: Selected.System.RuntimeType

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
BaseType    NoteProperty RuntimeType BaseType=System.Object
Name        NoteProperty string Name=Registry

C:>Get-Type | Select-Object -Property BaseType,Name | Sort-Object -Property BaseType,Name | gm

   TypeName: Selected.System.RuntimeType

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
BaseType    NoteProperty object BaseType=null
Name        NoteProperty string Name=_Activator

C:>Get-Type | Select-Object -Property BaseType,Name | Sort-Object -Property BaseType,Name -Descending | gm

   TypeName: Selected.System.RuntimeType

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
BaseType    NoteProperty RuntimeType BaseType=System.Xml.Xsl.XsltException
Name        NoteProperty string Name=XsltCompileException

对于不包含有关Get-Type的信息,我深表歉意。 https://gallery.technet.microsoft.com/scriptcenter/Get-Type-Get-exported-fee19cf7

2 个答案:

答案 0 :(得分:1)

这不是一个本机属于PoSH的cmdlet。它是OP写的或从其他来源获得的东西。如果来自OP以外的其他来源应该与该作者联系,询问会发生什么。

如果使用内置cmdlet执行相同操作,例如Get-Date,我们会看到所有成员都是相同的。

Get-Date | 
Select-Object -Property BaseType,Name | 
Sort-Object -Property BaseType, Name  | 
Get-Member

  TypeName: Selected.System.DateTime

Name        MemberType   Definition                    
----        ----------   ----------                    
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()             
GetType     Method       type GetType()                
ToString    Method       string ToString()             
BaseType    NoteProperty object BaseType=null          
Name        NoteProperty object Name=null              



Get-Date | Select-Object -Property BaseType,Name | 
Sort-Object -Property BaseType, Name -Descending | 
Get-Member

   TypeName: Selected.System.DateTime

Name        MemberType   Definition                    
----        ----------   ----------                    
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()             
GetType     Method       type GetType()                
ToString    Method       string ToString()             
BaseType    NoteProperty object BaseType=null          
Name        NoteProperty object Name=null              

因此,似乎专门针对此cmdlet的实现,OP正在寻求清晰度。

答案 1 :(得分:-1)

您的GetType调用可能会导致以$null开头的数组,因为它有一个try-catch块,提供错误值$null。然后,如果将任何参数传递给Get-Type,则该null将被过滤掉,但是您传递无,因此null仍然存在于输出中。然后,当结果通过管道传递给Select-Object时,只解析管道中的第一个对象以检查是否存在要显示的所有列,如果null是第一个对象,则它没有属性,因此没有任何内容显示。

要修复此问题,请将| Where-Object {$_ -ne $null}添加到最后一个重要行中| Where-Object -FilterScript $WhereBlock之前的Get-Type.ps1脚本中。这将过滤掉先前try-catch块产生的任何空值,并且您将只获得具有值的对象数组。