Podstawy Zbiór wpisów od których warto zacząć przygodę z PowerShell

Potok czyli pełna moc możliwości PowerShell

Dzięki “pionowej kresce” w poleceniach, można wykorzystać pełną moc PowerShell. Znak potoku | bo o nim mowa, umożliwia nam łączyć wiele poleceń w potężne jednowierszowe sekwencję.

W ten sposób osiągamy w jednym wierszu to, co zwykle wymagałoby pisania kilku linii w skrypcie. Wszystko to zasługa potoku.

Potok

Potok zapewnia efektywny sposób przekazywania wyników pomiędzy poleceniami. Każdy znak potoku | powoduję próbę wysyła wyniku poprzedniego polecenia do następnego.

Parafrazując, dane wyjściowe pierwszego polecenia trafiają jako dane wejściowe do następnego polecenia, dane drugiego do kolejnego i tak dalej. Jak woda w potoku, wyniki w PowerShell “płyną” z lewej do prawej.

Jeden niuans, nie wszystkie polecenia akceptują przekazane dane z potoku.

Jak sprawdzić?

Najprościej, sięgając do treści pomocy. W tym celu wykonaj polecenie help z parametrem  -Parameter * i zwróć uwagę na Accept pipeline input.

Oprócz informacji, do jakich parametrów możliwe jest przekazanie wartości, również dowiesz się jakiego typu dane oraz jakie metody wiązania są akceptowane.

Metoda ByValue

Metody są dwie, jednak ByValue ma pierwszeństwo. Jej działanie jest proste, polega na przekazaniu całego obiektu (wszystkich właściwości, metod, aliasów) do kolejnego polecenia.

Zobacz na przykładzie. Get-Process zwraca obiekt typu System.Diagnostics.Process. który jest w całości przekazywany do polecenia Stop-Process. Nastąpi to dopiero po tym jak powłoka PowerShell sprawdzi, czy jakikolwiek parametr polecenie akceptuję meotdę ByValue i przyjmuję obiekt takiego typ.

potok ByValue jak działa pipeline

Jeśli wszystkie warunki są spełnione, wykonywane jest polecenie Stop-Process, jeśli nie to powłoka sprawdza drugą metode.

Metoda ByPropertyName

ByValue opiera się na typie obiektu, natomiast ByPropertyName tylko na nazwie właściwości. Oczywiście wcześniej sprawdzając, czy parametr akceptuję dane z potoku.

W przeciwieństwie do ByValue, która akceptuję jedno wiązanie, ta metoda pozwala na wiązanie wielu pasujących do siebie właściwości i parametrów.

potok ByPropertyName jak działa pipeline

W przypadku Get-Item -Path . | Stop-Process typ obiektu nie zgadza się z typem parametru InputObject. Dlatego wystąpiło wiązanie po nazwie właściwości Name i wykonanie polecenia Stop-Process.

Takie polecanie nie ma większego sensu, ale jako przykład jest idealne 🙂

Dla ciekawskich

Jeśli chciałbyś podejrzeć co dokładnie PowerShell wykonuję w momencie użycia znaku potoku z pomocą przychodzi polecenie Trace-Command.

Podsumowanie

Wpis miał przybliżyć jak PowerShell podejmuję decyzję, kiedy wyjście jednego polecenie może zostać przekazane do kolejnego.

Na początku stosowania potoku może być nieintuicyjne, ale przy odrobinie praktyki przekonasz się, że łączenie poleceń oszczędza czas, a także zwiększa efektywność skryptów.

By

Read More

Lista 10 komend PowerShell, których używam najczęściej

Dzisiaj mam dla Ciebie listę 10 najczęściej używanych komend PowerShell. Jest to lista wyciągnięta z wszystkich dotychczas napisanych przeze mnie skryptów, a już się tego trochę nazbierało.

Jak taką statystykę wykonać, znajdziesz na końcu. Wracając do tematu, poniżej 10 moich podstawowych komend PowerShell.

1. New-Object

Polecenie wykorzystaj do utworzenia własnego obiektu lub obiektu .NET.

2. Write-Verbose

Przekażesz za jego pomocą tekst do strumienia pełnych komunikatów. Polecenia Write-Verbose w skryptach nierozłącznie używaj wraz z atrybutem cmdletbinding().

Dopiero przełącznik -Verbose spowoduje przekazywanie tych komunikatów do konsoli.

3. Add-Member

Add-Member umożliwia dodawania niestandardowych właściwości i metody do obiektu PowerShell.

4. Select-Object

PoleceniaSelect-Object przede wszystkim wykorzystasz do wyboru właściwości obiektu ale również do utworzenia lub modyfikacji obiektu.

5. Join-Path

Używaj do łączenia ścieżek do plików lub folderów. Zalecane podejście przy budowaniu skryptów multiplatformowych.

6. Where-Object

Poleceniem Where-Object wybierzesz obiekty z zbioru na podstawie oczekiwanych wartości właściwości. Warto wspomnieć, że, od PowerShell 3.0 mamy coś takiego jak Simplified Language Syntax.

7. Add-Content

Za pomocą tego polecenia dodasz treść do określonych elementów, np. plików. Zobacz na wykorzystanie polecenia w przykładzie dla Get-Content.

8. Foreach-Object

Polecenie Foreach-Object umożliwia wykonanie powtarzalnych operacji na każdym obiekcie z zbioru. Dziwie się, że jest tak nisko 😉

9. Out-File

Poleceniem Out-File przekażesz dane wyjściowe do pliku. Tożsame z operatorem przekazania > jednak, gdy będziesz musiał określić dodatkowe parametry użyj nazwy cmdletu.

10. Get-Content

Polecenie Get-Content wykorzystasz do pobrania np. tekstu z pliku. W przypadku plików domyślnie treść jest odczytywana wiersz po wierszu ale nic nie stoi na przeszkodzie aby przełącznikiem -Raw zmienić sposób działania.

Podsumowanie

To była lista 10 najczęściej wykorzystywanych przeze mnie komend PowerShell w skryptach, które napisałem dotychczas. Obecność (co może być zaskoczeniem) takich polecenia jak New-Object, Write-Verbose lub Join-Path wynika z trzymania się dobrych praktyk pisania skryptów w PowerShell. Do których mocno zachęcam.

PS. Chcesz się dowiedzieć, jakie jest Twoje top 10? W tym celu możesz wykorzystać mój skrypt.

By

Read More

Wszystko, co powinieneś wiedzieć o ciągach znaków w Powershell

Jeśli miałbym wytypować, co najczęściej używam w swoich skryptach to postawiłbym na ciągi znaków, stąd przegląd niuansów klasy System.String dostępnej w PowerShell.

Zaczynamy.

Deklarowanie typu zmiennej

PowerShell nie wymaga rzutowania typu zmiennej, pierwsze zastosowanie zmiennej określa jego typ. Tak, więc $messege będzie typu String, tak samo jakbyśmy jawnie rzutowali typ zmiennej w sposób [string]$message

Inaczej wygląda sytuacja dla tablic znakowych. W jednym i drugim przypadku zmienne dziedziczą z System.Array jednak dla jednej właściwość Name wskazuje Object[] a dla drugiej String[].

Niesie to za sobą konsekwencje przy późniejszym dodawaniu kolejnych elementów do tabilicy. String[] dokonuję niejawnej konwersji do typu System.String, gwarantując, że wszystkie elementy tej tablicy są dokładnie tego typu.

Pojedynczy cudzysłów

Zawarcie ciągu znaków w pojedynczych cudzysłowach powoduję przekazanie do zmiennej dokładnie tak, jak zostało to wpisane.

Nie nastąpi podmiana wartości zmiennych, należy wtedy stosować podwójny cudzysłów albo łączenie ciągów tzw. konkatenacja.

Podwójny cudzysłów

Po zawarciu łańcucha w podwójny cudzysłów (ciąg znaków podwójnie cytowany), nazwy zmiennych poprzedzone znakiem dolara $ są zastępowane wartością zmiennej przed przekazaniem łańcucha do polecenia przetwarzania.

Łączenie ciągów (konkatenacja)

Znakiem łączącym ciągi jest + zarówno dla pojedynczego i podwójnego cudzysłowu.

Mając jednak na uwadze właściwość podmieniania zmiennych dla podwójnego cudzysłowu prościej i szybciej napisać.

Mała trudność o której musisz pamiętać występuje, gdy chcesz wyświetlić w ciągu znaków wartość właściwości.

Przy takim zapisie nazwa właściwości Version jest traktowana tylko jako ciąg znaków. Natomiast przy podmianie zmiennej następuję niejawna konwersja do ciągu znaków, w rezultacie zwracany jest typ obiektu (choć nie zawsze). To tak jakby zostało wywołane [string]$host.

Do poprawnego wyświetlenia wartości w ciągu znakowym należy zastosować $().

Taki zapis umożliwia również wykonywanie operacji zawartych w ciągu.

Metody złożonego formatowania

Metodę tą również możesz wykorzystać jako sposób na łączenie ciągów. Polega ona na umieszczaniu, indeksowych znacznikami takich jak {0}, {1}, {n+1} które następnie zastępowane są odpowiednimi obiektami z listy.

Istnieją dwa sposoby obsługi takiego formatowania. Użyciu statycznej metody Format() klasy System.String lub skorzystanie z operatora formatu -f.

Jako listę obiektów możemy również wykorzystywać zdefiniowaną wcześniej tablicę.

Cudzysłów, jako znak ciągu

Niekiedy trzeba umieścić znaki cudzysłowu w ciągu, aby sobie z tym poradzić mamy kilka możliwości. Pierwszy sposób to zdublowanie cudzysłowu w wymaganym miejscu.

Bez problemów można zawrzeć pojedynczy cudzysłów w ciągu określonym podwójnymi cudzysłowami i odwrotnie.

Ostatnim sposobem jest umieszczenie ciągu w @""@, co daje sporą swobodę w stosowaniu cudzysłowów, podmieniania zmiennych oraz pisaniu ciągów wielowierszowych.

Ciąg wielowierszowy (nowa linia)

Istnieje kilka sposobów, jednym z nich jest wykorzystanie @" "@ o który wykorzystałem wyżej. Daje najwięcej elastyczności i jest najczęściej wykorzystywany.

Możesz użyć znaków specjalnych np. nowej linii aby “złamać” swoją treść.

Lista wszystkich znaków specjalnych:

CharacterDescription
`0Null
`aAlert (Beep)
`bBackspace
`eEscape
`fForm feed
`nNew line
`rCarriage return
`tHorizontal tab
`u{x}Unicode escape sequence
`vVertical tab
--%Stop parsing

Działania na ciągach

Obiekty klasy System.String dostarczają nam pewny zbiór metod które umożliwiają nam typowe przekszałcenia  i działania na ciągach.

Wielkość znaków

Metoda ToUpper() umożliwia przekonwertowanie wszystkich znaków w ciągu na ich wielkie odpowiedniki, natomiast ToLower() odwrotnie, zamienia wszystkie znaki na małe.

Usuwanie

Remove() zwraca nowy ciąg znaków, w który zostaje usunięta określona liczba znaków, rozpoczynając od określonej pozycji. Brak podania liczby znaków powoduję usunięcie wszystkiech znaków od określonej pozycji.

Trim(), TrimEnd(), TrimStart()użyteczne przy okazji usuwania białych znaków lub pojedyńczych niechcianych znaków.

Metoda Substring() co, prawda nie służy tyle do usuwania co wyodrębniania konkretnego elementu ciągu, jednak w ten sposób pozbywamy się zbędnego łańcucha znaków.

Jako parametry musimy określić pozycje, opcjonalnie również długość ciągu, którą ma zostać zwrócona.

Dzielenie ciągu

Metoda Split() klasy System.String służy do dzielenia łańcucha znaków na tablicę. Najprostsze zastosowanie tej metody to podanie separatora dzielenia.

Oprócz metody do dzielenia można posłużyć się dostępnym w PowerShell operatorem -split.

Z znacznych różnic pomiędzy metodą a operatorem jest taka, że dla metody możliwe jest określenie tablicy separatorów.

Natomiast dla operatora -split w składni możliwe jest podanie bloku skryptu {<ScriptBlock>}czego nie zrobimy stosując metodę.

Metoda Split() oprócz parametru separatora przyjmuję inne parametry, dokładniejsze omówienie wraz z przykładamy pod tym linkiem. Również operator -split posiada swoje niuanse, które zostały dobrze opisane w dokumentacji.

Zastępowanie znaków (Replace() vs -replace)

Do zastępowania znaków możesz wykorzystać metodę Replace() klasy System.String. Metoda ta przyjmuje dwa parametry, starą wartość (znak lub ciąg) oraz nową wartość

Istnieje również operator -replace, który może wydawać się tylko innym sposobem wywołania ww. metody Replace().

Jednak operator umożliwia korzystanie z wyrażeń regularnych czego nie oferuję metoda Replace()

Alternatywą dla operatora -replace jest skorzystanie z statycznej metody Replace() klasy Regex. Pod tym względem dostarczają identyczną funkcjonalność.

Podsumowanie

Wpis zawiera całą moją wiedze (na dany moment) w tym konkretnym temacie. Jestem pewien, że jeszcze sporo tu brakuję, dlatego do wpisu będę starał się dodawać nowe rzeczy i liczę, że mi w tym pomożesz.

Jeśli jest coś co warto tu dodać, to daj znać w komentarzu lub pisz na maila.

By

Read More

× Close