オブジェクト配列をソートする

オブジェクト配列のソートには「Sort-Object」というCmdletを使います。

「Sort-Object」

普通に使うとファイル名の昇順ソートになります。

ファイル名の昇順ソート
MSH C:\> get-childitem | sort-object

    Directory: FileSystem::C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-ar--        2004/12/26     16:35       8419 CLDMA.LOG
-a---        2005/09/03     23:32        736 devicetable.log
da---        2005/08/18      0:45            Documents and Settings
d----        2005/09/30      2:06            Inetpub
d----        2004/02/22     22:22            j2sdk1.4.1_06
-a---        2005/04/24      4:20        730 odbcconf.log
dar--        2005/10/12     22:23            Program Files
d----        2004/03/23      0:26            temp
d----        2005/09/18      5:54            TestDir
da---        2005/10/08     22:33            WINNT
da---        2004/02/22     17:37            WUTemp
d----        2004/02/28      2:33            マイ ダウンロード


「-property」をつけると指定プロパティでソート可能です。

「length」=ファイルサイズでソート
MSH C:\> get-childitem | sort-object -property length

    Directory: FileSystem::C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2005/04/24      4:20        730 odbcconf.log
-a---        2005/09/03     23:32        736 devicetable.log
-ar--        2004/12/26     16:35       8419 CLDMA.LOG
da---        2005/10/08     22:33            WINNT
d----        2005/09/18      5:54            TestDir
d----        2004/02/28      2:33            マイ ダウンロード
da---        2004/02/22     17:37            WUTemp
d----        2004/03/23      0:26            temp
d----        2005/09/30      2:06            Inetpub
da---        2005/08/18      0:45            Documents and Settings
dar--        2005/10/12     22:23            Program Files
d----        2004/02/22     22:22            j2sdk1.4.1_06


Cmdletヘルプには載っていませんが、MSDNを見ると、
Sort-Objectは、複数の「ソートキー」を配列で渡すことができるようです。

拡張子で降順ソート、ファイルサイズで昇順ソート
MSH C:\..\Orca> get-childitem |
>> sort-object @{ e = { $_.extension }; asc = $false },
>> @{ e = { $_.length }; asc = $true }
>>

    Directory: FileSystem::C:\Program Files\Orca

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2005/03/24     18:07     304128 Orca.exe
-a---        2005/03/24     18:07      48640 orca.dat
-a---        2005/03/24     19:48     342528 logo.cub
-a---        2005/03/24     19:48     442368 mergemod.cub
-a---        2005/03/24     19:48     629248 XPlogo.cub
-a---        2005/03/24     19:48     647168 darice.cub
-a---        2005/03/24     18:07     604652 orca.chm