PowerShell Сортировка по 2-му индексу

Пытаюсь отсортировать серверы по 2-му индексу имени. Имена серверов берутся из путей к файлам, где они являются базовым именем файла. Я знаю, что у Select-Object есть параметр -Index, но не думаю, что это сработает. Я предполагаю, что лучше всего использовать RegEx PowerShell, например "(?:^ Az))". Это возвращает несортированный список, и я все еще ищу в Google шаблон, который будет отсортирован по 2-му индексу.

Пример предполагаемого результата

  • Сгруппируйте серверы по имени CC или DD
Server        
------        
ABCCWS01
CDCCWS01
ABDDWS01
CDDDWS01

Текущий выход

  • Сортирует в алфавитном порядке по названию объекта
$servers = Get-Item -Path
C:\ABDDWS01.ServerData, 
C:\ABCCWS01.ServerData, 
C:\CDCCWS01.ServerData, 
C:\CDDDWS01.ServerData | Group BaseName -AsHashtable

foreach($computer in $servers.GetEnumerator() | Sort-Object -Property name)
{ ...DoSomething... }

Server        
------        
ABCCWS01
ABDDWS01
CDCCWS01
CDDDWS01

Затем я попытался реализовать PowerShell RegEx. Но я застрял в том, как правильно использовать это для сортировки по второму индексу. Этот пример не влияет и возвращает несортированный список. Я пробовал использовать разные шаблоны в конце "(?:^ Az))". Пока что мои попытки либо возвращают список без сортировки, либо просто его сегмент. Я искал в Google и пробовал много разных вещей. Если кто-то еще хочет помочь разобраться в этом, мы будем очень признательны.

Sort-Object -Property @{Expression={[RegEx]::Match($_.basename, "(?:^a-z))")}}

1 ответ

Решение

Sort-Objectработает, "ранжируя" каждый вход в соответствии с полученным значением, вычисляя одно или несколько выражений свойств для каждого элемента ввода - в вашем существующем примере на основе значения name свойство.

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

... |Sort-Object -Property {$_.name[1]}

Причина, по которой это не работает в вашем примере, заключается в том, что выражение [RegEx]::Match($_.basename, "(?:^a-z))") возвращает [System.Text.RegularExpressions.Match] объект - и их нельзя значимо сравнивать друг с другом.

Если вы измените выражение, чтобы преобразовать его в строку (например, совпадающее значение), оно будет работать:

... |Sort-Object -Property @{Expression={[RegEx]::Match($_.basename, "(?:^a-z))").Value}}
# or
... |Sort-Object -Property {[RegEx]::Match($_.basename, "(?:^a-z))").Value}
Другие вопросы по тегам