为什么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
答案 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块产生的任何空值,并且您将只获得具有值的对象数组。