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}