Centrum skryptów - Systemy operacyjne     Jak wprowadzać formatowanie przy użyciu Windows PowerShell? (część 2)

Jak wprowadzać formatowanie przy użyciu Windows PowerShell? (część 1)

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.

Jak wprowadzać formatowanie przy użyciu Windows PowerShell? (część 1)

(Uwaga: dzisiejszy artykuł został napisany przez skrypciarza-gościa - Thomasa Lee. Thomas jest moderatorem na oficjalnym forum skrypciarzy (j.ang.), a oto jego oficjalną biografia skrypciarska: Piszę skrypty praktycznie od zawsze. Byłem mistrzem JCL na komputerach IBM 360 pod koniec lat sześćdziesiątych, pisałem setki skryptów do obsługi ICL VME w latach siedemdziesiątych. Skrypty wsadowe poznawałem na systemie DOS 2.0. Nigdy tak naprawdę nie zgrokowałem VBS (ani nie złapałem bakcyla *ix). Ale szczerze zakochałem się w Monadzie, gdy tylko zobaczyłem go we wrześniu 2003 r. Jestem biegły w Windows PowerShell 1.0 i 2.0. Specjalizuję się w .NET i WMI. Z tego co wiem, jestem pierwszą osobą piszącą blog o Monadzie. Zapraszam na blogi Under the Stairs (j.ang.) i PowerShell Scripts (j.ang.).

----------

Jednym z wielu wyzwań stojących przed specjalistami IT zajmującymi się zarządzaniem systemami jest uzyskanie informacji z systemu komputerowego. Niekiedy zależy nam tylko na liczbie — np. liczbie wiadomości e-mail w kolejce lub ilości pamięci zużywanej przez określony serwer. Jeśli dane są proste, można zupełnie pominąć ich estetykę.

Zdarza się jednak, że zależy nam na sformatowaniu danych wychodzących w taki sposób, aby były jak najbardziej czytelne na ekranie lub na wydruku. Chcemy np., aby wartości pieniężne były przedstawiane jako wartości pieniężne, a nie ułamki dziesiętne. Możemy też chcieć wyrazić jakąś wartość w formie procentowej. W takich wypadkach formatowanie ma znaczenie.

Do zalet Windows PowerShell należy możliwość przedstawiania prostych danych w prosty sposób. Ale jeśli zależy nam na formie przedstawianych danych, również nie jest to problemem. Kiedy potrzeba prostoty — mamy prostotę. Kiedy potrzeba wyrafinowania — mamy wyrafinowanie. Część funkcjonalności formatowania pochodzi z języka Windows PowerShell, a część jest wbudowana w platformie Microsoft .NET.

W niniejszym artykule omówię najpierw podstawy uzyskiwania informacji wychodzących i formatowanie domyślne w Windows PowerShell, a następnie zajmę się apletami poleceń Format-* (a także kilkoma innymi kwestiami). Następnie zademonstruję, jak zastosować funkcje platformy .NET umożliwiające obsługę ciągów, a na zakończenie wprowadzę używanie tabel mieszania w celu poprawy estetyki danych wychodzących. Zachęcam, aby czytając ten artykuł otworzyć okno Windows PowerShell i pisać skrypt wraz ze mną.

Domyślne formatowanie

Większość apletów poleceń tworzy różnego rodzaju obiekty. Wpisz w konsoli Windows PowerShell np.:

LS

Jak widać poniżej, powoduje to utworzenie listy zawartości bieżącego katalogu. Co prawda tego nie widać, ale w rzeczywistości aplet polecenia powoduje utworzenie zestawu obiektów formatowanych przez Windows PowerShell, dzięki czemu można uzyskać dane wyjściowe bez złożonego programowania, tak uwielbianego przez użytkowników języka VBScript.

Polecenie LS jest w istocie aliasem apletu polecenia Get-ChildItem, ale jego użycie wobec dostawcy magazynu plików powoduje wygenerowanie typów obiektów, które Windows PowerShell formatuje jako czytelną tabelę. Jak to się zatem dzieje, że dane wychodzące przyjmują postać listy, którą tak lubimy?

Odpowiedź jest prosta: domyślnie Windows PowerShell przeprowadza formatowanie wszystkich obiektów pozostałych w potoku (lub wyniku działania pojedynczego apletu polecenia). Mechanizm działania jest nieco mniej prosty, ale jego podstawa nie jest szczególnie złożona.

Aplety poleceń zazwyczaj pozostawiają coś w potoku. Można to zaobserwować, uruchamiając jakiś losowy aplet polecenia Windows PowerShell lub skrypt, a następnie przekazując go potokiem do apletu polecenia Get-Member. Poniżej widać utworzone typy obiektów.

Kiedy Windows PowerShell trafi na „pozostawione” obiekty, przekazuje je do apletu polecenia Out-Host. Aplet polecenia Out-Host z kolei wykonuje jedno z dwojga działań: prawie zawsze wywołuje aplet polecenia Format-Table lub Format-List, aby utworzyć dane wyjściowe. Można to zaobserwować, wpisując:

ls | Format-Table

Spowoduje to uzyskanie takich samych danych wyjściowych, jak poprzednio (bez potrzeby przekazywania ich potokiem do apletu polecenia Format-Table). To, czy Windows PowerShell wywoła aplet polecenia Format-Table, czy też Format-List, zależy od tego, ile właściwości ma zostać wyświetlonych. Domyślnie, jeśli liczba właściwości zawartych w obiekcie wynosi co najmniej pięć, Windows PowerShell wywołuje aplet polecenia Format-List. W przeciwnym razie wywołuje aplet polecenia Format-Table. To, jakie właściwości danego typu obiektu zostaną wyświetlone, jest określone w zestawie plików PS1XML. Są to pliki XML instalowane domyślnie, ale rzecz jasna można je bez trudu zastąpić lub rozszerzyć w zależności od potrzeb. Więcej informacji o tych plikach można uzyskać w Windows PowerShell (Get-Help about_Format.ps1xml). Same pliki znajdują się w katalogu C:\Windows\System32\WindowsPowerShell.

Istnieje kilka wyjątków od opisanego sposobu działania. Aplety poleceń Format-* generują takie dane wyjściowe, w których przypadku jedynie aplet polecenia Out-Default może bezpośrednio utworzyć dane wyjściowe. Aplety poleceń Format-Table i Format-List generują zestaw obiektów Microsoft.PowerShell.Comands.Internal.Format.* (tak jak widać to poniżej), a aplet polecenia Out-Default jest na tyle sprytny, by samodzielnie wywoływać aplet polecenia powodujący formatowanie, a kiedy przesyłać dane wyjściowe bezpośrednio do konsoli.

Oznacza to, że umieszczenie któregoś z apletów polecenia Format-* na końcu potoku pozwala zastąpić domyślne działanie, określone w plikach PS1XML. Można też zastosować inne metody uzyskiwania danych wyjściowych. Aplet polecenia Out-GridView pobiera obiekty pozostawione w potoku i formatuje je w postaci okna, tak jak to widać poniżej.

Ten sposób formatowania umożliwia domyślnie drukowanie i zapewnia pełną kontrolę nad danymi wyjściowymi Windows PowerShell. Można określić właściwości, które mają zostać wyświetlone, a także — jak się wkrótce przekonamy — wiele innych cech.

Format-List i Format-Table

Dwa najważniejsze aplety poleceń używane do wyświetlania danych wyjściowych na ekranie to Format-List i Format-Table. Są to polecenia o bardzo podobnej strukturze. Aplet polecenia Format-Table powoduje utworzenie tabeli z zestawem kolumn, z których każda ma nagłówek. Domyślnie szerokość każdej kolumny zależy od długości danych wyjściowych (nazwa pliku, liczba itp.). Czasami prowadzi to do powstania bardzo szerokich kolumn. Można użyć parametru -AutoSize, aby uzyskać odpowiednią szerokość kolumn. Widać to poniżej.

Dane wyjściowe generowane przez polecenia Format-List i Format-Table określane są na podstawie właściwości obiektów w potoku. Jak widać na poprzedniej grafice, właśnie użyłem właściwości FullName i BaseName (nazwa z pominięciem folderu i typu pliku) wybranych plików.

Dostępne właściwości określonych typów plików oraz ich znaczenie można sprawdzić w bibliotece MSDN. Wystarczy wyszukać pełną nazwę obiektu, a pierwszy będzie najprawdopodobniej właściwy. Klasa System.IO.Fileinfo jest zdefiniowana na stronie https://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx (j.ang.). Biblioteka MSDN jest przeznaczona przede wszystkim dla programistów, ale doświadczeni specjaliści IT również nie powinni mieć problemu ze znalezieniem odpowiednich informacji. Dodatkowo zacząłem stopniowo publikować przykładowe skrypty Windows PowerShell, ilustrujące korzystanie z klasy. U dołu strony poświęconej System.IO.FileInfo znajduje się krótki skrypt Windows PowerShell ilustrujący zastosowanie tego typu obiektu.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne     Jak wprowadzać formatowanie przy użyciu Windows PowerShell? (część 2)