PowerShell似乎没有按名称升序对对象进行排序:
dir | Sort-Object Name
当然,我的目标是按以下顺序对元素进行排序:
1.sql
2.sql
3.sql
4.sql
5.sql
6.sql
...
...
...
您认为有什么出路吗?
答案 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