Używanie formatowania i filtrowania

Ukończone

Podczas pracy z programem PowerShell filtrowanie i formatowanie są ważnymi pojęciami, które należy zrozumieć z kilku powodów. Najpierw chcesz utworzyć potok, który generuje żądany wynik. Po drugie, chcesz to zrobić wydajnie. Zarówno pod względem sposobu ściągania danych przez sieć, jak i zapewniania, że wynik jest czymś, z czym możesz pracować.

Filtrowanie po lewej stronie

W instrukcji potoku filtrowanie po lewej stronie oznacza filtrowanie dla żądanych wyników tak szybko, jak to możliwe. Termin pozostawiony jest już wcześniej, ponieważ instrukcje programu PowerShell są uruchamiane od lewej do prawej. Chodzi o to, aby instrukcja działała szybko i wydajnie, zapewniając, że zestaw danych, na którym pracujesz, jest możliwie najmniejszy. Ta zasada naprawdę wchodzi w grę, gdy polecenia działają w większych magazynach danych lub przywracasz wyniki w całej sieci.

Rozważmy następującą instrukcję:

Get-Process | Select-Object Name | Where-Object Name -eq 'name-of-process'

Ta instrukcja najpierw pobiera wszystkie procesy na maszynie. Kończy się formatowanie odpowiedzi, tak aby tylko właściwość była wyświetlana Name . Ta instrukcja nie jest zgodna z zasadą filtrowania po lewej stronie , ponieważ działa we wszystkich procesach, próbuje sformatować odpowiedź, a następnie filtruje na końcu.

Lepiej najpierw filtrować, a następnie formatować, jak w poniższej instrukcji.

Get-Process | Where-Object Name -eq 'name-of-process' | Select-Object Name

Często polecenie cmdlet, które oferuje filtrowanie, jest bardziej wydajne niż użycie polecenia Where-Object. Oto bardziej wydajna wersja poprzedniej instrukcji:

Get-Process -Name 'name-of-process' | Select-Object Name

W tej wersji parametr -Name wykonuje filtrowanie.

Formatowanie w prawo, formatowanie jako ostatnia rzecz, którą wykonujesz

Filtrowanie po lewej stronie oznacza filtrowanie czegoś tak wcześnie , jak to możliwe w instrukcji, formatowanie prawej oznacza sformatowanie czegoś tak późno , jak to możliwe w instrukcji. Ok, ale dlaczego muszę sformatować późno? Odpowiedzią jest to, że polecenia formatu zmieniają strukturę obiektu, w który znajdują się wyniki, tak aby dane nie zostały już znalezione we tych samych właściwościach. Ta zmiana ma wpływ na możliwość pobierania żądanych informacji przy użyciu poleceń potoku, Select-Objectlub poprzez pętlę w wynikach za foreachpomocą polecenia .

Formatowanie niszczy obiekt, z którym masz do czynienia. Weź na przykład następujące wywołanie:

Get-Process 'some process' | Select-Object Name, CPU | Get-Member

Zwracany typ to System.Diagnostics.Process. Teraz dodaj Format-Table formater w następujący sposób:

Get-Process 'some process' | Format-Table Name,CPU | Get-Member

Skupienie się tylko na typach, które otrzymujesz, zwróć uwagę, że wracasz do czegoś innego:

TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupEndData

Te typy nie są ważne w tej lekcji. Ważne jest, aby pamiętać, że w przypadku korzystania z dowolnego typu polecenia formatowania dane są inne. A gdy jest inaczej, może już nie zawierać kolumn, o których dbasz. Zilustrujmy przykład:

Get-Process 'some process' | Select-Object Name, Cpu

Powyższe polecenie daje wynik z kolumnami Name i CPU.

Name       CPU
----       ---
zsh  1.2984395
zsh  0.2522047
zsh  0.2486375
zsh  0.2683466
zsh  0.2681874
zsh  1.6799438
zsh  0.2909816
zsh  0.7855272

Najpierw użyjmy formatowania, a następnie Select-Object, aby zilustrować, co może się zdarzyć, jeśli nie formatujesz ostatnio:

Get-Process 'some process' | Format-Table Name,CPU | Select-Object Name, CPU

Wynik wygląda teraz następująco:

Name CPU
---- ---

Jest on pusty, ponieważ Format-Table przekształcił obiekt zawierający wyniki, umieszczając dane w innych właściwościach. Twoje dane nie znikną, tylko twoje właściwości. Poprzednie polecenie programu PowerShell podejmuje próbę znalezienia właściwości, ale nie jest w stanie.

Polecenia formatowania powinny być ostatnią rzeczą używaną w instrukcji, ponieważ są one przeznaczone do formatowania elementów ładnie do prezentacji ekranu. Nie są one przeznaczone do użycia jako sposób filtrowania ani sortowania danych.

Polecenia formatowania

Najczęściej używane polecenia cmdlet do formatowania danych wyjściowych to Format-Table i Format-List. Domyślnie większość poleceń cmdlet formatuje dane wyjściowe jako tabelę. Jeśli dane wyjściowe nie mają wyświetlać właściwości w kolumnach, użyj Format-List polecenia cmdlet , aby sformatować je jako listę.