PowerShell podstawy – wstęp

By Podstawy, PowerShell

powershell - podstawy

Windows PowerShell

Windows PowerShell to dojrzały język skryptowy oparty na .Net, którego od początku ogromną zaletą jest obiektowość, ale nie tylko. O tym dlaczego warto poznać PowerShell pisałem chociażby, tutaj – 9 powodów dlaczego warto (dobrze) znać PowerShell

Dlatego nie przedłużając zapraszam, do poznania podstawowych komendy i pojęć związanych z PowerShell, które wg mnie pozwalają na pierwsze kroki w interaktywnej pracy z tym rozwiązaniem.

Podstawowe informacje

PowerShell dostarcza niezliczoną liczbę poleceń, tzw. cmdletów. Dlatego jego ogromną zaletą jest utrzymywana standaryzacja składni. Wszystkie polecenia składają się z czasownika i przymiotnika, gdzie separatorem jest myślnik.

Dzięki takiej konwencji nazewniczej łatwiej wyszukiwać potrzebne nam polecenia. Jeśli szukasz poleceń do pobierania informacji/danych, to takie polecenia będą zaczynać się od Get, jeśli potrzebujesz tworzyć nowy elementy, to szukaj poleceń w grupie New, chcąc ustawiać istniejące – Set.

💡 Tip: Polecenie Get-Verb pozwoli Ci zapoznać się z listą wszystkich czasowników zgodnych z standardem.

Get-Command (alias: gcm)

Dzięki Get-Command możemy uzyskać wszystkie polecenia w tym cmdlety, aliasy, funkcje i aplikacje dostępne na swojej stacji roboczej.

Więcej informacji znajdziesz w dokumentacji lub po wywołaniu w konsoli polecenie Get-Help Get-Command -Online.

Natomiast poniżej najpraktyczniejsze sposoby użycia.

Wyszukiwanie z użyciem znaków wieloznacznych (wildcard characters)

💡 Tip: Paramety -Name oraz -Module przyjmuje wartości wraz z znakami wieloznacznymi z czego najbardziej uniwersalne są: 
* – dopasowuje zero lub więcej znaków 
? – dopasowuje dowolny pojedynczy znak

Get-Command -Name *file*
Get-Command -Name set*file

Wyszukiwanie ze wskazaniem nazwy modułu

Wykorzystaj parametr -Module do zawężenia zbioru poleceń, funkcji do konkretnego modułu. Poniżej sposób na wyszukiwanie polecenia w ramach konkretnego modułu, np. Az.Compute.

# polecenie pobierze wszystkie polecenia dla wskazanego modułu
Get-Command -Module Az.Compute
 
# w celu wyszukania poleceń związanych z kopiami zapasowymi, wykorzystaj parametr -Name
Get-Command -Module Az.Compute -Name *Backup*

Czym więcej parametrów wykorzystasz do zdefiniowania szukanego polecenia tym precyzyjniejsze otrzymasz wyniki.

💡 Tip: Korzystaj z mechanizmu dopełniania poleceń. Po wpisaniu części nazwy polecenia lub parametru, naciśnj klawisza Tab. Powłoka PowerShell dopełni resztę najbardziej pasującym ciągiem znaków.

powershell podstawy - mechanizm dopełniania poleceń

Sprawdź również w konsoli takie skróty jak Shift+Tab oraz Ctrl+Space.

Poznaj składnie polecenia

Głównym zadaniem Get-Command jest oczywiście pomoc w poruszaniu się w gąszczu poleceń. Jednak polecenie może zwracać inne przydane informację, między innymi składnie poleceń.

Użyj przełącznika –Syntax, aby wyświetlić składnie interesującego Cię polecenia.

Get-Command -Module Az.Compute -Name *Backup* -Syntax

💡 Tip: Zrozumienie sposobu zapisu składni, ułatwi używanie poleceń. Zapraszam do wpisu, który wyjaśnia, jak rozpoznać, które parametry są wymagane, które pozycyjne a które to tylko przełączniki.

📝 Wykorzystaj poznane polecenie do poznania składni Get-Command, użyj w tym celu aliasu.

Get-Help

Nauka PowerShell wiąże się z częstym zaglądaniem do dokumentacji, do której możesz mieć dostęp z poziomu konsoli dzięki Get-Help.

Domyślnie PowerShell nie posiada dokumentacji lokalnie. Dlatego w pierwszej kolejności wykonaj polecenie Update-Help -Force w celu pobrania treści pomocy (wymaga konsoli z podniesionymi uprawnieniami).

Polecenie Get-Help posiada kilka zestawów parametrów, jednak zawsze wymagana jest nazwa funkcji, cmdletu lub tematu about_* z którym chcesz się zapoznać.

Dla parametru -Name możesz wykorzystać znaki wieloznaczne.

# podstawowy przykład użycia
Get-Help -Name Get-Command
 
# parametr Name jest parametrem pozycyjnym dlatego możemy pominąć nazwę parametru
# tutaj również możesz wykorzystywać znaki wieloznaczne
Get-Help about*

💡 Tip: Używając PowerShell w sposób interaktywny (w konsoli) nie musimy i nie chcemy nadużywać klawiatury dlatego w pracy w tym trybie wykorzystuj aliasy oraz parametry pozycyjne.

Pełną listę aliasów poznasz dzięki poleceniu Get-Alias, natomiast o parametrach pozycyjnych dowiesz się więcej tutaj.

Nauka na przykładach

Osobiście przeglądanie przykładów użycia poleceń pozwala mi na najszybsze wykorzystanie ich w praktyce. Po wykorzystaniu przełącznik -Examples (prawie) zawsze zobaczysz kilka z nich.

Get-Help Get-Command -Examples
pomoc - podstawowe przykłady poleceń

Czytanie dokumentacji poza konsolą

Czytanie w konsoli może być mało przyjemne, dlatego z pomocą przychodzą dwa przełączniki. -ShowWindows, który wyświetli treść w dość prostym GUI, ale z kilkoma przydatnymi opcjami (zobacz Settings).

podstawy powershell

Alternatywą jest parametr -Online, przeniesie Cię automatycznie do dokumentacji w Twojej domyślnej przeglądarce.

Get-Help Get-Help -Online

📝ToDo Polecam zapoznać się z dokumentacją dla Get-Help, spróbuj wykorzystać poznane wyżej sposoby.

📝 ToDo: Sprawdź różnicę działania pomiędzy Get-Help a help.

Get-Member (alias: gm)

Ponieważ obiekty odgrywają centralną rolę w PowerShell, musisz przyzwyczaić się do używania polecenie Get-Member. Polecenie pokazuje formalną nazwę typu obiektu i pełną listę jego elementów takich jak właściwości, metody, aliasy właściwości, zdarzenia.

Zapamiętaj alias gm, dzięki czemu oszczędzisz swoją klawiaturę 🙂

📝 ToDo: Zapoznaj się z pełną treścią pomocy dla polecenia Get-Member, wykorzystaj w tym celu wcześniej poznane polecenie.

Pobranie wszystkich właściwości

Domyślnie polecenie Get-Service ma zdefiniowany widok, który do konsoli zwraca właściwości Status, Name, DisplayName. Podejrzenie pełnych możliwości obiektu umożliwi Ci omawiane polecenie.

Get-Service | Get-Member
 
<#
   TypeName: System.ServiceProcess.ServiceController
 
Name                      MemberType    Definition
----                      ----------    ----------
Name                      AliasProperty Name = ServiceName
RequiredServices          AliasProperty RequiredServices = ServicesDependedOn
Disposed                  Event         System.EventHandler Disposed(System.Object, System.EventArgs)
Close                     Method        void Close()
Continue                  Method        void Continue()
CreateObjRef              Method        System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
Dispose                   Method        void Dispose(), void IDisposable.Dispose()
Equals                    Method        bool Equals(System.Object obj)
ExecuteCommand            Method        void ExecuteCommand(int command)
GetHashCode               Method        int GetHashCode()
GetLifetimeService        Method        System.Object GetLifetimeService()
GetType                   Method        type GetType()
InitializeLifetimeService Method        System.Object InitializeLifetimeService()
Pause                     Method        void Pause()
Refresh                   Method        void Refresh()
Start                     Method        void Start(), void Start(string[] args)
Stop                      Method        void Stop()
WaitForStatus             Method        void WaitForStatus(System.ServiceProcess.ServiceControllerStatus desiredStatus), void WaitForStatus(System.ServiceProcess.ServiceControllerStatus desiredStatus, timespan timeout)
CanPauseAndContinue       Property      bool CanPauseAndContinue {get;}
CanShutdown               Property      bool CanShutdown {get;}
CanStop                   Property      bool CanStop {get;}
Container                 Property      System.ComponentModel.IContainer Container {get;}
DependentServices         Property      System.ServiceProcess.ServiceController[] DependentServices {get;}
DisplayName               Property      string DisplayName {get;set;}
MachineName               Property      string MachineName {get;set;}
ServiceHandle             Property      System.Runtime.InteropServices.SafeHandle ServiceHandle {get;}
ServiceName               Property      string ServiceName {get;set;}
ServicesDependedOn        Property      System.ServiceProcess.ServiceController[] ServicesDependedOn {get;}
ServiceType               Property      System.ServiceProcess.ServiceType ServiceType {get;}
Site                      Property      System.ComponentModel.ISite Site {get;set;}
StartType                 Property      System.ServiceProcess.ServiceStartMode StartType {get;}
Status                    Property      System.ServiceProcess.ServiceControllerStatus Status {get;}
ToString                  ScriptMethod  System.Object ToString();
#>

Ograniczanie ilości informacji o obiekcie

Niektóre obiekty posiadają ponad 100 elementów, użycie dodatkowych parametrów jak -Name lub -MemberType pozwolą ograniczać ilość zwracanych informacji.

# parameter Name umożliwia stosowanie znaków wieloznacznych
Get-Service | Get-Member *Name
 
# parametru MemberType pozowli Ci ograniczyć wynik do elementów obiektu, które Cię interesuje. np. tylko metody albo właściwości.
Get-Service | Get-Member -MemberType Method
Get-Service | Get-Member -MemberType Property
 
# oczywiśce nic nie stoi na przeszkodzie aby używać tych parametrów wpólnie
Get-Service | Get-Member -MemberType Property -Name *Name

Podstawy o znaku potoku – |

Przed przejściem do kolejnych podstawowych poleceń, istotne jest wyjaśnienie znaczenia używanego przeze mnie znaku potoku czyli |.

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.

Get-ChildItem -Path C:\temp -Filter *.jpg | Where-Object Length -gt 5MB | Select-Object FullName,CreationTime

O tym jak sprawdzić, które polecenia akceptują i jakie są metody wiązania parametrów znajdziesz tutaj

Select-Object (alias: select)

Tak jak Get-Member wykorzystałeś do sprawdzenia szczegółów obiektu, to Select-Object umożliwi Ci wybranie właściwości, które Cię interesują z danego obiektu i przekazanie do konsoli.

Polecenie można porównać do klauzuli Select w języku SQL, gdzie definiujesz kolumny, które chcesz otrzymać na wyjściu.

Wiedząc, jakie właściwości ma obiekt i jakich potrzebujesz, możesz je zdefiniować w poleceniu Select-Object.

Get-Command | Select-Object Name, ModuleName, Verb, Source
 
# Wykorzystanie znaków wieloznacznych wraz z poleceniem Select-Object.
Get-Process | Select-Object -Property Start*

To jest najprostsze zarazem najczęstsze zastosowanie tego cmdletu. Poniżej inne zastosowanie

Ograniczanie liczby wyników

Polecenie oprócz wybrania/ograniczenia liczby właściwości umożliwi Ci ograniczenie liczby obiektów ze zbioru. W tym celu możesz wykorzystać parametr –First do pobrania liczbę X pierwszych obiektów lub –Last do pobrania tylko kilku ostatnich.

# pobranie top 5 procesów o największej utylizacji CPU
Get-Process | Sort-Object -Property CPU -Descending | Select -First 5
 
# pobranie 5 ostatnio edytowanych plików
Get-ChildItem | Sort-Object -Property LastWriteTime | Select-Object -Last 5

Wyliczane właściwości

Select-Object możesz również wykorzystać do dodania wyliczonej właściwości. Do parametru -Property możemy przekazać blok skryptu, który zostanie wykonany dla każdego obiektu. Wynik takiego bloku natomiast zostanie zwrócony do konsoli.

Get-ChildItem | Select -Property Name, {$_.Length/1MB}
 
$size = @{label="Size(KB)";expression={$_.length/1KB}}
# Create an additional calculated property with the number of Days since the file was last accessed.
# You can also shorten the key names to be 'l', and 'e', or use Name instead of Label.
$days = @{l="Days";e={((Get-Date) - $_.LastAccessTime).Days}}
Get-ChildItem $PSHOME -File | Select-Object Name, $size, $days

Where-Object (alias ?)

Idąc analogią SQL, Where-Object jest po prostu poleceniem umożliwiającym ograniczanie zbioru do obiektów zgodnych ze zdefiniowanym warunkiem.

Where-Object posiada dwa sposoby konstruowania polecenia:

Zestawienie porównawcze

Jeśli potrzebujemy ograniczyć zbiór na podstawie wartości jednej właściwości, to możesz wykorzystać w tym celu uproszczoną składnie.

Get-Process | Where-Object -Property PriorityClass -EQ -Value "Normal"
Get-Process | Where-Object PriorityClass -eq "Normal"
 
# użycie aliasu
Get-Process | ? Name -eq 'chrome'

Blok skryptu

Jeśli potrzebujesz bardziej założonego warunku, gdzie ograniczenie na podstawie jednej właściwości to za mało to musisz wykorzystać blok skryptu.

Get-Process | Where-Object -Property PriorityClass -EQ -Value "Normal"
Get-Process | Where-Object PriorityClass -eq "Normal"
 
# użycie aliasu
Get-Process | ? Name -eq 'chrome'

Znaki porównywania

Jak pewnie zauważyłeś, w warunkach poleceń Where-Object wykorzystałem nietypowe znaki porównań. Są one inne niż w większości popularnych językach programowania.

równa się (=) czyli -eq (ang. equals)

$Test = 'TEST'
$Test -eq 'TEST'
# true

nierówna się (!=) czyli -ne (ang. not equals)

$Test = 'TEST'
$Test -ne 'TEST'
# false

większy (-gt) i większy lub równy (-ge)

# większy czyli greater than.
9 -gt 8
# true
 
# mniejszy lub równy czyli greater than or equal
9 -ge 8
# true
 
8 -ge 8
# true

mniejszy (-lt) i mniejszy lub równy (-le)

# mniejsze czyli less than
9 -lt 8
# false
 
# mniejszy lub równy czyli less than or equal
9 -lt 8
# false
 
8 -le 8
# true

zawiera czyli -contain

Za pomocą tego znaku sprawdzisz czy zbiór zawiera wskazaną wartość.

# nasz zbiór
$array = 'PowerShell', 'Windows Terminal', 'Windows Server'
$array -contains 'PowerShell'
# true
 
$array -contains 'PowerShell 7'
# false

-like

Operatory znajdują elementy, które pasują do określonego wzorca określonego za pomocą wyrażeń wieloznacznych.

'PowerShell 7' -like '*Shell*'
# true
 
# nasz zbiór
$array = 'PowerShell', 'Windows Terminal', 'Windows Server'
$array -like 'Windows*'
 
#Windows Terminal
#Windows Server

Po dokładny przegląd wszystkich operatorów porównania odsyłam do dokumentacji.

Podsumowanie podstaw

To są podstawowe komendy i pojęcia związane z PowerShell, które wg mnie pozwalają na pierwsze kroki w interaktywnej pracy w konsoli.

Polecenie Get-Command pomoże Ci odnaleźć polecenia, funkcję, których szukasz, Get-Help pomoże Ci zapoznać się z nimi i wykorzystać je po raz pierwszy. Za pomocą Get-Member poznasz szczegóły otrzymanego obiektu.

Idąc dalej, Select-Object i Where-Object pozwolą Ci wybrać z obiektów to, co najważniejsze.

W następnej kolejności warto poznać Foreach-Object, zmienną automatyczną $_ oraz polecenia formatowania wyników. O tym wszystkim już wkrótce.

22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

No comments yet.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

× Close