19Aug

Geek School: Nauka formatowania, filtrowania i porównywania w PowerShell

W tym wydaniu Geek School przyjrzymy się formatowaniu, filtrowaniu i porównywaniu 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ń Cmdlets w programie PowerShell
  • Nauka korzystania z obiektów w programie PowerShell

Pozostań zestrojony przez resztę serii przez cały tydzień.

Domyślne formatowanie

Kiedy zaczynałem od PowerShella, myślałem, że wszystko jest magiczne, ale prawda jest taka, że ​​zajmuje 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ź znajduje się 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żywamy funkcji Znajdź notatnika, możemy szybko przejść do sekcji, która szczegółowo opisuje wynik polecenia cmdlet Get-Service, wyszukując ServiceControllerrodzaj.

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
  • Formatuj

w całym formacie

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

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 powiedzmy, że chcemy go wyświetlić w formie listy. Wszystko, co naprawdę musimy zrobić, to podłączyć do

w formacie .

Pobierz procesFormatuj 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.

Pobierz procesFormat-List -Property *

Alternatywnie możesz wybrać tylko żądane właściwości.

Pobierz procesFormat-List -Property name, id

Format-Table, 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.

Pobierz procesNazwa tabeli formatowania, id -AutoSize

Filtrowanie i porównywanie

Jedną z najlepszych rzeczy w używaniu 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żna użyć w bloku skryptu filtrującego:

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

Pełna lista i więcej informacji można przeglądać w konceptualnym pliku pomocy about_comparison, jednak zajmuje trochę czasu przyzwyczajenie się do składni Where-Obeject. To wszystko na ten czas!