Как отсортировать правильные десятичные числа


1

У меня есть папка, которая содержит подпапки для каждой версии приложения (десятичное число). Теперь у меня есть powershell скрипт для сравнения версий. Проблема в том, что я не могу отсортировать, как ожидалось. Как я могу решить это в одной строке кода, потому что я делаю это из пакетного скрипта.

С помощью Get-ChildItem чтобы увидеть содержимое папки

Текущая сортировка (выполняется из batch сценарий:

powershell -Command "& {Get-ChildItem "\folder_dir\" -Name | sort-object -descending }

Варианты решения:

  1. Сортировать Get-ChildItem по дате и как-то печатать только названия папок (без заголовка «Имя» вроде как при обычном выводе)
  2. Сортировать Get-ChildItem по имени и как-то его отсортировать (проблема с десятичными числами)

Например (нисходящий или восходящий, не имеет значения. Порядок имеет значение):

Folder content:
1.0
1.111
1.11
2.2
1.18
2.5
2.44

Current output:
2.5 <-- wrong place
2.44
2.2
1.18 <-- wrong place
1.111
1.11
1.0

Expected sort:
1.0
1.11
1.18
1.111
2.2
2.5
2.44

Ближайший ответ был в ссылка на сайт , Но у меня нет букв, только цифры
igor

2
То, что вы ищете, это естественная сортировка. это или же этот может быть полезным Что касается вашего примера, почему вы не сможете его адаптировать? Просто вы бы разбили, используя точку, и отсортировали каждую группу?
Seth

Свернуто, но это соответствует вашему образцу: Get-ChildItem "\folder_dir\" -Name | sort $("{0}.{1}" -f ($_ -replace '^(.*?)\.\d+$', '$1'), ($_ -replace '^.*?\.(\d+)$', '$1').PadLeft(10, "0"))
Lieven Keersmaekers

Пример натальной сортировки @Seth работает.
root

Решение @Seth сработало. Заключительная команда: powershell -Command "& {Get-ChildItem "\\nas\shared\Public\Igor\gscript\version" -Name | sort-object { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) }}
igor

Ответы:


1

Кредит @Seth решение

От ссылка на сайт

Заключительная команда: powershell -Command "& {Get-ChildItem "\\nas\shared\Public\Igor\gscript\version" -Name | sort-object { [regex]::Replace($_, '\d+', { $args[0].Value.PadLeft(20) }) }}


0

Ваш скрипт работает отлично.

Вы сортируете в порядке убывания, и это именно то, что он делает.

Обратите внимание, что число слева от. также идет от высокой к низкой.

Таким образом, ваш сценарий должен быть следующим:

powershell -Command "& {Get-ChildItem "\\nas\shared\Public\Igor\gscript\version" 
   -Name | sort-object }

Sort-Object сортирует по возрастанию по умолчанию, если не используется -descending.


(1) В ps нет «восходящего» объекта сортировки (2) Мой скрипт не работает должным образом, посмотрите описание
igor

@ Игорь мой плохой. По умолчанию это происходит по возрастанию, если вы не установили -cecending. Отредактировал мой ответ, чтобы отразить.
LPChip
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.