PowerShell按名称升序排序对象

时间:2018-07-27 01:32:07

标签: powershell sorting

PowerShell似乎没有按名称升序对对象进行排序:

dir | Sort-Object Name

enter image description here

当然,我的目标是按以下顺序对元素进行排序:

1.sql
2.sql
3.sql
4.sql
5.sql
6.sql
...
...
...

您认为有什么出路吗?

2 个答案:

答案 0 :(得分:5)

您需要将数字排序为数字而不是文本;之所以方便,是因为文件名完全是数字,因此您可以更改排序以使用动态脚本块属性,该属性将为管道中的每个项目计算:

| sort-object -Property {
    if (($i = $_.BaseName -as [int])) { $i } else { $_ }
}

说“如果文件名可以转换为整数,则使用该文件名,否则按原样使用”。

答案 1 :(得分:0)

对于用字母字符括起来的更复杂的模式,请使用$ToNatural,该代码通过用零左填充将所有嵌入的数字扩展为唯一的长度(此处为20)。

## source Roman Kuzmin  https://stackoverflow.com/a/5429048/6811411
$ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20,"0") }) }

生成一些测试数据:

> (10..11 + 100..101 + 1..2)|%{new-item -itemtype file -path ("pre_{0}_post.sql" -f $_)
    Directory: A:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-07-27     11:02              0 pre_10_post.sql
-a----       2018-07-27     11:02              0 pre_11_post.sql
-a----       2018-07-27     11:02              0 pre_100_post.sql
-a----       2018-07-27     11:02              0 pre_101_post.sql
-a----       2018-07-27     11:02              0 pre_1_post.sql
-a----       2018-07-27     11:02              0 pre_2_post.sql

> dir| sort
    Directory(: A:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-07-27     11:02              0 pre_1_post.sql
-a----       2018-07-27     11:02              0 pre_10_post.sql
-a----       2018-07-27     11:02              0 pre_100_post.sql
-a----       2018-07-27     11:02              0 pre_101_post.sql
-a----       2018-07-27     11:02              0 pre_11_post.sql
-a----       2018-07-27     11:02              0 pre_2_post.sql

> dir|sort $ToNatural
    Directory: A:\

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-07-27     11:02              0 pre_1_post.sql
-a----       2018-07-27     11:02              0 pre_2_post.sql
-a----       2018-07-27     11:02              0 pre_10_post.sql
-a----       2018-07-27     11:02              0 pre_11_post.sql
-a----       2018-07-27     11:02              0 pre_100_post.sql
-a----       2018-07-27     11:02              0 pre_101_post.sql