PowerShell排序对象

8

我有一个“xml-node”对象数组:

xml-node object:
    node <---------- this object is the one that has 3 other attributes (see below)
    path
    pattern

Node:
filename
modification
type

问题:

我想根据“修改时间”属性对这个XML节点数组进行排序;我该如何处理?

我已尝试:

$nodes | sort-object Node.modification 
2个回答

25

仅使用属性名称按对象的直接属性排序。

$nodes | sort-object modification

您也可以使用ScriptBlock对对象进行排序。 因此,以下内容也可正常工作:

$nodes | sort-object { $_.modification }

显然,仅此而已并不是非常有用的,但如果您想以某种方式对对象进行排序,而不仅仅是属性,您可以在ScriptBlock内操作属性。

例如,按进程名称中的最后一个字符对进程进行排序。

get-process| sort-object { $_.name[-1] }

编辑:

要访问一个属性的属性:

$nodes | sort-object { $_.node.modification }

抱歉,我必须编辑我的问题;“修改”属性在更深的一层;这就是我卡住的地方; - DotNet98
非常有帮助,谢谢!那么是否可以将其作为排序列表获取;像这样,我可以使用 $x = $nodes | sort-object { $.node.modification } 或类似的东西(现在,$x 没有排序;我尝试将结果传输到 ... | select $;,但那也不是很有效吗? - DotNet98
是的,$x = $nodes | sort-object { $_.node.modification } 应该会得到 $x 排序后的列表。 - Rynant
你说得完全正确!谢谢Rynan。赞一个给你。我会把你的标记为已解决;并在下面发布一个完整的示例以防其他人有疑问...再次感谢! - DotNet98

1
这里有一个示例,证明Rynant的解决方案实际可行:
cls

$node1 = New-Object PSObject
Add-Member -InputObject $node1 -MemberType NoteProperty -Name fileName -Value "textfile1.txt";  
Add-Member -InputObject $node1 -MemberType NoteProperty -Name fileType -Value "text";  
Add-Member -InputObject $node1 -MemberType NoteProperty -Name modification -Value "2014-02-24";  
$node2 = New-Object PSObject
Add-Member -InputObject $node2 -MemberType NoteProperty -Name fileName -Value "textfile2.txt";  
Add-Member -InputObject $node2 -MemberType NoteProperty -Name fileType -Value "text";  
Add-Member -InputObject $node2 -MemberType NoteProperty -Name modification -Value "2014-03-01";  
$node3 = New-Object PSObject
Add-Member -InputObject $node3 -MemberType NoteProperty -Name fileName -Value "textfile3.txt";  
Add-Member -InputObject $node3 -MemberType NoteProperty -Name fileType -Value "text";  
Add-Member -InputObject $node3 -MemberType NoteProperty -Name modification -Value "2014-02-21";  
$node4 = New-Object PSObject
Add-Member -InputObject $node4 -MemberType NoteProperty -Name fileName -Value "textfile4.txt";  
Add-Member -InputObject $node4 -MemberType NoteProperty -Name fileType -Value "text";  
Add-Member -InputObject $node4 -MemberType NoteProperty -Name modification -Value "2014-02-22";  

$result1 = New-Object PSObject
Add-Member -InputObject $result1 -MemberType NoteProperty -Name Node -Value $node1;  
Add-Member -InputObject $result1 -MemberType NoteProperty -Name Path -Value "aaa";  
Add-Member -InputObject $result1 -MemberType NoteProperty -Name Pattern -Value "aaa/aaa[@aaa='aaa']";  

$result2 = New-Object PSObject
Add-Member -InputObject $result2 -MemberType NoteProperty -Name Node -Value $node2;  
Add-Member -InputObject $result2 -MemberType NoteProperty -Name Path -Value "bbb";  
Add-Member -InputObject $result2 -MemberType NoteProperty -Name Pattern -Value "bbb/bbb[@bbb='bbb']";  

$result3 = New-Object PSObject
Add-Member -InputObject $result3 -MemberType NoteProperty -Name Node -Value $node3;  
Add-Member -InputObject $result3 -MemberType NoteProperty -Name Path -Value "ccc";  
Add-Member -InputObject $result3 -MemberType NoteProperty -Name Pattern -Value "ccc/ccc[@ccc='ccc']";  

$result4 = New-Object PSObject
Add-Member -InputObject $result4 -MemberType NoteProperty -Name Node -Value $node4;  
Add-Member -InputObject $result4 -MemberType NoteProperty -Name Path -Value "ddd";  
Add-Member -InputObject $result4 -MemberType NoteProperty -Name Pattern -Value "ddd/ddd[@ddd='ddd']";  


$results = @()
$results += $result1
$results += $result2, $result3, $result4

$x = $results | sort-object { $_.Node.modification }; 
$y = $results | sort-object { $_.Node.modification } -desc; 

$x
$y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接