gpt4 book ai didi

powershell - Powershell中的自定义排序

转载 作者:行者123 更新时间:2023-12-03 08:09:35 25 4
gpt4 key购买 nike

我有以下格式的文件名:

[ignore-prefix]-[important-middle]-[ignore-suffix]-[name-with-digits]

我需要根据以下规则进行排序:首先按中间部分,然后按名称,按自然顺序(即 foobar10 > foobar2)。我不知道前缀值,但我知道分隔符(破折号)。

所以我的第一次尝试,自然是:
 filelist | Sort-Object -property @{Expression=`
{$_.FullName.SubString($_.FullName.IndexOf("-")+1)}}

这有一个问题,就是后缀影响顺序(ignore-aaa-1ignore-wname)排在ignore-aaa-2ignore-aname之前),所以:
 $filelist | Sort-Object -property @{Expression=`
{$_.FullName.SubString($_.FullName.IndexOf("-")+1,`
$_.FullName.SubString($_.FullName.IndexOf("-")+1).IndexOf("-"))}}

好的,按中间排序,但已经很笨拙了。如果我要添加自然排序,那就更糟了。有什么更优雅的方式来做到这一点?

最佳答案

我这样理解任务:排序应该由 3 个表达式执行:1)中间部分,2)没有数字的名称部分,3)由名称部分的尾随数字表示的数字。

让我们用正则表达式创建这些表达式。这是答案:

# gets the middle part
$part1 = { if ($_.Name -match '^[^-]+-([^-]+)') { $matches[1] } }

# gets the name part with no digits
$part2 = { if ($_.Name -match '^[^-]+-[^-]+-[^-]+-(\D+)') { $matches[1] } }

# gets the number represented by digits from name (cast to [int]!)
$part3 = { if ($_.Name -match '^[^-]+-[^-]+-[^-]+-\D+(\d+)') { [int]$matches[1] } }

# sort it by 3 expressions
$filelist | Sort-Object $part1, $part2, $part3

为了更好地理解它是如何工作的,您可以分别测试这些表达式:
$part1 = { if ($_.Name -match '^[^-]+-([^-]+)') { $matches[1] } }
$part2 = { if ($_.Name -match '^[^-]+-[^-]+-[^-]+-(\D+)') { $matches[1] } }
$part3 = { if ($_.Name -match '^[^-]+-[^-]+-[^-]+-\D+(\d+)') { [int]$matches[1] } }

Write-Host '----- test1'
$filelist | % $part1

Write-Host '----- test2'
$filelist | % $part2

Write-Host '----- test3'
$filelist | % $part3

结果,例如,这些文件(扩展名并不重要):
aaa-zzz-1ignore-wname10.txt
aaa-zzz-1ignore-wname2.txt
ignore-aaa-1ignore-wname10.txt
ignore-aaa-1ignore-wname2.txt

将排序为:
ignore-aaa-1ignore-wname2.txt
ignore-aaa-1ignore-wname10.txt
aaa-zzz-1ignore-wname2.txt
aaa-zzz-1ignore-wname10.txt

关于powershell - Powershell中的自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4146635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com