Ответ 1
Я понимаю задачу следующим образом: сортировка должна выполняться тремя выражениями: 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