Powershell сортирует массив строк по определенному символу - PullRequest
0 голосов
/ 25 октября 2018

Я работаю со скриптом powershell, который автоматизирует некоторые длительные задачи развертывания.

Я использую

$scripts = Get-ChildItem -r -Path server-deploy | select -expand fullname

, чтобы получить массив, который выглядит следующим образом

D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-10.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-20.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-30.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-40.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-50.ps1

Я оставил некоторые «дыры» там, чтобы добавить дополнительные скриптыесли требования меняются на меня.Сценарии всегда будут называться «install-someword-int.ps1», а порядок определяется int.

Я знаю, что Get-ChildItem отсортировал их в правильном порядке, но я бы хотел бытьв состоянии создать функцию, которая всегда может их упорядочить, поэтому, если мне нужно добавить скрипт, например, install-builder-15.ps1, я знаю, что он будет работать после 10 и до 20. Будучи хорошим хранителем, я не по своей сутидоверьтесь Get-ChildItem, чтобы ВСЕГДА возвращать их в правильном порядке.

Я ищу правильный способ сортировки $ сценариев или использую некоторый цикл for для итерации массива, но всегда в правильномorder.

EDIT: @boxdog Использование файлов:

install-builder-10.ps1                                                                                                                 
install-builder-20.ps1                                                                                                                 
install-builder-30.ps1                                                                                                                 
install-builder-4.ps1                                                                                                                  
install-builder-5.ps1 

, если я запускаю Sort-Object @{e={$_ -match ".*install-.*-(?<number>\d+).ps1"; $matches.number}}, я вижу, что они в том же порядке.Я бы ожидал

install-builder-4.ps1                                                                                                                  
install-builder-5.ps1 
install-builder-10.ps1                                                                                                                 
install-builder-20.ps1                                                                                                                 
install-builder-30.ps1     

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

вот еще один вариант идеи «сортировка по вычисленному значению».это преобразует конечные цифры в [int] перед их сортировкой.[ ухмылка ]

$FakeFileList = @(
    [System.IO.FileInfo]'install-builder-10.ps1'
    [System.IO.FileInfo]'install-builder-20.ps1'
    [System.IO.FileInfo]'install-builder-30.ps1'
    [System.IO.FileInfo]'install-builder-4.ps1'
    [System.IO.FileInfo]'install-builder-5.ps1'
    )

$FakeFileList |
    Sort-Object {[int]$_.BaseName.Split('-')[-1]}

вывод ...

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
darhsl       1600-12-31   6:00 PM                install-builder-4.ps1
darhsl       1600-12-31   6:00 PM                install-builder-5.ps1
darhsl       1600-12-31   6:00 PM                install-builder-10.ps1
darhsl       1600-12-31   6:00 PM                install-builder-20.ps1
darhsl       1600-12-31   6:00 PM                install-builder-30.ps1
0 голосов
/ 25 октября 2018

Если все, что вас интересует, это сортировка по int в конце строки, то вы можете отсортировать их с помощью Sort-Object следующим образом:

$paths = "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-30.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-sortofbuilder-20.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-10.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-20.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-50.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-notbuilder-10.ps1",
         "D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-15.ps1"

$paths | Sort-Object @{e={$_ -match ".*install-.*-(?<number>\d+).ps1" | Out-Null; [int]$matches.number}}

, что дает следующий вывод:

D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-10.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-notbuilder-10.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-15.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-sortofbuilder-20.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-20.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-30.ps1
D:\BitBucket\CI\serverdeploy\builder\server-deploy\install-builder-50.ps1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...