Позвольте мне скопировать и вставить свой ответ из другого вопроса.
Имя объекта сортировки Powershell с номерами неправильно
Проводник Windows использует устаревшую версиюAPI в shlwapi.dll с именем StrCmpLogicalW при сортировке строк, поэтому мы видим разные результаты сортировки.
Я не хочу использовать метод заполнения нулями, поэтому напишите скрипт.
https://github.com/LarrysGIT/Powershell-Natural-sort
Так как я не эксперт по C #, поэтому запросы на получение запросов приветствуются.
Найдите следующий скрипт powershell, использующий тот же API.
function Sort-Naturally
{
PARAM(
[string[]]$strArray
)
Add-Type -TypeDefinition @'
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace NaturalSort {
public static class NaturalSort
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
public static extern int StrCmpLogicalW(string psz1, string psz2);
public static System.Collections.ArrayList Sort(System.Collections.ArrayList foo)
{
foo.Sort(new NaturalStringComparer());
return foo;
}
}
public class NaturalStringComparer : IComparer
{
public int Compare(object x, object y)
{
return NaturalSort.StrCmpLogicalW(x.ToString(), y.ToString());
}
}
}
'@
return [NaturalSort.NaturalSort]::Sort($strArray)
}
Поиск результатов тестаниже.
PS> # Natural sort
PS> . .\NaturalSort.ps1
PS> Sort-Naturally -strArray @('2', '1', '11')
1
2
11
PS> # If regular sort is used
PS> @('2', '1', '11') | Sort-Object
1
11
2
А,
PS> # Not good
PS> $t = (ls .\Scripts*.txt).name
PS> $t | Sort-Object
Scripts1.txt
Scripts10.txt
Scripts2.txt
PS> # Good
PS> Sort-Naturally -strArray $t
Scripts1.txt
Scripts2.txt
Scripts10.txt