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

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

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ęść 2)

(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.).Dzisiaj prezentujemy część 2. Część 1 została opublikowana wczoraj. Dzięki raz jeszcze, Thomas!)

----------

Formatowanie ciągów znaków przy użyciu platformy .NET

Kolejny sposób formatowania danych wyjściowych polega na utworzeniu sformatowanego ciągu znaków przy użyciu wbudowanej funkcjonalności formatowania platformy .NET, a następnie zastosowaniu apletu polecenia Out-Host lub zbliżonego w celu wyświetlenia przez Windows PowerShell tego ciągu w konsoli. Programiści w języku C# są do tego przyzwyczajeni, ponieważ platforma .NET udostępnia wiele rozbudowanych funkcji programowania. Nazywa się to formatowaniem zbiorczym. Polega ono na pobraniu listy obiektów oraz ciągu znaków formatowania zbiorczego i utworzeniu sformatowanych danych wyjściowych. Ciąg znaków formatowania zbiorczego składa się ze stałego tekstu i symboli zastępczych, nazywanych elementami formatowania. Odpowiadają one obiektom na liście.

Aby zaobserwować to w działaniu, zacznijmy od bardzo prostej kwerendy: ile plików znajduje się w danym folderze? Można to zrobić w zupełnie łatwy sposób:

(LS C:\FOO).count

Można też przypisać temu obliczeniu zmienną, a następnie przedstawić ją jako dane wyjściowe:

$Ccount = (LS C:\FOO).count

$Ccount

Na moim komputerze obie te metody powodują podanie liczby 67. Gdyby zależało mi tylko na niej, mógłbym już zakończyć, ponieważ formatowanie domyślne w zupełności wystarcza. Gdyby jednak dane wyjściowe były bardziej złożone, korzystnie byłoby sformatować je w postaci ciągu znaków. Do tego właśnie można zastosować formatowanie zbiorcze.

W Windows PowerShell można użyć operatora -F (lub, jak kto woli, -f), aby wywołać funkcję formatowania zbiorczego w tym programie. Operator -F to w istocie wywołanie metody Format() obiektu ciągu znaków, która odpowiada za właściwe formatowanie. Podawany jest ciąg znaków formatowania zbiorczego zawierający wstępnie zdefiniowany tekst oraz co najmniej jeden symbol zastępczy, a platforma .NET formatuje wartości określone dla symboli zastępczych.

Zilustrujmy to poniższym przykładem:

$Ccount = (LS C:\FOO\*.ps1).count

"Liczba plików w katalogu C:\Foo to {0}" -f $ccount

Windows PowerShell pobiera wartość znajdującą się z prawej strony operatora -F (może to być dowolna liczba zmiennych lib wartości) i umieszcza ją w ciągu znaków formatowania zbiorczego. Element formatowania jest wartością liczbową znajdującą się pomiędzy znakami {} w ciągu znaków formatowania zbiorczego. Symbole zastępcze wskazują, gdzie platforma .NET ma umieścić poszczególne wartości. Pierwsza wartość (w naszym wypadku $ccount) jest formatowana w miejscu symbolu zastępczego {0}. Jeśli do sformatowania jest większa liczba wartości, druga z nich zostanie sformatowana w miejscu symbolu zastępczego {1} i tak dalej. Symbole zastępcze można umieścić w dowolnym miejscu ciągu znaków:

$Ccount = (LS C:\FOO\*.ps1).count

$Today = Get-Date

"W dniu {1} liczba plików w katalogu C:\Foo to {0}" -f $ccount,$today

Można też użyć symbolu zastępczego, by poinstruować Windows PowerShell, jak dużo miejsca potrzeba na umieszczenie wartości oraz czy wartość powinna być wyrównana do lewej, czy do prawej. Aby zobaczyć to w działaniu, wystarczy spojrzeć na poprzednią ilustrację, na której widać kilka innych sposobów sformatowania informacji o liczbie plików. Używając operatora -F, można tworzyć sformatowane ciągi znaków i używać ich jako danych wyjściowych w konsoli. Załóżmy, że chcemy wysłać do kogoś informację o liczbie wiadomości e-mail w skrzynce pocztowej. Można użyć apletów poleceń Exchange EMS w celu uzyskania informacji o liczbie wiadomości e-mail, a następnie użyć operatora -F, aby utworzyć poprawnie sformatowany ciąg znaków, nadający się do wysłania w wiadomości e-mail.

Operator -F zapewnia znaczną elastyczność formatowania, więc używam go bardzo często. Jednak platforma .NET udostępnia jeszcze inne sposoby formatowania ciągów znaków. Aby uzyskać więcej informacji o formatowaniu liczb przy użyciu operatora -F, warto zapoznać się z tą poradą dotyczącą Windows PowerShell (j.ang.). Natomiast tutaj (j.ang.) można znaleźć poradę dotyczącą formatowania daty i godziny w Windows Powershell. Informacje o funkcji formatowania zbiorczego można znaleźć w tym artykule (j.ang.).

Używanie metody .ToString() Method

W platformie .NET wszystkie obiekty dysponują metodą .ToString(), przekształcającą wystąpienie obiektu, np. określony plik, w ciąg znaków. Wprawdzie metoda ta jest dostępna dla wszystkich obiektów, jest ona szczególnie istotna w przypadku obiektów podstawowych, takich jak liczby całkowite, liczby rzeczywiste i ciągi znaków. Można to zaobserwować, wpisując:

$i=1

$i.tostring()

Rzecz jasna nie będzie to miało szczególnie ciekawego efektu. Koniec końców Windows PowerShell i tak używa metody .ToString() do podawania typów obiektów w postaci danych wyjściowych. Rzeczywiste zastosowania metody .ToString() wymagają przekazania do niej parametrów. W ten sposób można jeszcze dokładniej określić, jak platforma .NET ma sformatować wartość.

Jest to szczególnie przydatne, jeśli po wyliczeniu wartości chcemy sformatować ją jako walutę lub wartość procentową, lub jeśli chcemy sformatować duże liczby, wstawiając spacje, albo określając liczbę miejsc po przecinku. Rzecz jasna można w ten sposób dostosować walutę i sposób formatowania dużych liczb i wartości dziesiętnych do odpowiedniego języka.

Bardziej szczegółowe omówienie formatowania dowolnych danych przy użyciu platformy .NET można znaleźć na stronie https://msdn.microsoft.com/en-us/library/fbxft59x.aspx (j.ang.). Tylko przygotujcie się na solidną porcję zaawansowanych informacji! Jeśli wolicie luźniejsze podejście, zachęcam do lektury publikacji na blogu zespołu Windows PowerShell (j.ang.).

Bardziej złożone formatowanie przy użyciu tabel mieszania

Użycie apletu polecenia Format-Table (lub Format-List) wymaga zazwyczaj przesłania obiektów do apletu polecenia potokiem i określenia, które właściwości mają zostać użyte. Aby np. uzyskać informacje o nazwie i rozmiarze pliku, można wpisać:

Ls c:\foo\*.ps1 | format-table name, length -autosize

Parametry length i name, przekazane do apletu polecenia Format-Table, to nazwy dwu właściwości obiektów utworzonych przez polecenie LS. Polecenie LS (czyli aplet polecenia Get-ChildItem w razie uruchomienia w dostawcy FileStore) tworzy obiekty System.IO.FileInfo i System.IO.DirectoryInfo; jednak w przykładzie, w którym szukamy plików *ps1 tworzony jest tylko pierwszy z nich.

W tym przykładzie przekazujemy do apletu polecenia Format-Table nazwy dwu właściwości, które mają zostać wyświetlone. Wywołanie apletu polecenia Format-Table powoduje pobranie tablicy nazw, która ma zostać sformatowana (chociaż w razie wyświetlania więcej nić 4-6 właściwości tabela staje się niezbyt czytelna, chyba że mamy bardzo szerokie okno konsoli lub bardzo wąskie kolumny). Aby zapewnić większą elastyczność, Windows PowerShell umożliwia też przekazanie do apletów poleceń Fomat-Table i Format-List nie nazw właściwości, lecz tabel mieszania. Tabela mieszania instruuje Windows PowerShell, w jaki sposób wyliczyć wartość określonej kolumny (lub wiersza, ponieważ tabel mieszania można używać również w razie wywołania apletu polecenia Format-List) i jak ją sformatować.

Aby zobaczyć tę funkcję w działaniu, można wypróbować następujący skrypt:

$x1=@{label="Process Name";Expression={$_.name};alignment="right"}

$x2=@{label="CPU Used";Expression={$_.CPU};FormatString="N3"}

Get-Process notepad| Format-Table $x1,$x2 -autosize

Utworzyliśmy tu dwie tabele mieszania ($x1 i $x2), a następnie wywołaliśmy aplet polecenia Format-Table, wskazując te dwie tabele mieszania. Dane wychodzące widać poniżej. Obie tabele mieszania zawierają etykietę, która zostanie użyta jako nagłówek kolumny i wyrażenie używane do wyliczenia wartości wyświetlanej przez Windows PowerShell. Pierwsza tabela mieszania zawiera też informację o sposobie wyrównania kolumny, druga natomiast format platformy .NET.

Wywołując aplet polecenia Format-Table lub Format-List można oczywiście użyć zarówno tabel mieszania, jak i wartości. Aby to zaobserwować, można wypróbować poniższy skrypt:

$x3=@{label="CPU Used";Expression={$_.CPU};FormatString="N4"}

Get-Process * | Format-Table name,$x3 -autosize

A następnie:

$x4=@{label="CPU Time Used";Expression={$_.CPU};FormatString="N3"}

Get-Process * | Format-List name,$x4

Używanie tabel mieszania z apletami poleceń Format-List i Format-Table umożliwia tworzenie poprawnie sformatowanych danych wyjściowych zawsze, gdy jest to potrzebne. Więcej informacji o tabelach mieszania i formatowaniu można uzyskać, zapoznając się z tą poradą dotyczącą Windows PowerShell (j.ang.).

Streszczenie

Jaki widzieliśmy, Windows PowerShell ma rozbudowane formatowanie domyślne. W razie potrzeby Windows PowerShell udostępnia też różne dodatkowe opcje formatowania, jak np. ciągi znaków formatowania, operator -F i tabele mieszania. Można też dostosować pliki PS1XML, tworząc własną wersję formatowania domyślnego. Szczegółowo omówimy to w którymś z przyszłych artykułów. Tak naprawdę jedynym ograniczeniem formatowania są limity wyobraźni.

 Do początku strony Do początku strony

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