
Przy pisaniu funkcji do pobierania informacji o modułach, potrzebowałem listy z unikalnymi nazwami modułów. Intuicyjnie wykorzystałem w tym celu polecenie Select-Object z parametrem -Unique.
Get-Module -ListAvailable | Select-Object -Unique Name
Jednak lista nie była unikalna w taki sposób jak oczekiwałem. Pojawiły się duplikaty wynikające z innego zapisu nazwy tego samych modułów.
Get-Module -ListAvailable -Name PSReadLine | Select-Object -Unique Name

Na usprawiedliwienie mam tylko, że nie spodziewałem się, że mogą wystąpić różnice w nazwach (jeszcze nie wiem skąd to się bierze). Po drugie wcześniej nie zastanawiałem się jak działa parametr -Unique dla…
Select-Object
Polecenie Select-Object z parametrem -Unique, wybiera identyczne wartości i pozostawia jeden element podzbioru. Co najważniejsze -Unique rozróżnia wielkość znaków czyli jest case-sensitive.
"A", "a", "a", "B", "b" | Select-Object -Unique # A # a # B # b Get-Module -ListAvailable -Name PSReadLine | Select-Object -Unique Name # Name # ---- # PSReadLine # PSReadline
W takim razie jakie przygotować listę unikalnych elementów bez znaczenia na wielkość znaków w PowerShell?
Sort-Object
Rozwiązać ten “problem” można za pomocą Sort-Object. Polecenie posiada parametr -Uniqu i domyślnie jest case-insensitive (nie rozróznia wielkości znaków).
"A", "a", "a", "B", "b" | Sort-Object -Unique # A # B Get-Module -ListAvailable -Name PSReadLine | Select-Object Name | Sort-Object -Unique # Name # ---- # PSReadLine
Dopiero użycie przełacznika-CaseSensitive sprawia, że dla Sort-Object wielkość znaków ma znaczenie.
Group-Object
Drugi sposób to wykorzystanie polecenie Group-Object do pogrupowania obiektów po wartościach wskazanej właściwości. Podczas grupowania wielkość znaków nie ma znaczenia, chyba, że dodamy przełącznik -CaseSensitive.
"A", "a", "a", "B", "b" | Group-Object | Select-Object Name # Name # ---- # A # B Get-Module -ListAvailable -Name PSReadLine | Group-Object -Property Name | Select Name # Name # ---- # PSReadLine
Podsumowanie
Jeśli potrzebujesz unikalnej listy elementów bez znaczenia na wielkość liter to wykorzystaj Sort-Object z parametrem -Unique lub Group-Object. W porównaniu do Select-Object -Unique oraz Get-Unique te dwa domyślnie są case-insensitive.
No comments yet.