Windows PowerShell

Download Report

Transcript Windows PowerShell

Windows PowerShell
Remigiusz Górecki
Krzysztof Boryczko
Czym jest PowerShell ?
Windows PowerShell (WPS) to oparte na
platformie .NET środowisko
przeznaczone do zarządzania systemem
operacyjnym z poziomu konsoli oraz
automatyzowania zadań administracyjnych
przy użyciu skryptów.
Cechy środowiska



Zbiór poleceń zaimplementowanych jako
aplety poleceń (commandlet).
Zapewnia dostęp do wszystkich obiektów
systemowych i aplikacji bibliotek Component
Object Model (COM), platformy .NET
Framework i interfejsu Windows
Management Instrumentation (WMI).
Zapewnia efektywne interakcje między
apletami poleceń, dzięki przetwarzaniu
potokowemu opartemu na obiektach
(interpretery uniksowe pracują na tekście)
Cechy środowiska - cd





Posiada jednolity sposób dostępu do różnych
repozytoriów danych, zarówno hierarchicznych
(AD, system plików), jak i płaskich (zmienne
środowiskowe).
Język skryptowy jest intuicyjny, łatwy do nauczenia.
Umożliwia kontrolę błędów na różnych
poziomach.
Zastosowany model zabezpieczeń pozwala
blokować uruchamianie niepożądanych skryptów.
Posiada możliwość śledzenia wykonania i
debugowania.
Możliwy do zintegrowania z dowolną aplikacją.
Historia
Powstał w trakcie prac nad Windows Server
2003 – chodziło o zastąpienie DOS-owego
okna wiersza poleceń.
 Środowisko WSH (Windows Scripting Host)
było trudne w użyciu, wymagało dobrej
znajomości zasad programowania
obiektowego oraz niespójności i wyjątków
modelu COM.
 2002 - Premiera .NET Framework.
 X.2003 – premiera nowej powłoki o
roboczej nazwie Monad.
 V.2006 – premiera wersji 1.0 PowerShell.

Instalacja
Windows Server 2008R2 jest pierwszym, do którego
włączono WPS.
 Dostępne dla:

◦
◦
◦
◦
◦
Windows XP – z Service Pack 2,
Windows Server 2003 – z Service Pack 1,
Windows Vista,
Windows 2008
Windows 7.
Wymaga wcześniejszego zainstalowania .NET Framework w
wersji co najmniej 2.0 z SP2.
 Wersja 2.0 WPS wyposażona została w edytor i debuger.
 Rozszerzenia PoweShell Community Extensions (PSCX)
dostępne na stronie: www.codeplex.com/PowerShellCX
 Alternatywny edytor PowerShellPlus dostępny na stronie:
www.powershell.com

WPS w trybie interaktywnym

Uruchomienie konsoli i wydawanie
poleceń z linii komend.
WPS w trybie wykonywania
skryptów
Skrypt PowerShella to plik tekstowy w
języku Powershell Script Language (PSL).
 Skrypt zawiera deklaracje zzmiennych
oraz wywołania apletów.

PowerShell ISE
Podstawy apletów poleceń
Standardowe polecenie WPS to aplet polecenia
(commandlet, cmdlet) lub funkcja.
 Aplety są wykonywane zawsze w obrębie głównego
procesu WPS.
 Na wywołanie apletu składają się najczęściej trzy
elementy:

1.
2.
3.
czasownik,
rzeczownik (w liczbie pojedynczej),
lista parametrów (opcjonalna).
Czasownik i rzeczownik są połączone znakiem - , a
kolejne parametry oddzielone spacją.
 Wielkość liter nie ma znaczenia.
 Przykład:

PS C:\ > Get-Process i*
Parametry wywołania apletu (1)
Są traktowane jako ciągi znakowe,
niezależnie od tego, czy są ujęte w
cudzysłów, czy nie.
 Znaki cudzysłowu są opcjonalne poza
sytuacją, gdy parametr zawiera znak spacji:

PS C:\> Get-ChildItem ”C:\Program Files”
Parametry wywołania apletu (2)

Jeżeli aplet polecenia posiada więcej niż
jeden parametr, można je podawać w
ściśle określonej kolejności lub posłużyć
się nazwami. Poniższe polecenia mają
identyczne działanie:
PS C:\> Get-ChildItem c:\temp *.doc
PS C:\> Get-ChildItem –Path c:\temp –Filter *.doc
PS C:\> Get-ChildItem –Filter *.doc –Path c:\temp
Przełączniki
Przełączniki to parametry nie posiadające
wartości.
 Samo użycie nazwy takiego parametru
aktywuje odpowiednią funkcję.
 Przykładowo, rekurencyjne przetwarzanie
pliku danych zapewnia przełącznik –
recurse:

PS C:\> Get-ChildItem C:\temp -recurse
Parametry określone wyrażeniami

Wartość parametru może być wynikiem
obliczenia wartości wyrażenia:
PS C:\> Get-ChildItem (”C:\” + ”temp”) *.dll –recurse
PS C:\> Get-Process
–id (2800 + 100)
W treści parametrów
można korzystać z
symboli wieloznacznych:
PS C:\> Get-Service –exclude ” [k-z]*”
Tryby przetwarzania WPS

Tryb poleceń (normalny) – wszystkie dane
wejściowe są traktowane jako ciągi znakowe:
”Hello ”+ ” ” + ”World”

Tryb wyrażeń – umożliwia rozpoznawanie
liczb i wyrażeń:

10* (8 + 6)
Tryby można Write-Output
łączyć.
Wyrażenie można włączyć do polecenia
stosując znaki nawiasów.

Polecenia z wyrażeniami (1)
Przykład
2+3
echo 2+3
echo (2+3)
2+3 | echo
Znaczenie
Wyrażenie. PowerShell wykonuje
obliczenie i zwraca liczbę 5.
To jest wyłącznie polecenie. 2+3 jest
interpretowane jako ciąg znakowy
wypisywany na ekranie.
Polecenie, które zawiera wyrażenie.
Powoduje wypisanie liczby 5.
To jest potok, którego pierwszy stopień
to wyrażenie. Wynik wyrażenia zostaje
przekazany do drugiego stopnia potoku i
na ekranie zostaje wyświetlona liczba 5.
Polecenia z wyrażeniami (2)
Przykład
Znaczenie
echo 2+3 | 7+6
To jest niepoprawna konstrukcja. Wyrażenie
może zostać użyte wyłącznie jako pierwszy
stopień potoku.
$a = Get-Process
To jest wyrażenie, które zawiera polecenia.
Wynik zwracany przez Get-Process zostaje
przekazany do zmiennej.
$a | Get-Process
To jest potok rozpoczynający się od
wyrażenia. Zawartość zmiennej $a zostaje
przekazana poleceniu Get-Process jako
parametr.
Get-Process | $a
To jest niepoprawna konstrukcja. Wyrażenie
może być wyłącznie pierwszym stopniem
potoku.
Aliasy



Pozwalają skrócić wywołania apletów
poleceń.
Polecenie Get-Alias (lub jego alias
aliases) pozwala wyświetlić listę
predefiniowanych skrótów nazw apletów
poleceń.
Listę wszystkich aliasów wybranego apletu
(w tym przypadku Get-Process) uzyskamy
poleceniem:
Get-Alias | Where-Object { $_.definition -eq ”get-process” }
Tworzenie nowych aliasów

Nowy alias można zdefiniować przy pomocy poleceń:
◦ New-Alias – tworzy nowy alias lub zwraca informację o błędzie, jeśli
alias o podanej nazwie już istnieje.
◦ Set-Alias – definiuje nowy alias, a jeżeli dana nazwa została już
wykorzystana, zastępuje starą definicję nową.
Parametr –description pozwala dołączyć do aliasu jego opis.
 Aliasy mogą zastępować nazwy apletów poleceń oraz nazwy
zwykłych aplikacji.
 Definicje aliasów nie mogą obejmować parametrów – w takim
wypadku należy użyć funkcji.
 Limit aliasów 4096 (wartość zmiennej $MaximumAliasCount –
może zostać zmieniona).

Set-Alias procs Get-Process
New-Alias procs Get-Process
Set-Alias np notepad.exe
Function Temp { get-childitem c:\temp }
Polecenia zewnętrzne
Wszystkie polecenia, które nie zostaną rozpoznane jako
aliasy, nazwy apletów poleceń lub wyrażenia są
traktowane jako wywołania aplikacji zewnętrznych.
 Umożliwia to wykorzystywanie PowerShella jako
tradycyjnej powłoki, pozwalającej uruchamiać aplikacje.
 Jeżeli zamiast nazwy polecenia użyta zostanie nazwa pliku,
PowerShell korzysta z ustawień zapisanych w Rejestrze
Windows, uruchamia domyślną aplikację i otwiera w niej
dokument.
 Przy interpretowaniu wywołań, WPS przeszukuje nazwy w
następującej kolejności:

1.
2.
3.
4.
aliasy,
funkcje,
aplety poleceń,
polecenia zewnętrzne.
Potoki danych
Aplety można łączyć w kolejne stopnie
przetwarzania przy użyciu potoków.
 W przeciwieństwie do potoków interpreterów
poleceń systemu UNIX, potok PowerShella
przekazuje obiekty platformy .NET.
 Obiektowe przetwarzanie potoków zapewnia
niezależność przetwarzania elementów danych od
ich położenia w przekazywanym zbiorze
informacji.

Get-Process | Where-Object { $_.name –eq ”iexplore” |
Format-Table, Working-Set
Typy obiektów
Aplet może przekazać do potoku dowolny obiekt
.NET oraz liczby i ciągi znakowe.
 Standardem jest jednolite traktowanie klasy i
typów pierwotnych. Jednak umieszczanie w
potoku ciągu znakowego jest wyjątkiem, gdyż
dostęp do obiektów daje większe możliwości.
 Specyfikę podejścia obiektowego obrazuje praca z
liczbami. WorkingSet64 to 64-ro bitowa wartość
liczbowa, reprezentująca np. wykorzystanie
pamięci przez proces.

Get-Process | Where-Object { $_.WorkingSet64 –gt 20*1024*1024 }
Get-Process | Where-Object { $_.WorkingSet64 –gt 20MB }
ps | ? { $_.ws –gt 20MB }
Wywołania metod (1)

Obiekty .NET, oprócz właściwości mają także
metody, które można wywoływać w potoku
obiektów. Obiekty klasy
System.Diagnostics.Process mają m.in.
metodę kill().
Get-Process iexplore | Stop-Process

Możliwe jest bezpośrednie wywoływanie
metody.
Get-Process iexplore | Foreach-Object { $_.Kill() }
ps | ? { $_.name –eq ”iexplore” } | % { $_.Kill() }
Wywołania metod (2)

Poprzedni przykład działa poprawnie do momentu,
w którym w systemie są procesy Internet
Explorera. Jeśli wszystkie zostały zakończone, to
wywołania Get-Process |iexplore generuje
błąd. Stąd polecenie:
Get-Process | Where-Object { $_.Name –eq ”iexplore” } |
Stop-Process


Filtrowanie realizuje aplet Where-Object. Nie
generuje błędu w przypadku braku obiektów.
Aplet Get-Process ma opcję umożliwiającą
filtrowanie. Stąd postać:
ps –p ”iexplore” | Kill
Filtrowanie napisów



Wywołanie poleceń (ping, netstat)
przekazuje do potoku grupę ciągów
znakowych.
Każdy wiersz danych wyjściowych jest
obiektem typu System.String.
Ciągi takie można analizować przy użyciu
apletu polecenia Select-String, będącego
rodzajem filtru przekazującego na wyjście
tylko te wiersze, których treść pasuje do
podanego wzorca.
Dane wyjściowe
Aplet nie powinien formatować danych
wyjściowych samodzielnie.
 Na ekranie pojawia się wynik działania ostatniego
apletu w potoku.
 Do formatowania służą aplety:

◦ Out-Default – formatowanie standardowe, zgodne z
zapisem w konfiguracji PowerShella.
◦ Out-Host – działa podobnie jak Out-Default, ale
pozwala użyć opcji podziału na strony.
◦ Out-Null – powoduje, że dane wyjściowe nie są
wyświetlane.
◦ Format-Wide – lista dwukolumnowa.
◦ Format-List – lista szczegółowa.
◦ Format-Table – tabela.
Formatowanie standardowe



Jeżeli potoku nie kończy wywołanie funkcji
formatującej, WPS automatycznie przekazuje
dane apletowi Out-Default.
Predefiniowane formatowanie jest zapisane
w pliku DotNetTypes.Format.ps1xml, w
katalogu instalacyjnym WPS.
Stąd obiekty
System.Diagnostics.Process są
standardowo wypisywane w 8-miu
kolumnach.
Dzielenie na strony

Można wymusić przy użyciu parametru –p
apletu polecenia Out-Host.
Get-Process | Format-List | Out-Host -p
Elementy danych wyjściowych

Polecenia formatujące pozwalają wybierać
właściwości do wyświetlania:
Get-Process | Format-Table –p id, processname, workingset

Nazwy właściwości można skracać
stosując symbol wieloznaczny *:
Get-Process | Format-Table –p id, proces*, work*
Wyprowadzanie pojedynczych wartości




Aby wyświetlić ciąg znaków lub wartość
zmiennej wystarczy wpisać ciąg lub nazwę
zmiennej w wierszu poleceń.
Można w tym celu użyć apletów poleceń:
Write-Host, Write-Warn i WriteError.
Dwa ostatnie generują tekst wyróżniony.
Aplet Write-Host pozwala definiować
kolor tekstu:
Write-Host ”Hello World” –foregroundcolor red
-backgroundcolor green
Blokowanie wypisywania danych
wyjściowych
Dopóki skrypt lub okno PowerShella mają dostęp
do standardowego wyjścia, wszystkie dane
wyjściowe są wypisywane.
 Blokowanie jest możliwe na trzy sposoby:
 Użycie apletu polecenia Out-Null na końcu
potoku:

ps –p ”iexplore” | Out-Null

Zapisanie danych wyjściowych w zmiennej:
procs = ps –p ”iexplore” | Kill

Konwersja danych wyjściowych na typ [void]:
[void] ( ps –p ”iexplore” | Kill )
Inne funkcje danych wyjściowych

Aplet polecenia Out-Printer wysyła
dane do drukarki.
Get-Process | Out-Printer
Get-Process | Out-Printer ”HP LaserJet PCL6 on E02”

Aplet polecenia Out-File zapisuje dane do
pliku.
Get-Process | Out-File ”c:\temp\procesy.txt”
Get-Process | Out-File ”c:\temp\procesy.txt” -Append
Interakcje z użytkownikiem

Tekstowe dane wejściowe można
pobierać poleceniem Read-Host:
Okno InputBox
Proste okno dialogowe można wyświetlić
funkcją InputBox().
 Funkcja jest zdefiniowana w klasie .NET
Framework
Microsoft.VisualBasic.Interaction.
 Korzystanie z niej wymaga załadowania
biblioteki Microsoft.VisualBasic.dll.

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
$input = [Microsoft.VisualBasic.Interaction]::InputBox("Login")
Okno uwierzytelniania



Wyświetlanie systemowego okna
uwierzytelniania użytkownika umożliwia
aplet polecenia Get-Credential.
Aplet zwraca obiekt
System.Management.Automation.PSC
redential.
Obiekt zawiera jawnie zapisaną nazwę
użytkownika (właściwość UserName) oraz
zakodowane hasło (właściwość Password)
Analiza zawartości potoku

Do tej pory najtrudniejsze było określenie:
1. Typu obiektów, które PowerShell umieszcza w
potoku.
2. Określenie właściwości (zmiennych) oraz metod,
które posiadają te obiekty.

Standardowy opis apletu nie zawsze zawiera
odpowiedź:
Get-Help Get-Service -full

W praktyce pomocne są dwa aplety poleceń:
◦ Get-PipelineInfo
◦ Get-Member
Get-PipelineInfo
Pozwala uzyskać trzy ważne informacje o
zawartości potoku:
1. Liczba obiektów w potoku (obiekty są
ponumerowane).
2. Typy obiektów w potoku (nazwy klas
.NET).
3. Reprezentacje obiektów w postaci
ciągów znakowych.

Reprezentacja znakowa


Standardowa reprezentacja znakowa obiektu,
to wynik metody ToString() pakietu .NET.
Użyteczność wyniku działania metody zależy
od badanej klasy:
◦ W przypadku obiektów typu
System.Diagnostics.Process jest to nazwa
klasy i nazwa procesu.
◦ Konwersja obiektów
System.ServiceProcess.ServiceController
zwracanych przez aplet Get-Service() jest
bezużyteczna, gdyż wynik zawiera wyłącznie
nazwę klasy.
Get-Member
Aplet polecenia Get-Member() (alias gm) pozwala
wyświetlić nazwy klas obiektów w potoku oraz listy
ich właściwości i metod.
 Klasa .NET ma następujące elementy składowe:

◦
◦
◦
◦
◦
◦
◦

metody (Method),
właściwości (Property),
zbiory właściwości (PropertySet),
właściwości dodatkowe (NoteProperty),
właściwości skryptowe (ScriptProperty),
właściwości programowe (CodeProperty),
właściwości aliasowe (AliasPropert).
Faktycznie tylko elementy Method i Property są
składnikami klas .NET. Pozostałe to rozszerzenia
dołączane przez WPS.
Metody



To powiązana z obiektem operacja. Przykład
to metoda Kill() obiektu Process.
W wywołaniach metod nigdy nie można
pominąć znaków (). Wywołanie bez
nawiasów pozwala pobrać informacje o
metodzie, ale nie powoduje jej wywołania.
Metody mogą odczytywać wartości danych,
ustawiać je lub wykonywać inne czynności.
Właściwości



To element danych, który zawiera informacje o obiekcie lub
pozwala przekazać do niego pewne dane.
Właściwościom towarzyszą zazwyczaj pary metod, np.
get_MaxWorkingSet() i set_Max_workingSet() służące
odpowiednio do odczytywania i modyfikowania właściwości.
Dostęp do danych można uzyskać na 2 sposoby:
Get-Process | Where-Object { $_.name –eq ”iexplore” } |
Foreach-Object { $_.MaxWorkingSet }
Get-Process | Where-Object { $_.name –eq ”iexplore” } |
Foreach-Object { $_.get_MaxWorkingSet() }

Podobnie zapis:
Get-Process | Where-Object { $_.name –eq ”iexplore” } |
Foreach-Object { $_.MaxWorkingSet = 1412344}
Get-Process | Where-Object { $_.name –eq ”iexplore” } |
Foreach-Object { $_.set_MaxWorkingSet(1412344) }
Właściwości



Zbiór właściwości – to forma ich
grupowania. Np. psResources łączy w
całość właściwości związane z
wykorzystaniem zasobów.
Definicja w pliku types.ps1xml.
Zapisane w zbiorze dane można odczytać
bez podawania poszczególnych właściwości:
Get-Process | SelectObject psResources | Format-Table
Właściwości (2)


Właściwości dodatkowe – dodatkowe elementy, które nie są
właściwościami .NET ale rozszerzeniami wprowadzonymi przez
WPS.
Właściwość skryptowa – to właściwość, której wartość jest
wyznaczana, a nie przechowywana w obiekcie.
◦ Nie oznacza to jedynie obliczeń arytmetycznych.
◦ Wyznaczenie może polegać na odczytaniu wartości podobiektu.
Get-Process | Select-Object name, Product
◦ Nazwy produktu, do którego należy dany program nie ma w procesie
(nie pokaże manager zadań). Jest zapisana w pliku programu.
◦ .NET pozwala na dostęp do tej informacji za pośrednictwem
MainModule.FileversionInfo.ProductName.
Get-Process | Select-Object name, Mainmodule.FileVersionInfo.ProductName
Właściwości (3)

Właściwość programowa – jest równoważna
skryptowej, ale odpowiadający jej kod nie jest
skryptem w języku WPS. Definicje te są zapisane
w kodzie .NET.
Właściwość aliasowa – to skrócona nazwa innej
właściwości. Nie wyznacza się wartości, a jedynie
dokonuje translacji nazwy , np. z WS na
WorkingSet.
 Są zdefiniowane w pliku types.ps1xml.
 Są rozszerzeniami wprowadzonymi na poziomie
PowerShella.

Rozszerzony system typów ETS




WPS widzi wiele elementów składowych obiektów, które nie są
zdefiniowane w innych klasach. Jednocześnie niektóre elementy
dostępne w klasach .NET okazują się niedostępne. Odpowiada za
to Extended Type System PowerShella.
Ukrywanie elementów klas wynika z tego, że są one nie przydatne
lub mają lepsze odpowiedniki zapewnione przez rozszerzenia.
Rozwiązanie techniczne polega na opakowaniu każdego obiektu
umieszczanego przez aplet w potoku obiektem WPS typu
PsObject. Implementacja tej klasy decyduje o dostępności dla
następnych w potoku apletów i poleceń.
Ostatecznie zbiór elementów składowych obiektu określa się przy
użyciu:
◦ Dla niektórych klas zostały określone adaptery obiektów
(ManagementObject, DirectoryEntry, DataRow).
◦ Deklaracje w pliku types.ps1xml.
◦ Operacje dodawania elementów składowych obiektów wykonane w
trakcie pracy apletów poleceń.
◦ Operacje dodawania elementów składowych obiektów wykonane przez
aplet Add-Member.
Filtrowanie obiektów
Wynika z potrzeby wybrania do dalszego przetwarzania
pewnego podzbioru obiektów, które wykonywany aplet
przekazuje do potoku.
 Kryterium selekcji może być warunek (np. obiekty o
odpowiedniej nazwie) lub pozycja (np. pięć pierwszych).
 Operację filtrowania w oparciu o warunek realizuje
aplet polecenia Where-Object:

Get-Process | Where-Object { $_.ws –gt 1048576 }

Do filtrowania w oparciu o kolejność służy aplet
Select-Object w połączeniu z Sort-Object:
Get-Process | Sort-Object ws –desc | Where-Object –last 5
Operatory porównania
Porównanie z Porównanie bez
rozróżnianiem rozróżniania
wielkości liter wielkości liter
Znaczenie
-lt
-ilt
Mniejsze niż
-le
-ile
Mniejsze lub równe
-gt
-igt
Większe niż
-ge
-ige
Większe lub równe
-eq
-ieq
Równe
-ne
-ine
Różne
-like
-ilike
Podobieństwo ciągu
-notlike
-inotlike
Brak podobieństwa ciągu
-match
Dopasowanie do wzorca (wyrażenia
regularne)
-notmatch
Brak dopasowania do wzorca
-is
Dopasowanie typu
Operatory logiczne
Opertator
Znaczenie
-not lub !
Negacja
-and
Koniunkcja
-or
Alternatywa
Get-Process | Where-Object { $_.ws –gt 1048576 –and $_.name –eq ”firefox” }
Get-Process | Where-Object { $_.DisplayName –match ”^\w* \w*$” }
Agregacja zawartości potoku
Obiekty w potoku mogą mieć różne typy.
Przykładowo, polecenie Get-ChildItem
wykonane na systemie plików, przekazuje do
potoku obiekty FileInfo i DirectoryInfo.
 Można też połączyć dwa polecenia, które wysyłają
obiekty różnych typów do potoku:

$( Get-Process ; Get-Service )

Operacja taka ma sens tylko wtedy, gdy kolejne
polecenia potoku są w stanie wykonać operacje
na obiektach różnych typów. W innym przypadku
typ pierwszego obiektu może warunkować
sposób przetwarzania całego potoku.
$( Get-Process i* ; Get-Service i* ) | Get-PipelineInfo
Przycinanie obiektów
Przekazywane obiekty często zawierają wiele
niepotrzebnych elementów składowych.
 Odpowiednie ich odfiltrowanie pozwala
zmniejszyć wykorzystanie zasobów i zwiększyć
przejrzystość danych wyjściowych.
 Operację pozwala przeprowadzić aplet SelectObject:

Get-Process | Select-Object ProcessName, get_minWorkingSet, ws | Get-Member

Operacja przycięcia może mieć skutki uboczne:
◦ Brak właściwej nazwy klasy.
◦ Elementy składowe zostają przekształcone we
właściwości dodatkowe.
Sortowanie obiektów
Do sortowania obiektów służy aplet
polcenia Sort-Object.
 Standardowy porządek jest rosnący.
Zmiana kolejności sortowania
przełącznikiem –desc:

Get-Process | Sort-Object -desc

Domyślnie sortowanie po pierwszej
własności. Zmiana przy pomocy
przełącznika –property:
Get-process | select-object id, pm, name | sort –desc –property id
Grupowanie obiektów

Grupowanie obiektów w potoku wg
wskazanej właściwości realizuje aplet
Group-object :
Get-Service | group-Object status

Jeżeli jedynym celem jest wyświetlenie
grup i zliczanie obiektów nie jest
potrzebne, można użyć wywołania
Select-Object z parametrem –unique :
Get-ChildItem | Select-Object extension -Unique
Obliczenia



Na obiektach potoku obliczenia wykonuje
aplet Measure-Object.
Możliwe są: określenie liczności, znalezienie
wartości minimalnej lub maksymalnej, sumy,
średniej.
Wymagane jest określenie nazwy
właściwości, na której będzie wykonywana
wskazana operacja.
Get-ChildItem | Measure-object –Property length –min –max –average -sum
Wartości pośrednie
Polecenie potokowe może mieć praktycznie dowolną
długość. Można je jednak podzielić na fragmenty.
 Do przenoszenia zawartości potoku między kolejnymi
poleceniami służą zmienne.
 Zmienne w WPS wyróżnia zawsze znak $ na początku nazwy.
 Usuwanie wartości zmiennej realizuje aplet ClearVariable. Pobiera nazwę zmiennej bez znaku $.

Get-Process | Where-Object { $_.name –eq ”firefox” } |
ForEach-Object { $_.ws }
$x = Get-Process
$y = $x | Where-Object { $_.name –eq ”firefox” }
$y | ForEach-Object { $_.ws }
Porównywanie obiektów

Aplet Compare-Object pozwala
porównać zawartość dwóch potoków.
$przed = Get-Process
cmd
$po = Get-Process
Compare-Object $przed $po
Rozgałęzienia
Są wykorzystywane, jeśli wyniki pracy apletu mają
zostać przekazane dalej w potoku oraz zapisane
do zmiennej lub pliku.
 Zostały zaimplementowane w aplecie TeeObject.
 Nazwę zmiennej podaje się po przełączniku –var
i bez znaku $.
 Podanie ścieżki dostępu do pliku wymaga użycia
przełącznika –filepath.

Get-Service | Tee-Object –var a | Where-Object { $_.Status
–eq ”Running” } | Tee-Object –filepath c:\tmp\uslugi.txt
Uniwersalny model nawigacji

PowerShell implementuje niezależny od
repozytorium model nawigacji.
Podstawowe repozytoria to:
◦
◦
◦
◦

Zmienne środowiskowe (env).
Klucze Rejestru Windows (HKCU, HKCL).
Magazyn certyfikatów (cert).
Aliasy (alias), zmienne (Variable) i funkcje
PowerShell (function).
Aplet Get-ChildItem pracuje na każdym
z repozytoriów.
Rejestr systemu Windows
Praca z rejestrem nie różni się od pracy z systemem
plików.
 Przejście do klucza
HKEY_LOCAL_MACHINE\Software:

cd hklm:\software
Set-Location hklm:\software

Lista podkluczy klucza bieżącego:
Dir
Get-ChildItem

Tworzenie podklucza o nazwie IT-Vision:
md IT-Vision

Tworzenie podklucza z zawartością standardową:
New-Item –name ”Witryna” –value ”www.wszib.edu.pl” –type string
Dostawcy danych i dyski
Aplet Get-PSDrive wypisuje listę „dostawców
danych”.
 Każdy z dostawców zapewnia ujednolicony
dostęp metodami Get, Set, New, Remove.
 WPS jest wyposażony w dostęp do:

◦
◦
◦
◦
◦
◦
◦
Systemu plików.
Rejestru systemu.
Zmiennych środowiskowych.
Magazynu certyfikatów.
Funkcji PowerShella.
Zmiennych PowerShela.
Aliasów PowerShela.
Aplety poleceń do nawigacji w
repozytoriach danych
Aplet polecenia
Aliasy
Opis
Get-ChildItem
dir, ls
Lista obiektów podrzędnych
Get-Cwd
cd, pwd
Zmiana katalogu bieżącego
Get-Content
type, cat
Wywołanie zawartości elementu
New-Item
mkdir
Tworzenie elementu (gałęzi lub liścia)
Get-Location
Set-Location
Informacja o katalogu bieżącym
cd
Zmiana katalogu bieżącego
Get-Content c:\tmp\pamm.c
Ścieżki


Podstawowe symbole stosowane w zapisie
ścieżek dostępu do obiektów:
. .. ~
Get-ChildItem c:\windows\[a-dw]*.*

Aplet Test-Path sprawdza, czy ścieżka istnieje.
Zwraca wynik True lub False.
Test-Path c:\tmp

Aplet Resolve-Path analizuje symbole
wieloznaczne i wypisuje jej pełną postać:
Resolve-Path ~
Definiowanie dysków

Model nawigacji WPS przewiduje możliwość definiowania
nowych dysków, które można wykorzystać m.in. jako skróty
zastępujące długie nazwy ścieżkowe.
New-PSDrive –Name Home –PSProvider FileSystem
-Root „c:\documents and Settings\franio\”
Nowo zdefiniowany dysk jest dostępny jedynie w bieżącej
konsoli WPS i nie jest dostępny dla innych aplikacji.
 Podobnie można definiować skróty do kluczy rejestru.
 Ograniczenie liczby dysków to 4096. Można je zmienić
modyfikując zmienną $MaximumDriveCount.

Język skryptów PowerShell
System pomocy
Opisy elementów składniowych języka
skryptowego PowerShell można wypisać
podobnie jak opisy apletów poleceń.
 Nazwy dokumentów opisujących
konstrukcje języka rozpoczynają się od
słowa „About”:

Get-Help About_for
Rozdzielanie poleceń




Ogólnie jeden wiersz skryptu, to jedno
polecenie.
W wierszu można umieścić kilka poleceń
rozdzielając je znakiem ; .
Na końcu każdej linii może znajdować się
znak ; ale nie jest to wymagane.
Jeśli jedno polecenie musi zostać zapisane w
kilku wierszach, należy użyć znaku
odwróconego apostrofu ` :
Gps | `
format-list
Zmienne
Nazwy zmiennych rozpoczyna znak $.
Nazwa może zawierać litery i cyfry oraz znak _ .
Część nazw jest zarezerwowana dla zmiennych
predefiniowanych $_ .
 Określanie typu zmiennej nie jest wymagane, może
on jednak zostać zadeklarowany:



$a = 5
$a = [int] 5
$a = [System.DateTime] ”2006-01-22”
Typy WPS odpowiadają klasom .NET: typy [int],
[System.Int32] i [int32] są identyczne.
 Umieszczenie nazwy typu tuż przed wyrażeniem
przypisania trwale przypisuje typ zmiennej.

Typ zmiennej
W chwili przypisania wartości następuje
niejawne zadeklarowanie zmiennej.
 Jeśli jednak typy zmiennych nie są
deklarowane, mogą pojawić się błędy
wynikające z błędnego określania typu.
 Deklaracja ma określony zakres (skrypt,
procedura lub blok kodu).
 Deklarację można usunąć apletem
Remove-Variable.
 Zalecane użycie polecenia Set-PSDebug –
Strict.

„Szybkie typy” PowerShella
Oznaczenie
Typ
[int]
typeof (int)
[int[]]
typeof (int[])
[long]
typeof (long)
[long[]]
typeof (long[])
[string]
typeof (string)
[string[]]
typeof (string[])
[char]
typeof (char)
[char[]]
typeof (char[])
[bool]
typeof (bool)
[bool[]]
typeof (bool[])
[byte]
typeof (byte)
[double]
typeof (double)
[decimal]
typeof (decimal)
[float]
typeof (float)
„Szybkie typy” - cd
Oznaczenie
Typ
[single]
typeof (float)
[regex]
typeof (System.Text.RegularExpression.Regex)
[array]
typeof (System.Array)
[xml]
typeof (System. Xml.XmlDocument)
[scriptblock]
typeof (System. Management.Automation.SctiptBlock)
[switch]
typeof (System.Management.Automation.SwitchParameter)
[hashtable]
typeof (System.Collections.Hashtable)
[type]
typeof (System.Type)
[ref]
typeof (System. Management.Automation.PSReference)
[psobject]
typeof (System. Management.Automation.PSObject)
[wmi]
typeof (System. Management.ManagementObject)
[wmisearcher]
typeof (System. Management.ManagementObjectSearcher)
[wmiclass]
typeof (System. Management.managementClass)
Sprawdzanie typu zmiennej
Informacje o typie są dostępne niezależnie
od tego, czy typ zmiennej został jawnie
określony.
 Metoda GetType () zwraca typ zmiennej w
postaci obiektu System.Type.
 Każda zmienna WPS to obiekt klasy .NET,
więc metoda ta jest zawsze dostępna.
 Pełną nazwę (z obszarem nazw) pobieramy z
właściwości FullName, zaś krotką z Name.

Zmienne predefiniowane
To zmienne PowerShella.
 Ich właściwa nazwa to zmienne
zintegrowane lub zmienne wewnętrzne.
 Wszystkie zadeklarowane zmienne,
wewnętrzne i użytkownika można
wyświetlić poleceniem:

Get-ChildItem Variable:
dir Variable:
Zmienne predefiniowane
Funkcja
Opis
$true
Wartość „prawda”
$false
Wartość „fałsz”
$OFS
Separator stosowany przy wyświetlaniu zbioru obiektów
$Home
Katalog macierzysty użytkownika
$PSHome
Katalog macierzysty PowerShella
$Args
Parametr (przy wywołaniach funkcji)
$Input
Zawartość potoku (do użytku w funkcjach)
$_
Bieżący obiekt potoku (do użytku np. w pętlach)
$StackTrace
Bieżąca sekwencja wywołań
$Host
Informacje o „hoście” WPS
$LastExitCode
Wartość zwrócona przez ostatnio wykonany program konsoli lub
zewnętrzną aplikacje Windows
$Error
Pełna lista błędów od uruchomienia PowerShella. Ich liczbę określa
zmienna $MaximumErrorCount
Podstawianie zmiennych

Zasada podstawiania zmiennych jest stosowana
nie tylko w typowych wyrażeniach, ale również
wewnątrz ciągów znakowych. Jeżeli:
[int] $licznik = 1
[string] $Komputer = ”messy”

to zamiast:

$licznik.ToString() + ”Dostep do komputera ” + $Komputer
można
napisać:

Dostep do komputera $Komputer”
W obu ”$licznik.
przypadkach
wartość ciągu jest ta sama:
”1. Dostep do komputera messy”
Podstawianie zmiennych - cd

Z podstawiania zmiennych można korzystać w wywołaniach
apletów poleceń:
Get-DirectoryEntry (”WinNT://” + $Komputer)
Get-DirectoryEntry ”WinNT://$Komputer”

Mechanizm podstawiania zmiennych obejmuje również
obliczanie wartości wyrażeń. Po znaku $ można umieścić w
ciągu znakowym dowolne wyrażenie, którego wartość
zostanie włączona do ciągu wynikowego:
”1+3=$(1+3)”
”Godzina:
$((Get-Date).ToShortTimeString())”
 Podstawianie
zmiennych
nie zostanie przeprowadzone, jeśli
ciąg zostanie zapisany przy użyciu znaków apostrofu zamiast
cudzysłowiu:
‘$licznik. Dostep do komputera $Komputer’
Liczby







Konstruktorami wartości liczbowych mogą być literały liczby,
wyrażenia i zakresy.
Liczby szesnastkowe poprzedza się znakami 0X i można je
stosować wszędzie tam, gdzie liczby dziesiętne.
Jeżeli następuje przypisanie literału liczby do zmiennej, której
typ nie został jawnie określony, WPS tworzy obiekt typu
System.Int32.
Jeśli zakres wartości nie jest wystarczający, stosowany jest
typ Int64 lub Decimal.
Jeśli literał jest ułamkiem, WPS deklaruje typ Double lub
Decimal.
Aby przypisać zmiennej typ danych, należy poprzedzić
deklarację nazwą typu. W przypadku typu Decimal istnieje
możliwość zadeklarowania typu poprzez dodanie litery d.
Skróty KB, MB i GB pozwalają używać jednostek kilo-, megaoraz gigabajta.
Liczby pseudolosowe
Do generowania liczb pseudolosowych
służy aplet Get-Random.
 Standardowo generuje liczby typu double z
przedziału od 0 do Int32.MaxValue.
 Przedział wartości można zmienić przy
użyciu parametrów –Min i –Max.
 Istnieje możliwość wyboru wartości
losowych z danego zbioru.

Ciągi znakowe
WPS pozwala korzystać ze wszystkich
metod klasy System.String, a wtym m.in. z:
Insert(), Remove(), Replace() i Split().
 Pełną listę metod udostępnia polecenie:

”” | Get-Member –m method
Dzielenie i łączenie ciągów znakowych
Aplet polecenia Split-String umożliwia
podzielenie napisu na fragmenty w
miejscach wskazanych przez znaki.
 Odpowiednikiem jest metoda Split()
klasy System.String.
 Analogicznie, do łaczenia ciągów służy
metoda Join() oraz aplet polecenia
Join-String.

Data i godzina




Aplet polecenia Get-Date tworzy obiekt System.DateTime
klasy .NET, który zawiera bieżącą datę i godzinę.
Redukcja danych wyjściowych przy pomocy przełącznika –
displayhint :
Get-Date –displayhint date
Get-Date –displayhint time
Można obliczyć różnicę między bieżącą datą i godziną, a datą i
godziną zapisaną w zmiennej (metoda Substract() lub operator ):
(Get-Date).Substract((Get-Date ”1992-05-12 03:11:25”))
(Get-Date) – (Get-Date ”1992-05-12 03:11:25”)
Różnice czasu są tworzone jako obiekty klasy System.TimeSpan.
Można je tworzyć poleceniem New-Timespan :
$Przedzial = New-Timespan –Days 10 –Hours 7 –Minutes 6 –Seconds 2
$Teraz = Get-Date
$Koniec = $Teraz + $Przedzial
Uzupełnienie

Aplet Get-Date nie pozwala pobrać czasu
ze zdalnego komputera. Umożliwia to
klasa WMI Win32_Currenttime :
Get-Wmiobject Win32_Currenttime –computername messy

Zmianę daty i godziny umożliwia
polecenie Set-Date.
Tablice

Deklaracja tablicy następuje w momencie
przypisania zbioru wartości oddzielonych
przecinkami: $a = ”Ala ma kota”, ”misiek”, 12
$a = ,”Tylko jeden element”

Tablicę można zadeklarować jawnie używając
identyfikatora typu WPS [Array]:
[Array] $b
$b 1, 3, 6, 89
[Array] $a = ”Tylko jeden element”
[Array] $b =

Aby wykonać operacje na wszystkich elementach
tablicy, należy użyć apletu polecenia ForEachObject:
$i = 0
$b | Foreach-object { $b[i]; $i ++ }
Tablice - cd

Właściwość Count pozwala uzyskać informację o liczbie
elementów w tablicy:
$b = 1, 6, 90, 45; $b.Count

Dostęp do elementu po podaniu indeksu lub zakresu
indeksu:
$b[1..3]

Dodanie elementu do tablicy realizuje operator += :
$b += 22; $b.Count

Tablice można łączyć operatorem + :
$a = ”Jan”, ”Ala”; $c = $a + $b

Dostępne są tablice wielowymiarowe. Tworzymy ją łącząc
elementy listy w grupy, stosując znaki ( ) :
$Kompy = (”dns1”, ”172.31.1.10”, ”krakow”), ‘
(”dns2”, ”172.31.2.10”, ”wroclaw”)
Tablice asocjacyjne





To listy nazwanych elementów, zaimplementowane
jako tablice (tabele) skrótów.
Element w tablicy identyfikuje nie pozycja, ale pewna
wartość nazwana kluczem.
Tabelę skrótów tworzymy używając znaku @ oraz
listy elementów ujętych w nawiasy wąsate { }. Kolejne
elementy rozdziela średnik ; .
Każdy element składa się z nazwy i wartości,
rozdzielonych znakiem =. Nazwy nie można ująć w
cudzysłów.
Identyfikatorem typu jest [Hashtable]:
$Kompy1 = @{ dns1 = ”172.31.1.10”; dns2 = ”172.31.2.10”; `
dns3 = ”172.31.3.10”;}
[hashtable] $Kompy2 = @{ dns4 = ”172.31.4.10”; dns5 = ”172.31.5.10”; `
dns6 = ”172.31.6.10”;}
Tablice asocjacyjne - cd

Dostęp do elementu tablicy przez zastosowanie [] lub
notacji z . :
$Kompy1[”dns1”]
$Kompy2.dns4

Przypisanie wartości elementu:
$Kompy2.dns4 = ”172.31.21.10”

Istnieje możliwość generowania tabeli od listy pustej
począwszy:
$Kompy3 = @{ }
$Kompy3.dns7 = ”172.31.7.10”

Tabele skrótów można łączyć tak samo, jak zwykłe
tablice. Nazwy elementów w obu tabelach nie mogą
się powtarzać.
$Kompy309 = $Kompy1 + $Kompy2 + $Kompy3
Operatory
PWS pozwala korzystać z podstawowych
operatorów arytmetycznych: +, -, *, /, %.
 Znak + służy do dodawania, łączenia
ciągów oraz tablic.
 Znak * służy do mnożenia liczb oraz
zwielokrotniania ciągów znakowych i
tablic (oprócz tablic asocjacyjnych).

$Ciag = ”abcdefghijklmno”
$Ciag2 = $Ciag * 20; $Ciag2.Length
$Tablica = 1, 2, 3, 4, 5
$T = $Tablica * 10; $T.Count
Operatory - cd

Znak = to operator przypisania. WPS umożliwia
przypisania krzyżowe umożliwiające elegancką
formę wymiany wartości dwóch zmiennych:

$x, $ysłużyć
= $y, $x do wykonania polecenia,
Operator & może
którego nazwa jest zapisana w ciągu znakowym:

Operator & można
Invoke-Expression:
$Co = ”Process”
zastąpić
apletem
& (”Get-”+$Co)
polecenia
$Co = ”Process | Stop-Process”
Invoke-Expression(”Get-”+$Co)
Struktury sterujące

Język skryptów PowerShella PWL udostępnia
następujące struktury sterujące:
if (warunek) {…} else {…}
switch ($zmienna) {wartosc1 {….} wartosc2 {…} default {…} } }
while(warunek) {…}
do {…} while (warunek)
do {…} until (warunek)
for ( wart_pocz; warunek_konca; zmiana_wartosci ) {…}
foreach ($zmienna in $kolekcja) {…}
function nazwa {…}
break
continue
return
exit
trap błąd class {…} else {…}
throw ”informacja o błędzie”
throw obiekt błędu
Pętle
#Petla for od 1 do 5
for ( $i = 1; $i –lt 6; $i++) { $i }
#Petla while
$i = 0
while ( $i –lt 5 )
{ $i++
$i
}
#Petla foreach
$i = 1, 2, 3, 6, 7
Foreach ( $zmienna in $i ) { $zmienna }
Warunki
if ($i –lt 10)
{ ”Instrukcja wykonywane gdy wartosc i<10” }
else
{ ”Instrukcja wykonywane gdy wartosc i>=10” }
#
switch ($i)
{
1 { ”Instrukcje dla 1” }
5 { ”Instrukcje dla 5” }
7 { ”Instrukcje dla 7” }
default { „Inna liczba” }
}
Funkcje
function ParametryNieNazwane ()
{
”funkcja dostała parametry: $args[0] oraz $args[1]”
return $args[0] + $args[1]
}
#
#
function ParametryNazwane ([int] $a, [int] $b)
{
”funkcja dostała parametry: $a oraz $b”
return $a + $b
}
Przykładowy skrypt
#Odczyt z pliku tekstowego i wstawienie do tablicy napisow
#Format linii: Imie Nazwisko,login,haslo
$a = Get-Content c:\tmp\dane.txt
[Array] $tab =
$a | Foreach-Object { $d = $_.split(","); $d; $tab += $d }
$n = $tab.count
$n
for ( $i = 0; $i -lt $n; $i = $i + 3 )
{ $tab[$i]+" "+$tab[$i+1]+" "+$tab[$i+2] }
Uruchamianie skryptów




Aby uruchomić skrypt PowerShella, należy wprowadzić nazwę pliku z lub bez
rozszerzenia.
Opcjonalnie można użyć apletu polecenia Invoke-Expression lub operatora &.
Ścieżka dostępu może być względna lub bezwzględna, zależnie od tego czy katalog, w
którym znajduje się plik skryptu wchodzi w skład wartości zmiennej Path czy nie:
skrypt1
.\skrypt1
skrypt1.ps1
& skrypt1.ps1
Invoke-Expression skrypt1.ps1
Skrypt WPS można także uruchomić ze zwykłego okna wiersza poleceń :
powershell.exe skrypt1
powershell.exe .\skrypt1.ps1
powershell.exe c:\tmp\skrypt1.ps1

Skrypty WPS podlegają tym samym ograniczeniom jak skrypty WSH w zakresie kontroli
konta użytkownika.
Włączanie skryptu
Włączanie źródła kropką, to mechanizm
umożliwiający wywołanie skryptów w sposób,
który powoduje, że wszystkie zawarte w nim
definicje pozostaną dostępne dla bieżącej konsoli
WPS.
 Zatem wszystkie zadeklarowane w skrypcie
zmienne i funkcje pozostaną dostępne po
zakończeniu jego wykonywania.
 Jest to zatem prosty sposób na rozszerzanie
funkcji PowerShella.

cd c:\tmp
. .\skrypt1.ps1
Zabezpieczenia
Funkcje wykonywania skryptów w programach
Internet Explorer, Outlook czy WSH okazały się
zagrożeniem dla bezpieczeństwa systemów.
 Stąd próba użycia konsoli WPS do uruchomienia
skryptu kończy się niepowodzeniem.
 Domyślnie zasady wykonywania skryptów blokują
wykonanie jakiegokolwiek pliku.
 Pierwsze wirusy WPS powstały jeszcze przed
wprowadzeniem pierwszej wersji narzędzia.

Zasady wykonywania skryptów
Użytkownik może korzystać ze skryptów
PowerShella dopiero po obniżeniu poziomu
zabezpieczeń.
 Służy do tego aplet polecenia SetExecutionPolicy. Dostępne tryby to:

◦ Restricted – domyślny, uniemożliwia uruchomienie
jakiegokolwiek apletu.
◦ AllSigned – pozwala uruchamiać skrypty podpisane
tylko przez zaufanych wydawców.
◦ RemoteSigned – podpis zaufanego wydawcy jest
wymagany tylko dla skryptów pobieranych z Internetu
i innych zasobów sieciowych. Skrypty lokalne nie
muszą mieć podpisu.
◦ Unrestricted – można uruchamiać wszystkie skrypty.