Powershell Sort-Object
19,180
Solution 1
Use the property name only for sorting by the object's immediate properties.
$nodes | sort-object modification
You can also use a ScriptBlock to sort objects. So this would work as well:
$nodes | sort-object { $_.modification }
Obviously that is not very useful by itself, but if you want to sort the objects in some way other than simply the property, you can manipulate the properties inside the ScriptBlock.
For example to sort processes by the last chatacter in the process name.
get-process| sort-object { $_.name[-1] }
Edit:
To access a property's property:
$nodes | sort-object { $_.node.modification }
Solution 2
Here's a sample that proves Rynant's solution actually works:
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
Author by
DotNet98
Updated on July 28, 2022Comments
-
DotNet98 almost 2 years
I have an Array of "xml-node" objects:
xml-node object: node <---------- this object is the one that has 3 other attributes (see below) path pattern Node: filename modification type
Problem:
I want to sort this array of xml-nodes based on the "modification" attribute; how would I go about it?
I've tried:
$nodes | sort-object Node.modification
-
DotNet98 about 10 yearssorry, I had to edit my question; the "modification" attribute is one level deeper; that's where I'm a bit stuck;
-
DotNet98 about 10 yearsVery helpful, thanks! so is it possible to get this as a sorted list; like, can I go: $x = $nodes | sort-object { $_.node.modification } or something to that effect (right now, $x is not sorted; I tried piping the result to a ... | select $_; that doesn't really work either?
-
Rynant about 10 yearsYes,
$x = $nodes | sort-object { $_.node.modification }
should result in$x
having the sorted list. -
DotNet98 about 10 yearsYou're absolutely right! Thanks Rynan. Plus one for you. I'll mark yours as answered; and post a complete sample example below just in case anyone else is wondering... thanks again!