Szybki kurs Powershella. Część materiału pochodzi z referatu Piotra Ablewskiego.
PowerShell ma strukturę składni czasownik-reczownik:
1 2 3 |
PS> Get-childitem PS> Set-location c:\ PS> Clear-host |
Argumenty zawsze zaczynają się od znaku łącznika (minusa). Argumenty oddzielone są przecinkiem np:
1 |
PS> verb-noun -param arg, arg |
Argumenty uruchomieniowe skryptu, które podane zostały w linii komend można przeglądać dzięki zmiennej $args. $args jest tablicą, w której znajdują się parametry. Tablica ta indeksowana jest od 0. Aby dostać się bezpośrednio do ostatniego elementu tablicy, można wykorzystać indeks -1.
Wywołując skrypt:
1 |
PS> skrypt.ps1 –pierwszy –drugi –trzeci |
Do parametrów dostać można się w następujący sposób:
- $args[0]
– pierwszy
- $args[1]
– drugi
- $args[2]
– trzeci
- $args[-1]
– trzeci
Trzy typy komend możliwych do uruchomienia:
– natywne
np. ifconfig
– aliasy
np. cls, ls
– skrypty
– cmdlet (commandlety)
Składnia pozycyjna
– parametry muszą być umieszczane we właściwej kolejności.
Możliwa zwięzła forma komend. Skrypty lepiej jednak pisać w pelnej
długiej składni ze względu na łatwiejsze debugowanie takich skyptów.
np.
1 |
PS> Stop-process -> spps |
Wyświetlenie listy dostępnych aliasów
1 |
PS> get-alias |
np.
1 2 3 |
PS> set-location ./Public PS> cd ../ PS> sl ./Public |
Pomoc
1 2 |
PS> get-help PS> help |
np.
1 2 3 |
PS> get-help get-process PS> get-help *process PS> get-help stop* |
Aby zobaczyć przykłady użycia danej komendy należy wykorzystać opcję :
1 |
PS> Get-Help Komenda –Examples |
Dodatkowo będziemy mogli wtedy przejrzeć opis komendy.
Aby uzyskać szczegółowy opis polecenia, zilustrowany przykładami pomocna będzie opcja –Detailed:
1 |
PS> Get-Help Komenda –Detailed |
Aby przejrzeć pełną dokumentację techniczną zawierającą opis komendy, parametry z opisami i przykłady zastosowania, należy użyć opcji –Full:
1 |
PS> Get-Help Komenda –Full |
Jeżeli żadna z zaprezentowanych powyżej opcji nie rozwiała naszych wątpliwości i nie przekazała informacji, której poszukiwaliśmy, zawsze możemy poszukać informacji na temat danego cmdlet’a w
Internecie, prosto z poziomu PowerShell, wykorzystując opcję –Online:
1 |
PS> Get-Help Komenda –Online |
GET-COMMAND
Kolejną ważną dla początkujących komendą będzie cmdlet Get-Command. Pozwoli ona na znalezienie cmdlet’a, którego składni dokładnie nie pamiętamy.
Jednak w pierwszej kolejności skupmy się na samej komendzie Get-Command. Wywołanie:
1 |
PS> Get-Command |
Powoduje, że wyświetlona zostaje lista wszystkich cmdlet’ów zainstalowanych na komputerze oraz ich aliasów, funkcji, filtrów, skryptów i dostępnych aplikacji. Polecenie to daje wyniki dotyczące wszystkich sesji. Jeżeli chcemy ograniczyć się do bieżącej sesji przydatny okaże się parametr -ListImported:
1 |
PS> Get-Command –ListImported |
Jeśli wykonamy polecenie:
1 |
PS> Get-Command * |
Otrzymamy listę wszystkich typów komend, wliczając w to programy, które nie są integralną częścią PowerShell’a, a zawarte są w katalogach zapisanych w zmiennej systemowej $PATH. Można zadać sobie pytanie: jaka jest różnica pomiędzy poleceniami Get-Help a Get-Command. W pierwszy przypadku, wynik jest brany z manuala do danego polecenia, a w przypadku drugim – prosto z kodu komendy. Jakie inne parametry mogą być jeszcze przydatne? Oto ich lista z wyjaśnieniem użycia. Oczywiście dokładny opis wszystkich opcji można uzyskać korzystając z pomocy PowerShell’a, a więc wywołując
cmdlet’a Get-Help.
Parametry charakterystyczne dla cmdlet’a Get-Command:
1 |
PS> GET-COMMAND –ALL |
Zwraca listę wszystkich komend, włączając w to komendy tego samego typu, które mają te same nazwy (są w innych przestrzeniach nazw).
1 |
PS> Get-Command –ArgumENtList argument |
Zwaca listę wszystkich komend, które można wywołać z podanym parametrem
1 |
Get-Command –CommandType typ |
Zwraca tylko te komendy, które należą do danego typu komend. Dostępne typy to:
? Alias
– alias do polecenia w PowerShell’u
? All
– komendy wszystkich typów
? Applications
– pliki, które nie są częścią PowerShell’a, ale zawarte są w ścieżkach zadeklarowanych w zmiennej systemowej $PATH (wliczając w to pliki tekstowe, wykonywalne jak i biblioteki DLL)
? Cmdlet
– komendy będące tylko cmdlet’ami (czyli integralną częścią PowerShell’a)
? ExternalScript
– pliki zawarte w folderach zadeklarowanych w zmiennej $PATH zawierające skrypty PowerShell’a (czyli pliki o rozszerzeniu *.ps1)
? Filter
– wszystkie filtry PowerShell’a
? Function
– wszystkie funkcje PowerShell’a
? Script
– wszystkie bloki skryptów (za wyjątkiem oddzielnych plików, które zwróci typ ExternalScript
? Workflow – wszystkie workflow’y dostępne w PowerShell’u
GET-COMMAND –MODULE NAZWA
Wyświetla informacje o komendach, które pochodzą z określonego modułu lub dodatku.
1 |
PS> Get-Command –Module nazwa_modułu |
GET-COMMAND –NAME WZÓR
Wyświetla tylko te komendy, które zawierają w sobie konkretną nazwę lub wzór nazwy, w którym można stosować wieloznaczniki. Aby dodatkowo uzyskać listę wszystkich poleceń o podanej nazwie zaleca się stosowanie opcji –All z opcja –Name
1 |
PS> Get-Command –all –name wzór |
GET-COMMAND –NOUN WZÓR
Podaje wszystkie komendy, których nazwy zawierają podany rzeczownik w swojej nazwie. Jako
argument można podać klika słów, również stosowanie masek jest dozwolone.
1 |
PS> Get-Command –Noun rzeczownik |
GET-COMMAND -SYNTAX
Podaje tylko określone informacje na temat poszukiwanej komendy:
? Dla aliasów – podaje nazwę komendy, którą uruchamia alias
? Dla cmdlet’ów – podaje składnię polecenia
? Dla funkcji i filtrów – wyświetla ich definicję
? Dla skryptów i aplikacji – wyświetla ścieżkę i nazwę pliku, który zostanie uruchomiony
1 |
PS> Get-Command –Syntax wzór |
GET-COMMAND -TOTALCOUNT
Zwraca określoną ilość komend. Parametr ten jest wykorzystywany, aby ograniczyć ilość zwróconych komend:
1 |
Get-Command –TotalCount ilość [dalsze parametry] |
GET-COMMAND -VERB
Zwraca wszelkie możliwe parametry, których nazwa zawiera podany czasownik. Można stosować kilka czasowników jak również maski w podawanych słowach.
1 |
PS> Get-Command –Verb czasownik |
GET-COMMAND -LISTIMPORTED
Podaje tylko te komendy, które dostępne w bieżącej sesji. Parametr ten jest przydatny, gdyż od PowerShell 3.0 domyślnie zwracane są wszystkie dostępne komendy, nie tylko te z bieżącej sesji.
1 |
PS> Get-Command –ListImported |
GET-COMMAND -PARAMETERNAME
Zwraca te komendy dostępne w danej sesji, które posiadają podane parametry. Można podawać
nazwy parametrów lub ich aliasy. Obsługiwane są również maski w słowach.
1 |
PS> Get-Command –ParameterName nazwa_parametru |
GET-COMMAND –PARAMETERNAMETYPE
Jako wynik otrzymujemy listę komend dostępnych w aktualnej sesji, które mogą zostać wywołane z parametrami określonego typu. Można stosować całe lub częściowe nazwy typów. Dozwolone jest również stosowanie masek.
1 |
PS> Get-Command –ParameterType typ_parametru |
Oczywiście polecenie Get-Command oferuje jeszcze inne możliwe parametry, z którymi można je wywołać, takie jak: -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer czy –OutVariable.
Jednak są one na tyle rzadko stosowane, że nie ma potrzeby wspominać o nich w kursie podstaw PowerShell’a. Jeśli jednak ktoś jest zainteresowany działaniem wymienionych parametrów, może zawsze skorzystać z pomocy PowerShell’a.
GET-MEMBER
Wiedząc już jak znaleźć polecenie wśród gąszczu funkcjonalności zdarza się, że nie do końca wiemy jakie własności czy metody posiada obiekt na którym działamy. Z pomocą przyjdzie nam na tutaj polecenie Get-Member. Służy ono, jak z resztą wskazuje nazwa, to podpowiedzenia użytkownikowi jakie elementy składowe posiada obiekt wykorzystywanej klasy.
1 |
PS> Get-Member paramerty |
Wyświetlanie procesów
1 |
PS> get-process |
np. get-process -name mail
# czyszczenie ekranu
1 |
PS> clear |
Pipeliny
np. odnalezienie id procesu Mail i zatrzymanie go
1 |
PS> Get-process -name Mail | stop-proces |
Zmienne
– pozwalają na manipulacje danym gdy zachodzi taka potrzeba
– zmienne muszą zaczynać sie od znaku $
– mogą zawierać wynik komendy np. $variable=get-process -name Mail
Wyświetlenie wszystich komend związanych ze zmiennymi
1 |
PS> Get-help *variable* |
np.
1 2 |
PS> $processesonmac=get-proces PS> cat $processesonmac |
np.
1 2 3 4 5 6 7 |
PS C:\> $daysofweek=3 PS C:\> $daysofweek + 1 4 PS C:\> $daysofweek + 2 5 PS C:\> $daysofweek + 2 5 |
Operacje na plikach.
odczyt pliku
1 |
PS> cat /users/username/proces.csv |
zapis do pliku
1 |
PS> Get-process | out-file --FilePath /users/username/process.csv |
UMOŻLIWIENIE WYKONYWANIA SKRYPTÓW
1 |
PS> Set-ExecutionPolicy Unrestricted |
- Restricted
– uniemożliwia uruchamianie skryptów
- All Signed
– umożliwia uruchomienie skryptów, które podpisane są przez wiarygodnego twórcę
- Remote Signed
– skrypty lokalne mogą być uruchamiane, skrypty ściągnięte muszą być cyfrowo podpisane
- Unrestructed
– można uruchamiać wszelkie skrypty, nawet te niepodpisane cyfrowo i od niepewnych wydawców.
Znakiem komentarza w PowerShell’u jest znak #.
1 2 3 |
# # Te trzy linie są zakomentowane # |
ZNAKI SPECJALNE FORMATOWANIA LINII
Bardzo często zdarza się, że potrzeba złamać linię lub złączyć klika instrukcji w jednej, aby kod był czytelny.
Do oddzielenia następujących po sobie instrukcji w PowerShell’u służy znak ;
Oto przykład jego wykorzystania:
1 |
$a = 1; $b = 2; $c = $a + $b; |
Istnieje również możliwość złamania linii z wykorzystaniem znaku .
1 2 |
Write-Host ` „KONTYNUACJA” |
Podobne działanie ma znak |
, który oddziela poszczególne polecenia, przekazując zarówno strumień obiektu z jednego cmdlet’a do drugiego:
1 |
PS> Get-ChildItem | Sort-Object Size |
Które wylistuje bieżący katalog i posortuje wyniki zgodnie z ich rozmiarem.
WYŚWIETLENIE DANYCH NA KONSOLI
Podstawowym sposobem na interakcję z użytkownikiem jest pobieranie i wyświetlanie danych w konsoli. Aby wyświetlić dane wykorzystamy cdlet’a Write-Host. Znany wszystkim programistom „Hello World!” w przypadku PowerShell’a wygląda następująco:
1 |
PS> Write-Host „Hello world” |
Najprostszym sposobem na zmianę wizualną stylu wyświetlania komunikatów jest wykorzystanie trybu ostrzegawczego konsoli:
1 |
PS> Write-Warnig „Nieautoryzowany dostęp do danych!” |
Aby wykorzystać dowolny kolor z dostępnej palety, można zastosować argument –foregroundcolor, który dla cmdlet’a Write-Host zmieni kolor pierwszoplanowy oraz cmdlet’a –backgroundcolor, który zmieni kolor drugoplanowy. Przykładowe użycie wygląda następująco:
1 |
PS> Write-Host „Chodź, pomaluj mój świat na „; Write-Host „zółto” –foregroundcolor „yellow” ; Write-Host „ i na „; Write-Host “niebiesko” –backgroundcolor “blue” |
Jak łatwo zauważyć, wpisywany tekst jest łamany dopiero po zakończeniu polecenia. Aby złamać go wcześniej wystarczy zawrzeć w miejscu podziału ciąg: n, tak jak w poniższym przykładzie:
1 |
PS> Write-Host „To jest linia pierwsza. `n A to już linia druga.” |
POBIERANIE DANYCH Z KONSOLI
Równie banalne jest pobieranie danych z konsoli. Służy ku temu polecenie Read-Host (po raz kolejny zwracam uwagę na bardzo logiczną nomenklaturę stosowaną przy nazewnictwie cmdlet’ów).
1 |
PS> $zmienna = Read-Host „Podaj swoje imię tajemniczy użytkowniku:” |
Polecenie przedstawione powyżej spowoduje wyświetlenie na konsoli monitu o podanie danych i wczytanie danych do zmiennej $zmienna.
PORÓWNYWANIE ZMIENNYCH
Jeśli korzystamy ze zmiennych, będziemy je chcieli zapewne porównać. Oczywiście część z cmdlet’ów posiada już zaimplementowaną obsługę operatorów porównania (np. Where-Object).
W PowerShell’u można wykorzystać następujące operatory porównania:
-lt
– mniejsze niż
-le
– mniejsze lub równe
-gt
– większe niż
-ge
– większe bądź równe
-eq
– równe
-ne
– nierówne
-like
– podobne do (wykorzystuje symbole wieloznaczne i maski)
-notlike
– niepodobne do (również wykorzystuje symbole wieloznaczne i maski)
Dodatkowo operatory mogą rozróżniać wielkie i małe litery. Aby włączyć tą funkcjonalność należy przed symbolem operatora porównania użyć litery c. Np. operator –ceg to operator równości z uwzględnieniem wielkości liter.
CZYTANIE DANYCH Z PLIKÓW
PoweShell umożliwia również czytanie danych z pliku, przy wykorzystaniu polecenia Get-Content. Jego składnia wygląda następująco:
1 |
PS> $wczytany_plik = Get-Cotent C:\Users\PiotrAblewsi\pliczek.txt |
Każda z linii w pliku taktowana jest jako oddzielna zmienna, która znajduje się w tablicy. Dostać można się do niej poprzez numer wiersza w pliku. Zasady numeracji są takie same jak w przypadku argumentów wejściowych skryptu – $wczytany_plik[0] to linia pierwsza, $wczytany_pli[10] to linia
jedenasta, a $wczytany_plik[-1] to ostania linia w pliku.
Aby określić ilość linii, słów lub znaków w pliku, należy zastosować polecenie:
1 |
PS> Get-Content ścieżka_do_pliku | Measure-Object –line –word –character |
ZAPISYWANIE DO PLIKU
Skoro umiemy już otwierać pliki, warto zapoznać się ze sposobami na zapisanie danych do pliku. Oczywiście dostępne są wcześniej wspomniane strumienie plikowe znane jeszcze z czasów DOSa, czyli >
, który nadpisuje plik i >>
, który dopisuje do pliku. Jednak stworzony został cmdlet, który umożliwia zapis do pliku. Jest to Out-File. Świetnym przykładem zapisu do pliku jest wylistowanie procesów uruchomionych na maszynie, tak więc w PowerShell’u można zrealizować to na dwa sposoby: Pierwszy, znany już z czasów DOS’a:
1 |
PS> Get-Process > plik |
Celem utworzenia nowego pliku, lub
1 |
PS> Get-Process >> plik |
Celem dopisania treści do istniejącego już pliku. Drugim sposobem jest zastosowanie cmdlet’a Out-File:
1 |
PS> Get-Process | Out-File plik |
Celem nadpisania pliku, lub
1 |
PS> Get-Process | Out-File plik –Append |
Celem dopisania danych do istniejącego pliku. Oczywiście dane można zapisać w bardziej przyjaznym do obróbki formacie CSV, stosując polecenie
Export-CSV:
1 |
PS> Get-Process | Export-CSV plik |
DRUKOWANIE DANYCH
Dane w PowerShell’u można przedstawiać nie tylko na standardowym wyjściu czy w pliku, ale również można wysłać je na domyślną drukarkę poprzez polecenie Out-Printer:
1 |
PS> Get-Process | Out-Printer |
Spowoduje to wydrukowanie wszystkich procesów uruchomionych na naszej maszynie na domyślnej drukarce.
PĘTLE I INSTRUKCJE WARUNKOWE
PowerShell, jako że jest pełnoprawnym językiem programowania, posiada szereg pętli i instrukcji, które można wykorzystać przy tworzeniu kodu. Postaram się omówić ich strukturę w sposób na tyle
jasny, ze nie będzie problemem ich wykorzystanie w trakcie pisania skryptów.
IF … ELSEIF .. ELSE
Podstawową instrukcją warunkową wykrzystywana przez PowerShell jest poczciwy IF. Jego konstrukcja powinna być znana wszystkim programistom, w takiej formie jak w tym przypadku – programistom tworzącym skrypty pod powłoki systemu Linux/UNIX.
1 2 3 4 5 6 7 8 9 10 |
if (warunek1) { Instrukcje… } elseif ( warunek2) { Instrukcje… } else { Instrukcje… } |
Opcje elseif i else są oczywiście opcjonalne i najprostsza konstrukcja zakłada wykorzystanie samej
opcji if.
SWITCH
Dzięki instrukcji Switch można w prosty sposób uniknąć tworzenia wielu instrukcji warunkowych if po sobie.
1 2 3 4 5 6 7 |
switch (zmienna) { wartość_1 {instrukcje} wartość_2{instrukcje} … wartość_n {instrukcje} default {instrukcje wykonane, gdy warunki nie pasują} } |
FOR
Jeśli pętla ma wykonać się dla określonej wartości zmiennych, najlepszym wyborem będzie FOR
1 2 3 4 |
for(wartość_początkowa; warunek_zakończenia; inkrementacja_zmiennej) { Instrukcje; } |
FOREACH
Jeśli będziemy operować na większym zbiorze danych, jak na przykład na obiekcie, bardzo pomocna okaże się pętle Foreach:
1 2 3 4 |
foreach ($i in lista_parametrów) { Instrukcje zależne od zmiennej $i; } |
PĘTLA WHILE
– STEROWANA Z GÓRY
Jeśli zależy nam na wykonywaniu się kodu do osiągnięcia pewnego warunku, można wykorzystać
pętlę While. Wykonuje się ona dopóty, dopóki warunek jest spełniony:
1 2 3 4 |
while {warunek} { Instrukcje; } |
PĘTLA DO WHILE
– STEROWANA Z DOŁU
Jeśli instrukcje mają zostać najpierw wykonane, a później ma zostać sprawdzony warunek (czyli
wykonanie instrukcji nastąpi na pewno minimum raz), możemy wykorzystać pętlę Do While:
1 2 3 4 |
do { Instrukcje; } while (warunek) |
DO … UNTIL
Ciekawostką jest również fakt, że do łask wróciła pętla until sterowana z dołu, a więc instrukcja wykona się przynajmniej raz i będzie wykonywana dopóty, dopóki warunek nie będzie spełniony:
1 2 3 4 |
do { Instrukcje; } until (warunek) |