Case-insensitive i Select -Unique, jak?

By PowerShell

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.

22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

No comments yet.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

× Close