W tym wydaniu Geek School patrzymy na formatowanie, filtrowanie i porównywanie obiektów w potoku.
Przeczytaj poprzednie artykuły z serii:
I pozostańcie czujni przez resztę serii przez cały tydzień.
Kiedy po raz pierwszy zacząłem pracę z PowerShellem, pomyślałem, że wszystko jest magiczne, ale prawdą jest, że wystarczy trochę czasu, aby zrozumieć, co dzieje się pod maską. To samo dotyczy systemu formatowania PowerShell. W rzeczywistości, jeśli uruchomisz polecenie cmdlet Get-Service, wygenerowane dane wyjściowe pokażą tylko 3 właściwości: Status, Name i DisplayName.
Ale jeśli potrącisz Get-Service do Get-Member, zobaczysz, że obiekty kontrolera ServiceController mają o wiele więcej niż tylko te trzy właściwości, więc co się dzieje?
Odpowiedź leży w ukrytym pliku, który określa, w jaki sposób większość wbudowanych poleceń cmdlet wyświetla ich wyniki. Aby uzyskać zrozumienie, wpisz następujące polecenie w powłoce i naciśnij enter.
Notatnik C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ DotNetTypes.format.ps1xml
Jeśli użyjemy funkcji Znajdź w Notatniku, możemy szybko przejść do sekcji, która szczegółowo opisuje wynik polecenia cmdlet Get-Service, wyszukując typ ServiceController.
Nagle widać, że pod maską PowerShell formatuje dowolne obiekty w potoku, które są typu ServiceController i tworzy tabelę z trzema kolumnami: Status, Nazwa i DisplayName. Ale co jeśli typ, z którym masz do czynienia, nie ma wpisu w tym pliku lub jakiegokolwiek innego pliku formatu? To naprawdę proste. Jeśli obiekt wychodzący z potoku ma 5 lub więcej właściwości, PowerShell wyświetla wszystkie właściwości obiektu na liście; jeśli ma mniej niż 5 właściwości, wyświetla je w tabeli.
Jeśli nie jesteś zadowolony z domyślnego formatowania obiektu lub typu, możesz rozwinąć własne formatowanie. Istnieją trzy cmdlety, które musisz wiedzieć, aby to zrobić.
Format-szeroki po prostu pobiera kolekcję obiektów i wyświetla pojedynczą właściwość każdego obiektu. Domyślnie będzie szukać właściwości nazwy; jeśli twoje obiekty nie zawierają właściwości name, użyje pierwszej właściwości obiektu, gdy właściwości zostaną posortowane alfabetycznie.
Get-Service | Format-szeroki
Jak widać, domyślnie są to dwie kolumny, chociaż możesz określić zarówno właściwość, z której chcesz korzystać, jak i liczbę kolumn, które chcesz wyświetlić.
Get-Service | Format-szeroki - Właściwość DisplayName - kolumna 6
Jeśli coś jest domyślnie sformatowane jako tabela, zawsze można go przełączyć do widoku listy za pomocą polecenia cmdlet listy formatów. Rzućmy okiem na wynik polecenia cmdlet Get-Process.
Ten widok tabelaryczny bardzo dobrze pasuje do tego rodzaju informacji, ale udawajmy, że chcemy go zobaczyć w formie listy. Wszystko, co naprawdę musimy zrobić, to podłączyć do niego Formatuj listę.
Get-Process | Formatuj listę
Jak widać, domyślnie wyświetlane są tylko cztery pozycje na liście. Aby wyświetlić wszystkie właściwości obiektu, możesz użyć znaku wieloznacznego.
Get-Process | Lista formatów - właściwość *
Alternatywnie możesz wybrać tylko żądane właściwości.
Get-Process | Format-lista -Właściwość nazwa, id
Formatuj tabelę, z drugiej strony pobiera dane i przekształca je w tabelę. Ponieważ nasze dane z Get-Process mają już postać tabeli, możemy z niej skorzystać, aby łatwo wybrać właściwości, które chcemy wyświetlić w tabeli. Użyłem parametru AutoSize, aby wszystkie dane pasowały do jednego ekranu.
Get-Process | Nazwa tabeli formatu, id -AutoSize
Jedną z najlepszych rzeczy w korzystaniu z potoku opartego na obiektach jest możliwość filtrowania obiektów z potoku na dowolnym etapie za pomocą polecenia cmdlet Where-Object.
Get-Service | Where-Object $ _. Status -eq "Running"
Używanie, gdzie obiekt jest rzeczywiście bardzo prosty. $ _ reprezentuje bieżący obiekt potoku, z którego można wybrać właściwość, którą chcesz filtrować. Tutaj były tylko obiekty, w których właściwość Status równa się Running. Istnieje kilka operatorów porównania, których możesz użyć w bloku skryptu filtrującego:
Pełną listę i więcej informacji można przejrzeć w konceptualnym pliku pomocy about_comparison, jednak zajmuje trochę czasu przyzwyczajenie się do składni Where-Obeject. To wszystko na ten czas!