首页 > 解决方案 > 在特定列上对数组进行排序的问题

问题描述

在特定列上对数组进行排序时出现问题。

[PSObject[]]$arr = @()

$arr += [PSObject]@{
    who = 'z';
    what = 'snake';
    where = 'c1';
    when = 'd1'
}
$arr += [PSObject]@{
    who = 'z';
    what = 'beer';
    where = 'c1';
    when = 'd1'
}
$arr += [PSObject]@{
    who = 'a';
    what = 'snake';
    where = 'c1';
    when = 'd1'
}
$arr += [PSObject]@{
    who = 'b';
    what = 'ape';
    where = 'c1';
    when = 'd1'
}

$arr | Sort-Object what

输出:

名称 值
---- -----
其中c1
谁
当 d1
什么蛇
其中c1
谁
当 d1
什么猿
其中c1
谁z
当 d1
什么蛇
其中c1
谁z
当 d1
什么啤酒

因此没有按“什么”排序。

请问有什么想法吗?

标签: arrayspowershellsorting

解决方案


将哈希表转换为[PSObject]不符合您的预期。PSObject已经是您定义的哈希表的基本类型,因此您的代码仅创建哈希表列表,而不是创建自定义对象列表。要从哈希表创建自定义对象,请改用PSCustomObject类型加速器(需要 PowerShell v3 或更高版本,在旧版本上使用New-Objectcmdlet)。

示范:

PS C:\> $ht = @{'a'='b'; 'c'='d'} 
PS C:\> $ht.GetType().FullName
System.Collections.Hashtable
PS C:\> $ht.PSBase.GetType().FullName
System.Management.Automation.PSObject
PS C:\> $ht

名称 值
---- -----
光盘
抗体

PS C:\> $o1 = [PSObject]$ht 
PS C:\> $o1.GetType().FullName 
System.Collections.Hashtable 
PS C:\> $o1.PSBase.GetType().FullName
System.Management.Automation.PSObject
PS C:\> $o1

名称 值
---- -----
光盘
抗体

PS C:\> $o2 = [PSCustomObject]$ht 
PS C:\> $o2.GetType().FullName 
System.Management.Automation.PSCustomObject 
PS C:\> $o2.PSBase.GetType().FullName
System.Management.Automation.PSObject
PS C:\> $o2

约
- -
D b

推荐阅读