Główna » jak » Geek School Learning Formatowanie, filtrowanie i porównywanie w PowerShell

    Geek School Learning Formatowanie, filtrowanie i porównywanie w PowerShell

    W tym wydaniu Geek School patrzymy na formatowanie, filtrowanie i porównywanie obiektów w potoku.

    Zapoznaj się z poprzednimi artykułami z serii:

    • Dowiedz się, jak zautomatyzować system Windows za pomocą programu PowerShell
    • Nauka korzystania z poleceń cmdlet w PowerShell
    • Nauka korzystania z obiektów w PowerShell

    I pozostańcie czujni przez resztę serii przez cały tydzień.

    Domyślne formatowanie

    Kiedy zaczynałem od PowerShella, myślałem, że wszystko jest magiczne, ale prawdą jest, że zajmuje trochę czasu, aby zrozumieć, co dzieje się pod maską. To samo dotyczy systemu formatowania PowerShell. W rzeczywistości, jeśli uruchomisz cmdlet Get-Service, generowane wyjście pokazuje 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, jak większość wbudowanych cmdletów 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.

    Formatowanie danych

    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ć.

    • Formatuj listę
    • Formatuj tabelę
    • Format-szeroki

    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 przy użyciu 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ć, tylko cztery pozycje są domyślnie wyświetlane 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-List -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 dopasować wszystkie dane do jednego ekranu.

    Get-Process | Nazwa tabeli formatu, id -AutoSize

    Filtrowanie i porównywanie

    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 jest równa Running. Istnieje kilka operatorów porównania, których możesz użyć w bloku skryptu filtrującego:

    • eq (równy z)
    • neq (nie równe)
    • gt (większy niż)
    • ge (większy niż lub równy)
    • lt (mniej niż)
    • le (mniejszy lub równy)
    • like (Wildcard String Match)

    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!