Skip to main content
 首页 » 编程设计

powershell之如何像 Windows 资源管理器一样按文件名排序

2024年06月03日49jyk

这是应用到 powershell 时著名的“ASCIIbetical”顺序与“Natural”顺序的问题。为了能够像explorer一样在powershell中排序,您可以使用 this wrapper通过 StrCmpLogicalW API,它实际上为 Windows 资源管理器执行自然排序。但这需要一些管道。

但是,this article表明 python 中有该排序的三行实现。人们希望 Get-ChildItem cmdlet 或至少文件系统提供程序可以具有内置的自然排序选项。不幸的是,他们没有。

问题来了,在 Powershell 中最简单的实现是什么?简单地说,我的意思是要编写的代码量最少,并且可能不需要第三方/外部脚本/组件。理想情况下,我想要一个简短 Powershell 函数来为我进行排序。

请您参考如下方法:

TL;博士

Get-ChildItem | Sort-Object { [regex]::Replace($_.Name, '\d+', { $args[0].Value.PadLeft(20) }) } 

这里有一些非常短的代码(只是 $ToNatural 脚本 block ),它使用正则表达式和匹配评估器来完成这个技巧,以便用空格填充数字。然后我们像往常一样用填充数字对输入进行排序,并最终得到自然顺序。

$ToNatural = { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) } 
 
'----- test 1 ASCIIbetical order' 
Get-Content list.txt | Sort-Object 
 
'----- test 2 input with padded numbers' 
Get-Content list.txt | %{ . $ToNatural } 
 
'----- test 3 Natural order: sorted with padded numbers' 
Get-Content list.txt | Sort-Object $ToNatural 

输出:

----- test 1 ASCIIbetical order 
1.txt 
10.txt 
3.txt 
a10b1.txt 
a1b1.txt 
a2b1.txt 
a2b11.txt 
a2b2.txt 
b1.txt 
b10.txt 
b2.txt 
----- test 2 input with padded numbers 
                   1.txt 
                  10.txt 
                   3.txt 
a                  10b                   1.txt 
a                   1b                   1.txt 
a                   2b                   1.txt 
a                   2b                  11.txt 
a                   2b                   2.txt 
b                   1.txt 
b                  10.txt 
b                   2.txt 
----- test 3 Natural order: sorted with padded numbers 
1.txt 
3.txt 
10.txt 
a1b1.txt 
a2b1.txt 
a2b2.txt 
a2b11.txt 
a10b1.txt 
b1.txt 
b2.txt 
b10.txt 

最后,我们使用这个单行代码按名称按自然顺序对文件进行排序:

Get-ChildItem | Sort-Object { [regex]::Replace($_.Name, '\d+', { $args[0].Value.PadLeft(20) }) } 

输出:

    Directory: C:\TEMP\_110325_063356 
 
Mode                LastWriteTime     Length Name                                                                                                                   
----                -------------     ------ ----                                                                                                                   
-a---        2011-03-25     06:34          8 1.txt                                                                                                                  
-a---        2011-03-25     06:34          8 3.txt                                                                                                                  
-a---        2011-03-25     06:34          8 10.txt                                                                                                                 
-a---        2011-03-25     06:34          8 a1b1.txt                                                                                                               
-a---        2011-03-25     06:34          8 a2b1.txt                                                                                                               
-a---        2011-03-25     06:34          8 a2b2.txt                                                                                                               
-a---        2011-03-25     06:34          8 a2b11.txt                                                                                                              
-a---        2011-03-25     06:34          8 a10b1.txt                                                                                                              
-a---        2011-03-25     06:34          8 b1.txt                                                                                                                 
-a---        2011-03-25     06:34          8 b2.txt                                                                                                                 
-a---        2011-03-25     06:34          8 b10.txt                                                                                                                
-a---        2011-03-25     04:54         99 list.txt                                                                                                               
-a---        2011-03-25     06:05        346 sort-natural.ps1                                                                                                       
-a---        2011-03-25     06:35         96 test.ps1