Darmowy fragment publikacji:
Tytuł oryginału: Windows PowerShell 4.0 for .NET Developers
Tłumaczenie: Łukasz Piwko
ISBN: 978-83-283-0327-0
Copyright © Packt Publishing 2014.
First published in the English language under the title „Windows PowerShell 4.0 for .NET Developers”.
Polish edition copyright © 2015 by Helion S.A.
All rights reserved.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system,
without permission from the Publisher.
Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej
publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,
fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.
Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich
właścicieli.
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były
kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane
z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie
ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji
zawartych w książce.
Wydawnictwo HELION
ul. Kościuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (księgarnia internetowa, katalog książek)
Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/winpo4
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
Pliki z przykładami omawianymi w książce można znaleźć pod adresem:
ftp://ftp.helion.pl/przyklady/winpo4.zip
Printed in Poland.
• Kup książkę
• Poleć książkę
• Oceń książkę
• Księgarnia internetowa
• Lubię to! » Nasza społeczność
Spis tre(cid:258)ci
O autorze
Podzi(cid:218)kowania
O recenzentach
Przedmowa
Rozdzia(cid:239) 1. Podstawy Windows PowerShella
Wprowadzenie do Windows PowerShella
Konsole Windows PowerShell
Konsola Windows PowerShell
Integrated Script Environment (ISE)
Najwa(cid:285)niejsze cechy narz(cid:218)dzia Windows PowerShell
Podstawy PowerShella
Obiekty
Potokowe wykonywanie polece(cid:241)
Aliasy
Zmienne i typy danych
Operatory porównywania i logiczne
Tablice i tablice mieszaj(cid:200)ce
Sterowanie wykonywaniem skryptów
Instrukcje warunkowe
Instrukcje iteracyjne
Funkcje
Dostawcy i stacje
Zapisywanie skryptów w plikach
Komentarze
7
8
9
11
15
16
17
17
18
20
22
22
23
24
25
26
27
28
28
29
29
30
31
33
Kup książkęPoleć książkęSpis tre(cid:286)ci
Pomoc w Windows PowerShellu
Pospolite parametry PowerShella
Podsumowanie
Rozdzia(cid:239) 2. PowerShell w s(cid:239)u(cid:285)bie programisty
CIM i WMI
CIM i WMI w Windows PowerShellu
Powody przyj(cid:218)cia standardu CIM
Praca z XML
Wczytywanie plików XML
Importowanie i eksportowanie plików XML
Obiekty typu COM
Tworzenie egzemplarza obiektu COM
Automatyzacja przegl(cid:200)darki Internet Explorer
przy u(cid:285)yciu technologii COM i narz(cid:218)dzia PowerShell
Automatyzacja programu Microsoft Excel
przy u(cid:285)yciu technologii COM i narz(cid:218)dzia PowerShell
Obiekty .NET
Tworzenie obiektów .NET
Rozszerzanie obiektów .NET
Rozszerzanie typów platformy .NET
Modu(cid:239)y Windows PowerShella
Tworzenie modu(cid:239)ów Windows PowerShella
Modu(cid:239)y skryptowe
Modu(cid:239)y binarne
Modu(cid:239)y z manifestem
Modu(cid:239)y dynamiczne
Diagnostyka skryptów i obs(cid:239)uga b(cid:239)(cid:218)dów
Punkty wstrzymania
Diagnozowanie skryptów
Techniki obs(cid:239)ugi b(cid:239)(cid:218)dów
Tworzenie graficznego interfejsu u(cid:285)ytkownika w PowerShellu
Podsumowanie
Rozdzia(cid:239) 3. Zastosowanie PowerShella w codziennej administracji
Praca zdalna z Windows PowerShellem
Cztery sposoby u(cid:285)ycia funkcji pracy zdalnej
Przep(cid:239)ywy pracy w Windows PowerShellu
Tworzenie przep(cid:239)ywu pracy przy u(cid:285)yciu PowerShella
Wykonywanie przep(cid:239)ywów pracy PowerShella
Sterowanie wykonywaniem przep(cid:239)ywu pracy PowerShella
Windows PowerShell w akcji
Role i funkcje systemu Windows
Zarz(cid:200)dzanie u(cid:285)ytkownikami i grupami lokalnymi
Zarz(cid:200)dzanie serwerami sieciowymi — IIS
Windows PowerShell i SQL Server
Podsumowanie
4
33
35
36
37
38
38
40
41
41
44
44
45
45
46
48
49
49
50
52
53
53
54
58
58
59
60
61
62
64
65
67
68
68
71
72
72
75
77
77
80
83
86
91
Kup książkęPoleć książkęSpis tre(cid:286)ci
Rozdzia(cid:239) 4. PowerShell i technologie sieciowe
Polecenia sieciowe w PowerShellu
Praca z us(cid:239)ugami sieciowymi
(cid:191)(cid:200)dania sieciowe
Interfejsy API typu REST
Praca z danymi w formacie JSON
Podsumowanie
Rozdzia(cid:239) 5. Konsola PowerShell i Team Foundation Server
Narz(cid:218)dzia Power Tools dla platformy TFS
Rozpoczynanie pracy z poleceniami PowerShella dla TFS
Praca z poleceniami TFS konsoli PowerShell
Pobieranie informacji dotycz(cid:200)cych TFS
Praca z informacjami elementów pozycji TFS
Zarz(cid:200)dzanie przestrzeni(cid:200) robocz(cid:200) TFS
Zarz(cid:200)dzanie grupami zmian, zestawami od(cid:239)o(cid:285)onymi i oczekuj(cid:200)cymi zmianami
Podsumowanie
Skorowidz
93
94
94
96
98
101
103
105
106
107
109
109
110
113
114
116
117
5
Kup książkęPoleć książkęSpis tre(cid:286)ci
6
Kup książkęPoleć książkę2
PowerShell
w s(cid:239)u(cid:285)bie programisty
Narz(cid:218)dzie Windows PowerShell to rewolucyjne rozwi(cid:200)zanie w dziedzinie skryptów pow(cid:239)oki
i technik automatyzacji. I jest tak nie tylko dlatego, (cid:285)e jest to j(cid:218)zyk obiektowy dzia(cid:239)aj(cid:200)cy na
platformie .NET, ale równie(cid:285) dlatego, (cid:285)e narz(cid:218)dzie to unifikuje kilka ró(cid:285)nych narz(cid:218)dzi skrypto-
wych i automatyzacyjnych w jednym spójnym, dynamicznym mechanizmie. Przy u(cid:285)yciu jedne-
go silnika i j(cid:218)zyka mo(cid:285)na obs(cid:239)ugiwa(cid:202) ró(cid:285)ne technologie, takie jak Windows Management In-
strumentation (WMI), Common Information Model (CIM) oraz Component Object Model
(COM). Ponadto za jego pomoc(cid:200) mo(cid:285)na zbudowa(cid:202) interfejs automatyzacyjny dla tworzonych
aplikacji.
W rozdziale tym zajrzymy g(cid:239)(cid:218)biej do Windows PowerShell, aby dobrze pozna(cid:202) ró(cid:285)ne tech-
nologie, którymi mo(cid:285)na zarz(cid:200)dza(cid:202) za pomoc(cid:200) tego narz(cid:218)dzia, nauczy(cid:202) si(cid:218) tego robi(cid:202) oraz po-
zna(cid:202) bardziej zaawansowane techniki pisania skryptów, bazuj(cid:200)c na posiadanych ju(cid:285) umiej(cid:218)tno-
(cid:258)ciach programistycznych.
W tym rozdziale omawiam nast(cid:218)puj(cid:200)ce tematy:
(cid:81) Podstawy WMI, CIM, COM oraz XML
(cid:81) Rozszerzanie funkcjonalno(cid:258)ci narz(cid:218)dzia Windows PowerShell przy u(cid:285)yciu
technologii .NET, COM, XML oraz WMI
(cid:81) Modu(cid:239)y Windows PowerShella
(cid:81) Tworzenie modu(cid:239)ów Windows PowerShella
(cid:81) Debugowanie skryptów i obs(cid:239)uga b(cid:239)(cid:218)dów
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
CIM i WMI
CIM to otwarty standard zdefiniowany przez Distributed Management Task Force (DMTF)
w ramach inicjatywy Web-Based Enterprise Management (WBEM). Standard CIM okre(cid:258)la
rozszerzalny model danych opisuj(cid:200)cy, przetwarzaj(cid:200)cy i pozyskuj(cid:200)cy charakterystyczne informacje
o zarz(cid:200)dzanych zasobach, takich jak sk(cid:239)adniki sprz(cid:218)towe i oprogramowanie. CIM jest obiekto-
wym modelem programowania niezale(cid:285)nym od produkcji, co znaczy, (cid:285)e mo(cid:285)na zarz(cid:200)dza(cid:202) ró(cid:285)-
nymi zasobami od ró(cid:285)nych dostawców przy u(cid:285)yciu tylko standardu CIM. Natomiast WMI jest
implementacj(cid:200) standardu CIM firmy Microsoft, wprowadzon(cid:200) w systemie Windows 2000,
aby umo(cid:285)liwi(cid:202) zarz(cid:200)dzanie wszystkimi sk(cid:239)adnikami programowymi i sprz(cid:218)towymi systemu.
CIM i WMI w Windows PowerShellu
W Windows PowerShellu 2.0 zaimplementowano kilka polece(cid:241) umo(cid:285)liwiaj(cid:200)cych wykorzysta-
nie WMI jako warstwy po(cid:258)redniej mi(cid:218)dzy u(cid:285)ytkownikiem ko(cid:241)cowym (administratorem sys-
temu i programist(cid:200)) a CIM. Pó(cid:283)niej, w Windows PowerShellu 3.0, wprowadzono bezpo(cid:258)red-
ni(cid:200) obs(cid:239)ug(cid:218) standardu CIM w postaci dodatkowych polece(cid:241) w systemach Windows Server
2012 i Windows 8, dzi(cid:218)ki czemu u(cid:285)ytkownicy narz(cid:218)dzia PowerShell mog(cid:200) bezpo(cid:258)rednio
ujawnia(cid:202) schemat i model danych CIM.
Aby wy(cid:258)wietli(cid:202) list(cid:218) polece(cid:241) dla WMI i CIM, nale(cid:285)y u(cid:285)y(cid:202) polecenia Get-Command z parame-
trem -Name przefiltrowanym przez wieloznacznik i parametrem -Type przefiltrowanym przez
argument cmdlet powoduj(cid:200)cy pobranie tylko polece(cid:241), z pomini(cid:218)ciem funkcji i aliasów. Opisane
polecenie jest pokazane poni(cid:285)ej:
# Wy(cid:286)wietla list(cid:266) wszystkich polece(cid:276) dotycz(cid:261)cych WMI
PS C:\ Get-Command *WMI* -Type Cmdlet
CommandType Name ModuleName
----------- ---- ----------
Cmdlet Get-WmiObject Microsoft.PowerShell.Management
Cmdlet Invoke-WmiMethod Microsoft.PowerShell.Management
Cmdlet Register-WmiEvent Microsoft.PowerShell.Management
Cmdlet Remove-WmiObject Microsoft.PowerShell.Management
Cmdlet Set-WmiInstance Microsoft.PowerShell.Management
# Wy(cid:286)wietla list(cid:266) wszystkich polece(cid:276) dotycz(cid:261)cych CIM
PS C:\ Get-Command *CIM* -Type Cmdlet
CommandType Name ModuleName
----------- ---- ----------
Cmdlet Get-CimAssociatedInstance CimCmdlets
Cmdlet Get-CimClass CimCmdlets
Cmdlet Get-CimInstance CimCmdlets
Cmdlet Get-CimSession CimCmdlets
Cmdlet Invoke-CimMethod CimCmdlets
Cmdlet New-CimInstance CimCmdlets
Cmdlet New-CimSession CimCmdlets
Cmdlet New-CimSessionOption CimCmdlets
38
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
Cmdlet Register-CimIndicationEvent CimCmdlets
Cmdlet Remove-CimInstance CimCmdlets
Cmdlet Remove-CimSession CimCmdlets
Cmdlet Set-CimInstance CimCmdlets
A teraz przyjrzyj si(cid:218) obu tym listom. Zauwa(cid:285)y(cid:239)e(cid:258) pewn(cid:200) prawid(cid:239)owo(cid:258)(cid:202)? Niektóre polecenia
CIM s(cid:200) podobne do polece(cid:241) WMI, co w (cid:258)wietle wcze(cid:258)niejszej informacji, (cid:285)e WMI jest im-
plementacj(cid:200) CIM, nie powinno by(cid:202) (cid:285)adnym zaskoczeniem.
Mimo (cid:285)e obie listy polece(cid:241) wygl(cid:200)daj(cid:200) prawie tak samo, mo(cid:285)na zauwa(cid:285)y(cid:202), (cid:285)e polecenia z listy
CIM maj(cid:200) wi(cid:218)cej parametrów i (cid:285)e jest ich wi(cid:218)cej, dzi(cid:218)ki czemu mo(cid:285)na przy ich u(cid:285)yciu uzy-
ska(cid:202) wi(cid:218)cej informacji.
CIM i WMI reprezentuj(cid:200) dostarczone informacje w postaci przestrzeni nazw i klas. Na przy-
k(cid:239)ad istnieje klasa dla BIOS o nazwie Win32_BIOS i inna klasa dla systemu operacyjnego o na-
zwie Win32_OperatingSystem. Istniej(cid:200) te(cid:285) klasy, których nazwy zaczynaj(cid:200) si(cid:218) od znaku _, w rodzaju
_NAZWAKLASY na wewn(cid:218)trzny u(cid:285)ytek systemu operacyjnego oraz CIM_NAZWAKLASY dla pewnych
podstawowych klas, ale najcz(cid:218)(cid:258)ciej u(cid:285)ywane s(cid:200) klasy o nazwach typu Win32_NAZWAKLASY.
Je(cid:258)li nie znasz nazwy klasy lub chcesz obejrze(cid:202) list(cid:218) klas dost(cid:218)pnych w swoim systemie, mo(cid:285)esz
u(cid:285)y(cid:202) polecenia Get-WmiObject -List lub Get-CimClass.
# Wy(cid:286)wietla list(cid:266) dost(cid:266)pnych klas przy u(cid:298)yciu WMI
PS C:\ Get-WmiObject –Class * -List
# Wy(cid:286)wietla list(cid:266) dost(cid:266)pnych klas przy u(cid:298)yciu CIM
PS C:\ Get-CimClass –ClassName *
Win32_CurrentTime
Win32_LocalTime
Win32_OperatingSystem
Win32_Process
Win32_ComputerSystem
Win32_BIOS
Win32_SoftwareElement
(...)
# Porównuje liczby klas pobranych przez oba polecenia
PS C:\ (Get-WmiObject -List).count -eq (Get-CimClass).count
True
Po znalezieniu potrzebnej klasy nale(cid:285)y utworzy(cid:202) jej egzemplarz, aby pobra(cid:202) dostarczane przez
ni(cid:200) informacje. W tym celu mo(cid:285)na u(cid:285)y(cid:202) polecenia Get-WmiObject lub Get-CimInstance, podaj(cid:200)c
nazw(cid:218) klasy jako parametr.
# Tworzy egzemplarz klasy przy u(cid:298)yciu WMI
PS C:\ Get-WmiObject -Class Win32_BIOS
# Tworzy egzemplarz klasy przy u(cid:298)yciu CIM
PS C:\ Get-CimInstance -ClassName Win32_BIOS
39
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
SMBIOSBIOSVersion : 8BET59WW (1.39 )
Manufacturer : LENOVO
Name : Default System BIOS
SerialNumber : R9T081V
Version : LENOVO – 1390
Ponadto zamiast nazwy klasy mo(cid:285)na u(cid:285)y(cid:202) parametru -Query, aby wykona(cid:202) predefiniowane za-
pytanie WMI napisane w j(cid:218)zyku WMI Query Language (WQL).
# Tworzy zapytanie WQL odczytuj(cid:261)ce dane z klasy Win32_NetworkAdapter
PS C:\ $Query = Select * From Win32_NetworkAdapter Where Name like Intel
# Wykonuje zapytanie WQL przy u(cid:298)yciu WMI
PS C:\ Get-WmiObject -Query $Query | Select DeviceID, Name
# Wykonuje zapytanie WQL przy u(cid:298)yciu CIM
PS C:\ Get-CimInstance -Query $Query | Select DeviceID, Name
DeviceID Name
-------- ----
0 Intel(R) 82579LM Gigabit Network Connection
2 Intel(R) Centrino(R) Ultimate-N 6300 AGN
W podobny sposób mo(cid:285)na usun(cid:200)(cid:202) egzemplarz klasy. Polecenia Remove-WmiObject i Remove-
(cid:180)CimInstance s(cid:239)u(cid:285)(cid:200) do usuwania obiektów, a polecenia Set-WmiInstance i Set-CimInstance do
ich modyfikowania. Poni(cid:285)ej znajduje si(cid:218) przyk(cid:239)ad pobrania informacji o wybranym folderze
w instancji WMI i usuni(cid:218)cia go za pomoc(cid:200) polece(cid:241) Get-WmiObject i Remove-WmiObject.
# Pobiera folder o nazwie myOldBackup
$folder = Get-WmiObject -Class Win32_Directory -Filter Name= D:\\myOldBackup
# Usuwa ten folder
$folder | Remove-WmiObject
Inne ciekawe polecenia to Register-CimIndicationEvent i Register-WmiEvent. Za ich pomoc(cid:200)
mo(cid:285)na wykona(cid:202) pewne dzia(cid:239)ania w bloku skryptowym PowerShella w reakcji na wyst(cid:200)pienie
pewnych zdarze(cid:241) WMI lub CMI. Przyk(cid:239)adowo mo(cid:285)na wys(cid:239)a(cid:202) powiadomienie o tym, (cid:285)e stopie(cid:241)
wykorzystania procesora przekroczy(cid:239) 85 albo (cid:285)e jaka(cid:258) us(cid:239)uga przesta(cid:239)a dzia(cid:239)a(cid:202).
Powody przyj(cid:218)cia standardu CIM
Wiedz(cid:200)c, czym s(cid:200) WMI i CIM, i po przeanalizowaniu paru podobnych polece(cid:241) z obu tech-
nologii pewnie si(cid:218) zastanawiasz, po co w ogóle wprowadzono nowe polecenia CIM i dlaczego
kto(cid:258) mia(cid:239)by ich u(cid:285)ywa(cid:202), skoro dost(cid:218)pne w poprzednich wersjach Windows PowerShella pole-
cenia WMI s(cid:200) równie dobre.
Aby rozwia(cid:202) Twoje w(cid:200)tpliwo(cid:258)ci i unikn(cid:200)(cid:202) dyskusji filozoficznych, poni(cid:285)ej przedstawiam list(cid:218)
zalet CIM w punktach:
40
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
(cid:81) Jest to otwarty standard, co oznacza, (cid:285)e nie jest on zarezerwowany tylko dla
systemu Windows, dzi(cid:218)ki czemu za pomoc(cid:200) CIM mo(cid:285)na zarz(cid:200)dza(cid:202) tak(cid:285)e innymi
dostawcami i producentami.
(cid:81) Do zdalnego zarz(cid:200)dzania CIM u(cid:285)ywa protoko(cid:239)u WS-Management (WS-MAN),
dzi(cid:218)ki czemu mo(cid:285)na pracowa(cid:202) z ka(cid:285)dym zdalnym serwerem i urz(cid:200)dzeniem
zawieraj(cid:200)cym implementacj(cid:218) tego protoko(cid:239)u. Natomiast za pomoc(cid:200) WMI mo(cid:285)na
zarz(cid:200)dza(cid:202) tylko systemem Windows za po(cid:258)rednictwem protoko(cid:239)u DCOM.
(cid:81) CIM mo(cid:285)na u(cid:285)ywa(cid:202) z urz(cid:200)dzeniami zgodnymi z Open Management
Infrastructure (OMI).
Wi(cid:218)cej informacji na temat OMI znajduje si(cid:218) w artykule dost(cid:218)pnym pod adresem http://blogs.technet.com/b/
windowsserver/archive/2012/06/28/open-management-infrastructure.aspx.
(cid:81) Za pomoc(cid:200) CIM mo(cid:285)na zarz(cid:200)dza(cid:202) ka(cid:285)dym komputerem i urz(cid:200)dzeniem z systemem
operacyjnym zgodnym z CIM Object Manager (CIMOM), niezale(cid:285)nie od dostawcy.
W zwi(cid:200)zku z tym przy u(cid:285)yciu CIM mo(cid:285)na zarz(cid:200)dza(cid:202) zarówno systemami
operacyjnymi Windows, jak i innymi.
Praca z XML
Przetwarzanie i zapisywanie danych w formacie XML jest jedn(cid:200) z najcz(cid:218)(cid:258)ciej wykonywanych
czynno(cid:258)ci przez programistów. PowerShell zawiera wbudowane narz(cid:218)dzie do obs(cid:239)ugi formatu
XML, przy u(cid:285)yciu którego praca z plikami w tym formacie jest (cid:239)atwa i nie wymaga pisania
du(cid:285)ej ilo(cid:258)ci kodu. To wystarczy, aby u(cid:285)ywa(cid:202) konsoli PowerShell na co dzie(cid:241) do pracy z danymi
w formacie XML.
Wczytywanie plików XML
Pliki XML mo(cid:285)na wczytywa(cid:202) w konsoli PowerShell na dwa sposoby: za pomoc(cid:200) polecenia
Get-Content lub Select-Xml z zapytaniami XPath.
Polecenie Get-Content
Aby za(cid:239)adowa(cid:202) plik i odczyta(cid:202) jego zawarto(cid:258)(cid:202), mo(cid:285)na u(cid:285)y(cid:202) polecenia Get-Content. S(cid:239)u(cid:285)y ono
do (cid:239)adowania tre(cid:258)ci ze zwyk(cid:239)ych plików tekstowych i XML, które równie(cid:285) s(cid:200) tekstowe, ale za-
wieraj(cid:200) dane o okre(cid:258)lonej strukturze.
# Wczytuje zawarto(cid:286)(cid:252) pliku za pomoc(cid:261) polecenia
PS C:\ Get-Content C:\Employees.xml
41
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
Polecenie to wczyta zawarto(cid:258)(cid:202) pliku XML jako zwyk(cid:239)y tekst. Aby konsola potraktowa(cid:239)a t(cid:218) tre(cid:258)(cid:202)
jako dane w formacie XML, nale(cid:285)y dokona(cid:202) rzutowania wyniku polecenia Get-Content albo
zapisa(cid:202) go w zmiennej o (cid:258)ci(cid:258)le okre(cid:258)lonym typie XML, jak zosta(cid:239)o pokazane poni(cid:285)ej:
# Rzutowanie wyników
$employee = [xml](Get-Content D:\Employees.xml)
# Zapisanie wyniku w zmiennej typu XML
[xml] $employees = Get-Content D:\Employees.xml
Zmiennym o (cid:258)ci(cid:258)le okre(cid:258)lonym typie, np. [xml] $employees, mo(cid:285)na przypisywa(cid:202) tylko obiekty
typu System.Xml.XmlDocument. Inaczej nast(cid:200)pi zg(cid:239)oszenie b(cid:239)(cid:218)du.
Poni(cid:285)ej znajduje si(cid:218) przyk(cid:239)adowa tre(cid:258)(cid:202) pliku Employees.xml:
staff
branch location= cairo
employee
Name Sherif Talaat /Name
Role IT /Role
/employee
/branch
/staff
Za(cid:239)adowany plik XML zawiera informacje dotycz(cid:200)ce pracowników ró(cid:285)nych dzia(cid:239)ów firmy. Jego
tre(cid:258)(cid:202) jest ju(cid:285) zapisana w zmiennej $employees, której mo(cid:285)na u(cid:285)ywa(cid:202) w normalny sposób, tak
jak u(cid:285)ywa si(cid:218) wszystkich obiektów obs(cid:239)uguj(cid:200)cych XML. Pokazuje to poni(cid:285)szy przyk(cid:239)ad:
# Odczytuje w(cid:266)z(cid:225)y potomne dokumentów XML
PS C:\ $employees.staff.ChildNodes
location employee
-------- --------
cairo {Sherif Talaat, Raymond Elias}
redmond {Bill Gates, Steve Jobs}
# Pobiera informacje z atrybutów w(cid:266)z(cid:225)ów
PS C:\ $employees.staff.branch.Get_Attributes()
#text
-----
cairo
Redmond
# Pobiera warto(cid:286)ci atrybutów wg nazw atrybutów
PS C:\ $employees.staff.branch. location
cairo
Redmond
# Zmienia warto(cid:286)(cid:252) atrybutu
PS C:\ $employees.staff.branch[0]. location
42
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
= Seattle
# Zmienia i modyfikuje jeden w(cid:266)ze(cid:225)
PS C:\ $employees.staff.branch.employee
Name Role
---- ----
Sherif Talaat IT
Raymond Elias In(cid:285)ynier
PS C:\ $emp = $employees.staff.branch.employee[0]
PS C:\ $emp.Role = PowerShell Guru
PS C:\ $employees.SelectNodes( //employee[Name= Sherif Talaat ] )
Name Role
---- ----
Sherif Talaat PowerShell Guru
# Dodaje nowy w(cid:266)ze(cid:225)
PS C:\ $newemployee = $employees.CreateElement( employee )
PS C:\ $newemployee.set_InnerXML( Name Ahmad Mofeed /
Name Role Security Consultant /Role )
PS C:\ $employees.staff.branch[0].AppendChild($newemployee)
PS C:\ $employees.staff.branch[0].employee
Name Role
---- ----
Sherif Talaat PowerShell Guru
Raymond Elias In(cid:285)ynier
Ahmad Mofeed Security Consultant
Polecenie Select-Xml
Innym sposobem za(cid:239)adowania zawarto(cid:258)ci pliku XML do PowerShella jest u(cid:285)ycie polecenia
Select-Xml, za pomoc(cid:200) którego mo(cid:285)na wpisa(cid:202) bezpo(cid:258)redni(cid:200) (cid:258)cie(cid:285)k(cid:218) do pliku z dodatkiem za-
pyta(cid:241) XPath s(cid:239)u(cid:285)(cid:200)cych do pobrania okre(cid:258)lonych danych i w(cid:218)z(cid:239)a, jak zosta(cid:239)o pokazane poni(cid:285)ej:
#Get data from XML file using XPath query
PS C:\ Select-Xml -Path D:\Employees.xml -XPath staff/branch/
employee
Node Path Pattern
---- ---- -------
employee D:\Employees.xml staff/branch/employee
employee D:\Employees.xml staff/branch/employee
employee D:\Employees.xml staff/branch/employee
43
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
Polecenie to pobiera w(cid:218)z(cid:239)y XML za pomoc(cid:200) zapytania XPath. Wynikiem jest obiekt w(cid:218)z(cid:239)ów bez
warto(cid:258)ci. Aby rozwin(cid:200)(cid:202) te w(cid:218)z(cid:239)y i wypisa(cid:202) ich warto(cid:258)ci, nale(cid:285)y u(cid:285)y(cid:202) polecenia Select-Object
z parametrem -ExpandProperty.
PS C:\ Select-Xml -Path D:\Employees.xml -XPath staff/branch/
employee | Select-Object -ExpandProperty Node
Name Role
---- ----
Sherif Talaat IT
Raymond Elias In(cid:285)ynier
Bill Gates Programista
Importowanie i eksportowanie plików XML
W PowerShellu znajduje si(cid:218) te(cid:285) kilka polece(cid:241) przeznaczonych specjalnie do pracy z danymi
w formacie XML. S(cid:200) to polecenia Export-CliXml, s(cid:239)u(cid:285)(cid:200)ce do eksportowania obiektów do plików
XML, oraz Import-CliXml, s(cid:239)u(cid:285)(cid:200)ce do importowania i (cid:239)adowania wcze(cid:258)niej wyeksportowanych
za pomoc(cid:200) PowerShella plików, jak w poni(cid:285)szym przyk(cid:239)adzie:
# Eksportuje obiekt do pliku XML
PS C:\ Get-Service | Export-Clixml D:\Services.xml
# Importuje obiekt z pliku XML
PS C:\ Import-Clixml D:\Services.xml -First 5
Status Name DisplayName
------ ---- -----------
Running AdobeARMservice Adobe Acrobat Update Service
Stopped AeLookupSvc Application Experience
Stopped ALG Application Layer Gateway Service
Running AppIDSvc Application Identity
Running Appinfo Application Information
Ponadto istnieje jeszcze polecenie ConvertTo-Xml, które dzia(cid:239)a podobnie jak Export-CliXml
pod tym wzgl(cid:218)dem, (cid:285)e tak jak ono tworzy reprezentacj(cid:218) jednego lub wi(cid:218)kszej liczby obiektów
w formacie XML. Jedyna ró(cid:285)nica mi(cid:218)dzy nimi polega na tym, (cid:285)e Export-CliXml zapisuje kod
XML w pliku, a ConvertTo-Xml zwraca obiekt XML, który mo(cid:285)na przekaza(cid:202) na wej(cid:258)cie innego
polecenia.
Obiekty typu COM
W PowerShellu mo(cid:285)na pracowa(cid:202) tak(cid:285)e z obiektami typu COM. W tym podrozdziale obja(cid:258)niam
sposób dzia(cid:239)ania technologii COM w PowerShellu na bazie dwóch przyk(cid:239)adów dotycz(cid:200)cych
przegl(cid:200)darki Internet Explorer i programu Microsoft Excel.
44
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
Tworzenie egzemplarza obiektu COM
Aby utworzy(cid:202) obiekt COM, nale(cid:285)y u(cid:285)y(cid:202) polecenia New-Object z parametrem -ComObject i ar-
gumentem ProgID reprezentuj(cid:200)cym przyjazn(cid:200) nazw(cid:218) klasy COM u(cid:285)yt(cid:200) podczas rejestracji
klasy. Zatem ostatecznie ca(cid:239)e polecenie powinno wygl(cid:200)da(cid:202) tak:
# Tworzy nowy obiekt COM
PS C:\ $com = New-Object –ComObject ProgID
Automatyzacja przegl(cid:200)darki Internet Explorer
przy u(cid:285)yciu technologii COM i narz(cid:218)dzia PowerShell
Jak napisa(cid:239)em powy(cid:285)ej, do utworzenia egzemplarza aplikacji potrzebny jest argument ProgID.
W przypadku przegl(cid:200)darki Internet Explorer warto(cid:258)(cid:202) tego argumentu to InternetExplorer.
(cid:180)Application. Maj(cid:200)c te informacje, mo(cid:285)emy utworzy(cid:202) obiekt COM Internet Explorera i roz-
pocz(cid:200)(cid:202) z nim prac(cid:218).
Pierwsz(cid:200) czynno(cid:258)ci(cid:200) jest utworzenie obiektu za pomoc(cid:200) polecenia New-Object i zapisanie go
dla wygody w zmiennej o nazwie $ie.
# Tworzy nowy obiekt klasy COM IE
PS C:\ $ie = New-Object -ComObject InternetExplorer.Application
Nast(cid:218)pnie mo(cid:285)na zdefiniowa(cid:202) w(cid:239)asno(cid:258)ci utworzonego egzemplarza. W przypadku Internet
Explorera nale(cid:285)y zdefiniowa(cid:202) wysoko(cid:258)(cid:202) i szeroko(cid:258)(cid:202) okna, jego widoczno(cid:258)(cid:202), adres URL itd.
$ie.navigate( about:blank )
$ie.height = 800
$ie.width = 1200
$ie.visible = $true
Wi(cid:218)cej informacji na temat obiektowego modelu Internet Explorera znajduje si(cid:218) na stronie http://msdn.
microsoft.com/en-us/library/ms970456.aspx.
Powy(cid:285)szy kod spowoduje uruchomienie okna przegl(cid:200)darki IE z pust(cid:200) stron(cid:200). Czy to wszyst-
ko, co mo(cid:285)emy zrobi(cid:202) z t(cid:200) przegl(cid:200)dark(cid:200)? Oczywi(cid:258)cie, (cid:285)e nie. Jest wiele ciekawszych mo(cid:285)liwo-
(cid:258)ci. Teraz napiszemy kod przeszukuj(cid:200)cy witryn(cid:218) outlook.com, znajduj(cid:200)cy pola tekstowe adresu
i has(cid:239)a, wstawiaj(cid:200)cy w nich dane i klikaj(cid:200)cy przycisk Zaloguj.
Najpierw wy(cid:258)wietlimy pro(cid:258)b(cid:218) o wpisanie adresu e-mail i has(cid:239)a za pomoc(cid:200) polecenia Read-Host.
$EmailAddress = Read-Host -Prompt Wpisz nazw(cid:218) konta Microsoft...
Dla has(cid:239)a nale(cid:285)y doda(cid:202) parametr -AsSecureString, aby zamiast wpisywanych liter w polu po-
jawia(cid:239)y si(cid:218) gwiazdki i aby has(cid:239)o zosta(cid:239)o zapisane w zaszyfrowanej zmiennej.
$Password = Read-Host -AsSecureString -Prompt Wpisz has(cid:239)o...
45
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
Okno z polem do wpisania has(cid:239)a powinno wygl(cid:200)da(cid:202) tak:
Nast(cid:218)pnie utworzymy obiekt COM i zdefiniujemy jego w(cid:239)asno(cid:258)ci. Tym razem zamiast pustej
strony otworzymy stron(cid:218) outlook.com.
$ie = New-Object -ComObject InternetExplorer.Application
$ie.height = 800
$ie.width = 1200
$ie.navigate( http://outlook.com )
$ie.visible = $true
Aby skrypt poprawnie zadzia(cid:239)a(cid:239), przed wykonaniem nast(cid:218)pnego polecenia nale(cid:285)y si(cid:218) upewni(cid:202),
czy strona jest ju(cid:285) w pe(cid:239)ni za(cid:239)adowana.
while($ie.Busy){Start-Sleep -Milliseconds 500}
Teraz przegl(cid:200)damy znajduj(cid:200)ce si(cid:218) na stronie elementy, pola tekstowe i przyciski i wstawiamy
do nich otrzymane od u(cid:285)ytkownika warto(cid:258)ci. Do przegl(cid:200)dania elementów strony internetowej
mo(cid:285)na u(cid:285)ywa(cid:202) narz(cid:218)dzi programistycznych przegl(cid:200)darki Internet Explorer uruchamianych za
pomoc(cid:200) klawisza F12.
$doc = $ie.document
$tbUsername = $doc.getElementByID( i0116 )
$tbUsername.value = $EmailAddress
$tbPassword = $doc.getElementByID( i0118 )
$tbPassword.value = $Password
$btnSubmit = $doc.getElementByID( idSIButton9 )
Na koniec wywo(cid:239)ujemy zdarzenie Click na przycisku Zaloguj.
$btnSubmit.Click();
Teraz powiniene(cid:258) widzie(cid:202) swoj(cid:200) skrzynk(cid:218) odbiorcz(cid:200). Ciekawe, prawda?
Automatyzacja programu Microsoft Excel
przy u(cid:285)yciu technologii COM i narz(cid:218)dzia PowerShell
Innym popularnym zastosowaniem technologii COM jest automatyzacja programów z pa-
kietu Microsoft Office. W tym podrozdziale pokazuj(cid:218), jak pracowa(cid:202) z klas(cid:200) COM programu
Microsoft Excel, ale wszystkie wskazówki w równym stopniu dotycz(cid:200) tak(cid:285)e programów Word,
Access, Outlook itd.
46
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
W ramach przyk(cid:239)adu utworzymy raport na podstawie arkusza kalkulacyjnego Excel (pokazany
na poni(cid:285)szym zrzucie ekranu) przedstawiaj(cid:200)cego aktualny stan wszystkich us(cid:239)ug systemu
Windows. Wyznaczony cel w poni(cid:285)szym przyk(cid:239)adowym kodzie osi(cid:200)gniemy przy u(cid:285)yciu interfejsu
COM programu Excel Excel.Application.
Pierwsz(cid:200) czynno(cid:258)ci(cid:200) jest utworzenie egzemplarza Excel.Application.
$Excel = New-Object -ComObject Excel.Application
W tym momencie w Windowsie powinien zosta(cid:202) ju(cid:285) uruchomiony proces Excela, ale samo
okno programu stanie si(cid:218) widoczne dopiero po ustawieniu jego widoczno(cid:258)ci.
$Excel.visible = $True
Nast(cid:218)pnie musimy utworzy(cid:202) skoroszyt i doda(cid:202) do niego jeden arkusz kalkulacyjny.
$ExcelWB = $Excel.Workbooks.Add()
$ExcelWS = $ExcelWB.Worksheets.Item(1)
Po przygotowaniu podstawowych sk(cid:239)adników mo(cid:285)emy przyst(cid:200)pi(cid:202) do wype(cid:239)niania arkusza da-
nymi. Najpierw w pierwszym wierszu zapiszemy tytu(cid:239) raportu.
$ExcelWS.Cells.Item(1,1) = Raport o stanie us(cid:239)ug
$ExcelWS.Range( A1 , B1 ).Cells.Merge()
47
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
Nast(cid:218)pnie w drugim wierszu utworzymy nag(cid:239)ówek tabeli sk(cid:239)adaj(cid:200)cy si(cid:218) z dwóch kolumn: Na-
zwa us(cid:239)ugi i Stan us(cid:239)ugi.
$ExcelWS.Cells.Item(2,1) = Nazwa us(cid:239)ugi
$ExcelWS.Cells.Item(2,2) = Stan us(cid:239)ugi
Pó(cid:283)niej za pomoc(cid:200) polecenia Get-Service pobierzemy list(cid:218) wszystkich us(cid:239)ug dzia(cid:239)aj(cid:200)cych
w systemie Windows i za pomoc(cid:200) p(cid:218)tli ForEach utworzymy dla ka(cid:285)dej z nich po jednym wier-
szu w arkuszu.
$row = 3
ForEach($Service in Get-Service)
{
$ExcelWS.Cells.Item($row,1) = $Service.DisplayName
$ExcelWS.Cells.Item($row,2) = $Service.Status.ToString()
if($Service.Status -eq Running )
{
$ExcelWS.Cells.Item($row,1).Font.ColorIndex = 10
$ExcelWS.Cells.Item($row,2).Font.ColorIndex = 10
}
Elseif($Service.Status -eq Stopped )
{
$ExcelWS.Cells.Item($row,1).Font.ColorIndex = 3
$ExcelWS.Cells.Item($row,2).Font.ColorIndex = 3
}
$row++
}
Na koniec zapisujemy raport i zamykamy instancj(cid:218) programu Excel.
$ExcelWS.SaveAs( D:\ServicesStatusReport.xlsx )
$Excel.Quit()
Wi(cid:218)cej informacji na temat interfejsu COM programu Excel znajduje si(cid:218) na stronie http://msdn.microsoft.
com/en-us/library/microsoft.office.interop.excel.application.aspx.
Obiekty .NET
W rozdziale 1. opisa(cid:239)em, co (cid:239)(cid:200)czy narz(cid:218)dzie Windows PowerShell i platform(cid:218) .NET, a tak(cid:285)e
pokaza(cid:239)em ró(cid:285)ne sposoby adaptacji tej platformy w PowerShellu. W tym podrozdziale posze-
rzymy wiadomo(cid:258)ci na temat obiektów .NET w PowerShellu.
48
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
Tworzenie obiektów .NET
Do tworzenia obiektów .NET najcz(cid:218)(cid:258)ciej u(cid:285)ywa si(cid:218) polecenia New-Object, które ma podobne
dzia(cid:239)anie jak operator new w takich j(cid:218)zykach jak C#. Tak, napisa(cid:239)em „najcz(cid:218)(cid:258)ciej”, bo mo(cid:285)na te(cid:285)
rzutowa(cid:202) obiekt PowerShella na .NET w sposób pokazany w rozdziale 1. Polecenia New-Object
u(cid:285)ywa si(cid:218) do tworzenia zarówno obiektów .NET, jak i COM, ale w tym drugim przypadku
nale(cid:285)y poda(cid:202) inne parametry.
PS C:\ $date = New-Object -TypeName System.DateTime -ArgumentList 2013,10,24
PS C:\ $date
24 pa(cid:283)dziernika 2013 00:00:00
Typ obiektu mo(cid:285)na zdefiniowa(cid:202) bezpo(cid:258)rednio, bez u(cid:285)ycia parametru -TypeName, poniewa(cid:285) jest
to parametr pozycyjny, a wi(cid:218)c taki, którego nazw(cid:218) mo(cid:285)na opu(cid:258)ci(cid:202).
PS C:\ $string = New-Object System.String -ArgumentList PowerShell jest super!
PS C:\ $string
PowerShell jest super!
W tym przyk(cid:239)adzie utworzyli(cid:258)my za pomoc(cid:200) polecenia New-Object dwa obiekty .NET typów
DateTime i String oraz przekazali(cid:258)my warto(cid:258)ci do konstruktora przy u(cid:285)yciu parametru
-ArgumentList.
Kod ten jest równowa(cid:285)ny z poni(cid:285)szym:
PS C:\ [datetime] $date = 2013/10/24
PS C:\ [string] $string = PowerShell jest super!
Rozszerzanie obiektów .NET
Egzemplarze obiektów .NET mo(cid:285)na rozszerza(cid:202) o w(cid:239)asne w(cid:239)asno(cid:258)ci i sk(cid:239)adowe, które dodaje
si(cid:218) za pomoc(cid:200) polecenia Add-Member.
Poni(cid:285)ej znajduje si(cid:218) przyk(cid:239)ad dodania za pomoc(cid:200) polecenia Add-Member sk(cid:239)adowej NoteProperty
do istniej(cid:200)cego obiektu. W tym przypadku (cid:239)adujemy plik XML w obiekcie xml, a nast(cid:218)pnie
dodajemy do niego sk(cid:239)adow(cid:200) typu NoteProperty o nazwie Description, w której wpisujemy
opis zawarto(cid:258)ci pliku.
#Load XML file
PS C:\ [xml] $xml = Get-Content D:\Employees.xml
#Add new NoteProperty Member using Add-Member
PS C:\ Add-Member -InputObject $xml -MemberType NoteProperty -Name
Description -Value Baza danych pracowniczych
#Show the new added member
49
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
PS C:\ $xml | Get-Member -MemberType NoteProperty | fl
TypeName : System.Xml.XmlDocument
Name : Description
MemberType : NoteProperty
Definition : System.String Description=Employees information database
W drugim przyk(cid:239)adzie poka(cid:285)(cid:218), jak doda(cid:202) w(cid:239)asn(cid:200) metod(cid:218) typu ScriptMethod, która b(cid:218)dzie wy-
konywa(cid:239)a blok skryptowy na obiekcie array. Metod(cid:218) t(cid:218) nazwiemy Censored() i b(cid:218)dzie ona
sprawdza(cid:239)a tekst i zast(cid:218)powa(cid:239)a nieprzyzwoite s(cid:239)owa gwiazdkami:
# Tworzy tablic(cid:266) adresów URL
PS C:\ $websites = @( facebook.com , twitter.com , google.com , xxx.com )
# Dodaje do obiektu tablicowego now(cid:261) sk(cid:225)adow(cid:261) typu ScriptMethod
PS C:\ Add-Member -InputObject $websites -MemberType ScriptMethod -Name
Censored -Value {$this -replace xxx , *** }
# Wykonuje nowo dodan(cid:261) metod(cid:266)
PS C:\ $websites.Censored()
facebook.com
twitter.com
google.com
***.com
Wi(cid:218)cej informacji na temat typów sk(cid:239)adowych znajduje si(cid:218) w artykule na stronie http://msdn.microsoft.
com/en-us/library/windows/desktop/system.management.automation.psmembertypes(v=vs.85).aspx.
Rozszerzanie typów platformy .NET
W Windows PowerShellu mo(cid:285)na definiowa(cid:202) typy (klasy) platformy .NET, aby móc pó(cid:283)niej
tworzy(cid:202) ich obiekty za pomoc(cid:200) polecenia New-Object. Typy te mo(cid:285)na definiowa(cid:202) w plikach
z kodem (cid:283)ród(cid:239)owym, plikach z(cid:239)o(cid:285)e(cid:241), a nawet przy u(cid:285)yciu (cid:258)ródliniowego kodu w j(cid:218)zykach C#,
VB oraz JScript.
Definiowanie typu obiektów przy u(cid:285)yciu (cid:258)ródliniowej klasy C#
Poni(cid:285)ej znajduje si(cid:218) przyk(cid:239)ad utworzenia nowego typu obiektów ze (cid:258)ródliniowej klasy w j(cid:218)zy-
ku C#. Najpierw zosta(cid:239)a utworzona prosta klasa reprezentuj(cid:200)ca kalkulator zawieraj(cid:200)ca cztery
metody odpowiadaj(cid:200)ce czterem dzia(cid:239)aniom arytmetycznym. Nast(cid:218)pnie za pomoc(cid:200) polecenia
Add-Type dodamy t(cid:218) klas(cid:218) do bie(cid:285)(cid:200)cej sesji PowerShella. Na koniec utworzymy nowy obiekt
tej klasy za pomoc(cid:200) polecenia New-Object.
PS C:\ $myCalc = @”
public class PSCalc
{
public int Add(int x, int y) {return x + y;}
50
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
public int Subtract(int x, int y) {return x – y;}
public int Multiply(int x, int y) {return x * y;}
public int Divid(int x, int y) {return x / y;}
}
”@
PS C:\ Add-Type –TypeDefinition $myCalc
PS C:\ $op = New-Object PSCalc
Teraz przy u(cid:285)yciu obiektu $op mo(cid:285)na wykona(cid:202) dowoln(cid:200) ze zdefiniowanych w klasie metod.
PS C:\ $op.Multiply(4,8)
32
Ciekawe jest to, (cid:285)e mo(cid:285)na nawet wywo(cid:239)ywa(cid:202) statyczne metody klas bezpo(cid:258)rednio w Po-
werShellu. Na przyk(cid:239)ad klasa System.Math zawiera wiele metod statycznych, z których jedna
nazywa si(cid:218) Pow() i s(cid:239)u(cid:285)y do obliczania pot(cid:218)g. Aby wywo(cid:239)a(cid:202) j(cid:200) w PowerShellu, nale(cid:285)y napisa(cid:202)
nast(cid:218)puj(cid:200)ce polecenie:
PS C:\ [System.Math]::Pow(2,4)
Definiowanie typów obiektowych przy u(cid:285)yciu nazwy z(cid:239)o(cid:285)enia lub pliku
Innym sposobem zdefiniowania nowego typu obiektowego jest u(cid:285)ycie nazwy z(cid:239)o(cid:285)enia (prze-
strzeni nazw) lub pliku z(cid:239)o(cid:285)enia (DLL) i wykonanie polecenia New-Object.
Poni(cid:285)ej znajduje si(cid:218) przyk(cid:239)ad dodania nowego typu przy u(cid:285)yciu nazwy z(cid:239)o(cid:285)enia:
PS C:\ $form = New-Object System.Windows.Forms
New-Object : Cannot find type [System.Windows.Forms]: verify that the assembly
(cid:180)containing this type is loaded.
At line:1 char:8
+ $form = New-Object System.Windows.Forms
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidType: (:) [New-Object],
(cid:180)PSArgumentException
+ FullyQualifiedErrorId :
TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
Próbowali(cid:258)my utworzy(cid:202) za pomoc(cid:200) polecenia New-Object (cid:258)ci(cid:258)le typowan(cid:200) ogóln(cid:200) kolekcj(cid:218), ale
program zg(cid:239)osi(cid:239) b(cid:239)(cid:200)d, poniewa(cid:285) konsoli PowerShell nie uda(cid:239)o si(cid:218) znale(cid:283)(cid:202) z(cid:239)o(cid:285)enia zawieraj(cid:200)-
cego ten typ. Rozwi(cid:200)zaniem jest za(cid:239)adowanie odpowiedniego z(cid:239)o(cid:285)enia.
PS C:\ Add-Type -AssemblyName System.Windows.Forms
Ponadto zamiast u(cid:285)ywa(cid:202) parametru -AssemblyName mo(cid:285)emy za(cid:239)adowa(cid:202) klasy prosto z pliku
DLL przy u(cid:285)yciu parametru -Path.
PS C:\ Add-Type -Path D:\myApp\program.dll
51
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
Modu(cid:239)y Windows PowerShella
Modu(cid:239)y w Windows PowerShellu s(cid:239)u(cid:285)(cid:200) do porz(cid:200)dkowania i pakowania skryptów i plików z kodem
w nadaj(cid:200)ce si(cid:218) do wielokrotnego u(cid:285)ytku paczki. Dost(cid:218)pnych jest du(cid:285)o wbudowanych modu(cid:239)ów
zawieraj(cid:200)cych polecenia dotycz(cid:200)ce prawie wszystkich ról i funkcji Windows Servera. Na przy-
k(cid:239)ad istnieje modu(cid:239) dla mened(cid:285)era serwerów, Hyper-V, Active Directory oraz IIS.
Aby wy(cid:258)wietli(cid:202) list(cid:218) wszystkich modu(cid:239)ów zainstalowanych w systemie operacyjnym, nale(cid:285)y
wykona(cid:202) polecenie Get-Module z parametrami -ListAvailable.
PS C:\ Get-Module -ListAvailable | Select Name,Version,ModuleType
Name Version ModuleType
---- ------- ----------
AppLocker 2.0.0.0 Manifest
AssignedAccess 1.0.0.0 Script
BitLocker 1.0.0.0 Manifest
Dism 2.0 Script
DnsClient 1.0.0.0 Manifest
Hyper-V 1.1 Binary
(...)
Z tego wynika, (cid:285)e istnieje wiele ró(cid:285)nych rodzajów modu(cid:239)ów PowerShella. Omówi(cid:239)em je w na-
st(cid:218)pnym podrozdziale, w którym pokazuj(cid:218), jak si(cid:218) tworzy nowe modu(cid:239)y.
Aby móc u(cid:285)y(cid:202) jakiegokolwiek modu(cid:239)u — niewa(cid:285)ne, czy wbudowanego czy zewn(cid:218)trznego —
nale(cid:285)y go zaimportowa(cid:202) do sesji PowerShella za pomoc(cid:200) polecenia Import-Module Nazwa-
(cid:180)Modu(cid:239)u .
#Import Hyper-V and AppLocker modules
PS C:\ Import-Module –Name Hyper-V,AppLocker
Je(cid:258)li importowany modu(cid:239) znajduje si(cid:218) w domy(cid:258)lnym katalogu modu(cid:239)ów konsoli, to jako ar-
gument wystarczy wpisa(cid:202) tylko jego nazw(cid:218). Ale je(cid:258)li importowany jest modu(cid:239) z innego katalo-
gu, nale(cid:285)y poda(cid:202) pe(cid:239)n(cid:200) (cid:258)cie(cid:285)k(cid:218). Ponadto, je(cid:285)eli u(cid:285)ywasz wersji PowerShell ISE 3.0 lub nowszej
i wpiszesz nazw(cid:218) polecenia znajduj(cid:200)cego si(cid:218) w module, to odpowiedni modu(cid:239) zostanie za(cid:239)a-
dowany automatycznie.
Aby wy(cid:258)wietli(cid:202) domy(cid:258)lne (cid:258)cie(cid:285)ki modu(cid:239)ów, nale(cid:285)y u(cid:285)y(cid:202) zmiennej (cid:258)rodowiskowej $env:PSModulePath.
Mo(cid:285)na te(cid:285) doda(cid:202) (cid:258)cie(cid:285)k(cid:218) do w(cid:239)asnych modu(cid:239)ów: $env:PSModulePath += ; C:\MyModules .
Wi(cid:218)cej informacji na temat PSModulePath znajduje si(cid:218) na stronie http://msdn.microsoft.com/en-us/
library/dd878326(v=vs.85).aspx.
52
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
Tworzenie modu(cid:239)ów Windows PowerShella
W tym podrozdziale przedstawiam opisy i przyk(cid:239)ady tworzenia ró(cid:285)nych rodzajów modu(cid:239)ów.
Modu(cid:239)y skryptowe
Modu(cid:239) skryptowy to plik PowerShella z rozszerzeniem psm1 i kod zawieraj(cid:200)cym funkcje,
zmienne oraz aliasy.
Tworzenie modu(cid:239)u rozpoczniemy od napisania dwóch prostych funkcji (jedna b(cid:218)dzie sumo-
wa(cid:202), a druga odejmowa(cid:202) dwie liczby) i dla ka(cid:285)dej z nich utworzymy alias. Nast(cid:218)pnie zapiszemy
skrypt w pliku o rozszerzeniu psm1. Nazwa pliku b(cid:218)dzie stanowi(cid:202) nazw(cid:218) modu(cid:239)u przy jego
importowaniu.
Function Add-Numbers($x,$y)
{
$x + $y
}
Function Subtract-Numbers($x,$y)
{
$x - $y
}
New-Alias -Name an -Value Add-Numbers
New-Alias -Name sn -Value Subtract-Numbers
# Eksportuje sk(cid:225)adowe modu(cid:225)u
Export-ModuleMember -Function * -Alias *
Pewnie zauwa(cid:285)y(cid:239)e(cid:258) na ko(cid:241)cu tego kodu nowe polecenie Export-ModuleMember. S(cid:239)u(cid:285)y ono do
znajdowania typów PowerShella, to znaczy funkcji, aliasów i zmiennych, i ich eksportowania jako
sk(cid:239)adowych modu(cid:239)u podczas importowania tego modu(cid:239)u za pomoc(cid:200) polecenia Import-Module.
PS C:\ Import-Module D:\myModules\ScriptModule.psm1 -Force
Podczas importowania tego modu(cid:239)u zostanie wy(cid:258)wietlone nast(cid:218)puj(cid:200)ce ostrze(cid:285)enie:
WARNING: The names of some imported commands from the module
ScriptModule include unapproved verbs that might make them less discoverable.
To find the commands with unapproved verbs, run the Import-Module command
again with the Verbose parameter. For a list of approved verbs, type Get-Verb.
(OSTRZE(cid:191)ENIE: Nazwy niektórych zaimportowanych polece(cid:241) z modu(cid:239)u
ScriptModule zawieraj(cid:200) niezatwierdzone czasowniki, przez które mo(cid:285)e by(cid:202) trudno
je wykry(cid:202). Aby znale(cid:283)(cid:202) polecenia zawieraj(cid:200)ce niezatwierdzone czasowniki,
ponownie wykonaj polecenie Import-Module z parametrem Verbose. List(cid:218)
zatwierdzonych czasowników mo(cid:285)na wy(cid:258)wietli(cid:202), wykonuj(cid:200)c polecenie Get-Verb).
53
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
Ostrze(cid:285)enie to zostanie wy(cid:258)wietlone z powodu u(cid:285)ycia niestandardowego (niezatwierdzonego)
czasownika w nazwie funkcji. Nie ma to wp(cid:239)ywu na dzia(cid:239)anie funkcji, ale dla zapewniania spój-
no(cid:258)ci zaleca si(cid:218) u(cid:285)ywanie standardowych czasowników.
List(cid:218) zatwierdzonych czasowników i ich kategorii mo(cid:285)na wy(cid:258)wietli(cid:202) za pomoc(cid:200) polecenia
Get-Verb. Ponadto mo(cid:285)na wy(cid:239)(cid:200)czy(cid:202) pojawianie si(cid:218) tego ostrze(cid:285)enia, dodaj(cid:200)c prze(cid:239)(cid:200)cznik -Disable
(cid:180)NameChecking.
Za(cid:239)adowany modu(cid:239) mo(cid:285)na znale(cid:283)(cid:202) za pomoc(cid:200) polecenia Get-Module.
PS C:\ Get-Module ScriptModule | fl
Name : scriptmodule
Path : D:\scriptmodule.psm1
ModuleType : Script
Version : 0.0
NestedModules : {}
ExportedFunctions : {Add-Numbers, Subtract-Numbers}
ExportedCmdlets :
ExportedVariables :
ExportedAliases : {an, sn}
Modu(cid:239)y binarne
Modu(cid:239) binarny to plik DLL zawieraj(cid:200)cy skompilowany kod, np. klas polece(cid:241) i dostawców.
Bardzo dobrym przyk(cid:239)adem tego rodzaju modu(cid:239)ów s(cid:200) modu(cid:239)y wbudowane PowerShella.
PS C:\ Get-Module –Name Microsoft.PowerShell.* | Select Name,NestedModules
Tworzenie modu(cid:239)u binarnego
W tym podrozdziale poka(cid:285)(cid:218) Ci krok po kroku, jak utworzy(cid:202) modu(cid:239) binarny. W odró(cid:285)nieniu od
innych modu(cid:239)ów modu(cid:239)y binarne tworzy si(cid:218) w (cid:258)rodowisku Microsoft Visual Studio. Utworzymy
modu(cid:239) o nazwie MyBinaryModule zawieraj(cid:200)cy dwa polecenia: Get-EvenOrOdd, przyjmuj(cid:200)ce tablic(cid:218)
liczb ca(cid:239)kowitych i sprawdzaj(cid:200)ce warto(cid:258)ci parzyste i nieparzyste, oraz Validate-EmailAddress,
przyjmuj(cid:200)ce (cid:239)a(cid:241)cuch i sprawdzaj(cid:200)ce, czy ma poprawny format adresu e-mail.
Prac(cid:218) nale(cid:285)y zacz(cid:200)(cid:202) od utworzenia projektu biblioteki klas w Visual Studio. Nazwa tej biblioteki
b(cid:218)dzie pó(cid:283)niej nazw(cid:200) modu(cid:239)u, wi(cid:218)c w polu Name (nazwa) wpiszemy MyBinaryModule (jak na
zrzucie ekranu na nast(cid:218)pnej stronie), chocia(cid:285) je(cid:258)li wolisz co(cid:258) innego, to nie mam nic przeciwko
temu.
Nast(cid:218)pnie dodajemy odwo(cid:239)anie do g(cid:239)ównej przestrzeni nazw Windows PowerShella, czyli
System.Management.Automation.
54
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
Plik DLL System.Management.Automation znajduje si(cid:218) w katalogu C:\Windows\Assembly\GAC_MSIL\
System.Management.Automation\1.0.0.0__31bf3856ad364e35.
55
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
Teraz wszystko powinno by(cid:202) gotowe do rozpocz(cid:218)cia pisania polece(cid:241) w j(cid:218)zyku C#. Aby zazna-
czy(cid:202), (cid:285)e tworzymy klas(cid:218) polece(cid:241) PowerShella, musimy doda(cid:202) jej atrybut [Cmdlet()]. Atrybut
ten zawiera nazw(cid:218) klasy z(cid:239)o(cid:285)on(cid:200) z dwóch s(cid:239)ów: czasownika i rzeczownika. Ponadto klasa polecenia
cmdlet powinna by(cid:202) wyprowadzona z klasy bazowej Cmdlet, która zawiera trzy metody wirtualne
wywo(cid:239)ywane przez system wykonawczy: BeginProcessing(), ProcessRecord() i EndProcessing().
W klasie musi by(cid:202) zdefiniowana przynajmniej jedna z tych metod.
[Cmdlet(VerbsCommon.Get, EvenOrOdd )]
public class EvenorOdd: Cmdlet
{
protected override void ProcessRecord()
{
base.ProcessRecord();
}
}
Ponadto w klasie mo(cid:285)na zdefiniowa(cid:202) parametr za pomoc(cid:200) atrybutu [Parameter()].
[Parameter(Position = 0,
ValueFromPipeline = true,
ValueFromPipelineByPropertyName = true,
HelpMessage = @ Zakres liczb do sprawdzenia. )]
public int[] Numbers
{
get { return num; }
set { num = value; }
}
private int[] num;
Nad atrybutem [Parameter()] mo(cid:285)na zdefiniowa(cid:202) atrybut [Validate*()], s(cid:239)u(cid:285)(cid:200)cy do sprawdze-
nia poprawno(cid:258)ci argumentów tego parametru. Przyk(cid:239)adowo mo(cid:285)na zdefiniowa(cid:202) zbiór trzech
dopuszczalnych warto(cid:258)ci dla parametru PersonName:
[ValidateSet( Gates , Jobs , Ballmer )]
[Parameter(Position = 0, Mandatory = true)]
public string PersonName
{
get { return personName; }
set { personName = value; }
}
private string personName;
Mo(cid:285)na te(cid:285) doda(cid:202) metody WriteVerbose() i WriteDebug(), aby podczas wykonywania polecenia
umo(cid:285)liwi(cid:202) wy(cid:258)wietlanie danych diagnostycznych za pomoc(cid:200) prze(cid:239)(cid:200)czników -Debug i -Verbose.
Ponadto za pomoc(cid:200) metody WriteObject() zwracamy wynik dzia(cid:239)ania polecenia.
Wi(cid:218)cej informacji o g(cid:239)ównej przestrzeni nazw PowerShella znajduje si(cid:218) na stronie http://msdn.microsoft.com/
en-us/library/System.Management.Automation(v=vs.85).aspx.
56
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
Uko(cid:241)czony kod (cid:283)ród(cid:239)owy powinien wygl(cid:200)da(cid:202) tak, jak na poni(cid:285)szym zrzucie ekranu:
Teraz trzeba skompilowa(cid:202) projekt do postaci binarnego modu(cid:239)u. W Visual Studio nale(cid:285)y w tym
celu klikn(cid:200)(cid:202) polecenie Build-Build Solution (kompilacja-kompiluj rozwi(cid:200)zanie). Po zako(cid:241)czeniu
kompilacji w podfolderze projektu bin/debug pojawi si(cid:218) plik o nazwie MyBinaryModule.dll.
Gratulacje, w(cid:239)a(cid:258)nie utworzy(cid:239)e(cid:258) pierwszy binarny modu(cid:239). Przejd(cid:283) do konsoli PowerShell i zaim-
portuj go za pomoc(cid:200) polecenia Import-Module.
PS C:\ Import-Module D:\MyBinaryModule\MyBinaryModule.dll
PS C:\ Get-Command -Module MyBinaryModule | Select CommandType, Name
CommandType Name
----------- ----
Cmdlet Get-EvenOrOdd
Cmdlet Validate-EmailAddress
# U(cid:298)ycie polecenia Validate-EmailAddress
PS C:\ Validate-EmailAddress -EmailAddress sherif@xyz -Verbose
VERBOSE: Validating Email Address: sherif@xyz
False
57
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
PS C:\ Validate-EmailAddress -EmailAddress sherif@xyz.com
True
# U(cid:298)ycie polecenia Get-EvenOrOdd
PS C:\Users\v-shta Get-EvenOrOdd -Numbers @(2,5,13,17,24,33)
2 to liczba parzysta
5 to liczba nieparzysta
13 to liczba nieparzysta
(...)
Modu(cid:239)y z manifestem
Modu(cid:239) z manifestem to modu(cid:239) zawieraj(cid:200)cy plik z danymi PowerShella, -manifest- (.psd1), opi-
suj(cid:200)cymi sk(cid:239)adniki i zawarto(cid:258)(cid:202) oraz sposób przetwarzania modu(cid:239)u. Plik modu(cid:239)u z manifestem
mo(cid:285)e zawiera(cid:202) jeden lub wi(cid:218)cej zagnie(cid:285)d(cid:285)onych modu(cid:239)ów skryptowych lub binarnych.
Manifest jest plikiem tekstowym zawieraj(cid:200)cym informacje o module, np. kto go utworzy(cid:239),
w jakiej firmie powsta(cid:239), ogólny opis dzia(cid:239)ania, jakie pliki trzeba do(cid:239)(cid:200)czy(cid:202), jakie z(cid:239)o(cid:285)enia trzeba
za(cid:239)adowa(cid:202), najstarsza obs(cid:239)ugiwana wersja PowerShella oraz najstarsza obs(cid:239)ugiwana wersja
platformy .NET. W wi(cid:218)kszo(cid:258)ci przypadków plik manifestu jest niepotrzebny, chyba (cid:285)e chce
si(cid:218) wyeksportowa(cid:202) z(cid:239)o(cid:285)enie zainstalowane w globalnym buforze z(cid:239)o(cid:285)e(cid:241), u(cid:285)y(cid:202) funkcji pomocy
z mo(cid:285)liwo(cid:258)ci(cid:200) aktualizacji lub ustawi(cid:202) pewne ograniczenia.
Aby utworzy(cid:202) manifest dla modu(cid:239)u, nale(cid:285)y za pomoc(cid:200) polecenia New-ModuleManifest utworzy(cid:202)
pusty szablon manifestu, który nast(cid:218)pnie mo(cid:285)na otworzy(cid:202) i zmodyfikowa(cid:202) w dowolnym edyto-
rze tekstu. Ponadto dane manifestu mo(cid:285)na zdefiniowa(cid:202) podczas tworzenia szablonu. W tym
celu nale(cid:285)y u(cid:285)y(cid:202) parametrów polecenia New-ModuleManifest.
New-ModuleManifest -Author Sherif Talaat -CompanyName Packt Publishing -
(cid:180)ModuleVersion 1.0 -ProcessorArchitecture Amd64 -PowerShellVersion 3.0 -
(cid:180)PowerShellHostName ConsoleHost, Windows PowerShell ISE Host -Description
(cid:180) Mój pierwszy manifest modu(cid:239)u -FileList myScriptModule.psm1 -ModuletoProcess
(cid:180) Bitlocker -Path D:\Modules\myScriptModule\myScriptModule.psd1
Na nast(cid:218)pnej stronie zrzut ekranu przedstawia przyk(cid:239)adow(cid:200) zawarto(cid:258)(cid:202) pliku manifestu.
Modu(cid:239)y dynamiczne
Modu(cid:239) dynamiczny to modu(cid:239), który nie jest przechowywany na dysku twardym, lecz w pa-
mi(cid:218)ci, i zostaje usuni(cid:218)ty po zako(cid:241)czeniu sesji dzia(cid:239)ania konsoli. Tego rodzaju modu(cid:239)y mo(cid:285)na
tworzy(cid:202) z funkcji i bloków skryptowych w sesji. S(cid:200) one przydatne programistom pos(cid:239)uguj(cid:200)cym
si(cid:218) technikami obiektowymi oraz administratorom, którzy chc(cid:200) wykonywa(cid:202) wybrane modu(cid:239)y
na zdalnych komputerach przy u(cid:285)yciu narz(cid:218)dzi PowerShella do pracy zdalnej.
58
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
Do tworzenia modu(cid:239)ów dynamicznych u(cid:285)ywa si(cid:218) polecenia New-Module z parametrami -Function
i -ScriptBlock. Za pomoc(cid:200) tych parametrów okre(cid:258)la si(cid:218) funkcje i bloki skryptowe, które maj(cid:200)
si(cid:218) znale(cid:283)(cid:202) w danym module.
# Tworzy dynamiczny modu(cid:225) z jedn(cid:261) funkcj(cid:261)
PS C:\ New-Module -ScriptBlock {Function Send-Greetings($name){ Dzie(cid:241) dobry,
$name }}
# Uruchamia funkcj(cid:266)
PS C:\ Send-Greetings –name Sherif
Dzie(cid:241) dobry, Sherif
Diagnostyka skryptów i obs(cid:239)uga b(cid:239)(cid:218)dów
W poprzednim rozdziale napisa(cid:239)em, (cid:285)e w PowerShellu mo(cid:285)na diagnozowa(cid:202) zarówno lokalne,
jak i zdalne skrypty. Funkcja diagnostyczna w PowerShellu dzia(cid:239)a podobnie jak w innych j(cid:218)zy-
kach programowania. Mo(cid:285)na ustawia(cid:202) punkty wstrzymania, wykonywa(cid:202) funkcje krok po kroku,
przeskakiwa(cid:202) instrukcje, a nawet wywo(cid:239)ywa(cid:202) stos. W konsoli PowerShella funkcje diagnostyczne
obs(cid:239)uguje si(cid:218) za pomoc(cid:200) polece(cid:241), a w PowerShell ISE (cid:650) za pomoc(cid:200) graficznego interfejsu
u(cid:285)ytkownika i polece(cid:241).
59
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
Narz(cid:218)dzia do diagnostyki w PowerShell ISE znajduj(cid:200) si(cid:218) w menu Debug (diagnostyka), któ-
rego zawarto(cid:258)(cid:202) wida(cid:202) na poni(cid:285)szym zrzucie:
Ponadto konsola Windows PowerShell zawiera zestaw polece(cid:241), za pomoc(cid:200) których mo(cid:285)na prze-
prowadzi(cid:202) diagnostyk(cid:218) skryptu bez u(cid:285)ywania graficznego interfejsu u(cid:285)ytkownika. Polecenia te
s(cid:200) bardzo przydatne, gdy u(cid:285)ywa si(cid:218) systemu Windows Server Core, w którym brak PowerShell
ISE. Wszystkie te polecenia s(cid:239)u(cid:285)(cid:200) do zarz(cid:200)dzania punktami wstrzymania w skryptach.
PS C:\ Get-Command -Name *Breakpoint | Select Name
Name
----
Disable-PSBreakpoint
Enable-PSBreakpoint
Get-PSBreakpoint
Remove-PSBreakpoint
Set-PSBreakpoint
Oprócz polece(cid:241) PSBreakpoint mo(cid:285)na u(cid:285)ywa(cid:202) jeszcze paru dodatkowych polece(cid:241), które s(cid:200) do-
st(cid:218)pne wy(cid:239)(cid:200)cznie w trybie diagnostycznym.
Punkty wstrzymania
Punkt wstrzymania jest wyznaczonym w kodzie (cid:283)ród(cid:239)owym miejscem, w którym program
powinien wstrzyma(cid:202) dzia(cid:239)anie i w(cid:239)(cid:200)czy(cid:202) diagnostyk(cid:218). W Windows PowerShellu dost(cid:218)pne s(cid:200)
trzy rodzaje punktów wstrzymania, które mo(cid:285)na w(cid:239)(cid:200)cza(cid:202) i wy(cid:239)(cid:200)cza(cid:202) za pomoc(cid:200) polecenia Set-
(cid:180)PSBreakpoint:
(cid:81) Punkt wstrzymania na wybranym wierszu (cid:650) wykonywanie skryptu zatrzymuje
si(cid:218) na wyznaczonym wierszu kodu. Punkty wstrzymania tego typu definiuje si(cid:218)
przez podanie numeru wiersza i przy u(cid:285)yciu prze(cid:239)(cid:200)cznika -Line.
PS C:\ Set-PSBreakpoint –script c:\myscript.ps1 –Line 7
60
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
(cid:81) Punkt wstrzymania na zmiennej (cid:650) wykonywanie skryptu zatrzymuje si(cid:218) po
zmianie warto(cid:258)ci okre(cid:258)lonej zmiennej. Punkty wstrzymania tego typu definiuje si(cid:218)
przez podanie nazwy zmiennej bez znaku $ i przy u(cid:285)yciu prze(cid:239)(cid:200)cznika -Variable.
PS C:\ Set-PSBreakpoint –script c:\myscript.ps1 –Variable
Services
(cid:81) Punkt wstrzymania na poleceniu (cid:650) wykonywanie skryptu zatrzymuje si(cid:218) przed
rozpocz(cid:218)ciem wykonywania okre(cid:258)lonego polecenia. Poleceniem mo(cid:285)e by(cid:202) polecenie
cmdlet lub nazwa utworzonej przez programist(cid:218) funkcji. Punkty wstrzymania tego
typu definiuje si(cid:218) przez podanie nazwy polecenia i przy u(cid:285)yciu prze(cid:239)(cid:200)cznika -Command.
PS C:\ Set-PSBreakpoint –script c:\myscript.ps1 –Command GetProcess
Zdefiniowali(cid:258)my w naszym skrypcie trzy punkty wstrzymania, ka(cid:285)dy innego typu. Wszystkie
punkty wstrzymania ustawione w skrypcie mo(cid:285)na wy(cid:258)wietli(cid:202) za pomoc(cid:200) polecenia Get-
(cid:180)PSBreakpoint.
PS C:\ Get-PSBreakpoint –Script myscript.ps1
ID Script Line Command Variable
-- ------ ---- ------- --------
11 myscript.ps1 7
12 myscript.ps1 Services
13 myscript.ps1 Get-Process
Do usuwania punktów wstrzymania s(cid:239)u(cid:285)y polecenie Remove-PSBreakpoint, ale mo(cid:285)na te(cid:285) je tylko
czasowo wy(cid:239)(cid:200)cza(cid:202) przy u(cid:285)yciu polecenia Disable-PSBreakpoint. Czasowo wy(cid:239)(cid:200)czony punkt
wstrzymania mo(cid:285)na z powrotem w(cid:239)(cid:200)czy(cid:202) za pomoc(cid:200) polecenia Enable-PSBreakpoint.
# Wy(cid:225)(cid:261)cza punkty wstrzymania na zmiennej
Get-PSBreakpoint -Variable Services | Disable-PSBreakpoint
# W(cid:225)(cid:261)cza punkty wstrzymania na zmiennej
Get-PSBreakpoint -Variable Services | Enable-PSBreakpoint
# Usuwa punkty wstrzymania na zmiennej
Get-PSBreakpoint -Variable Services | Remove-PSBreakpoint
Diagnozowanie skryptów
Po zdefiniowaniu punktów wstrzymania skrypt mo(cid:285)na uruchomi(cid:202) w normalny sposób. Gdy
program dojdzie do pierwszego punktu, wy(cid:258)wietli stosown(cid:200) informacj(cid:218). Od tej pory na pocz(cid:200)t-
ku wiersza polece(cid:241), przed napisem PS C:\ , b(cid:218)dzie si(cid:218) znajdowa(cid:239) znacznik [DBG]: informu-
j(cid:200)cy, (cid:285)e aktywny jest tryb diagnostyczny. Tryb ten pozostanie w(cid:239)(cid:200)czony, a(cid:285) wy(cid:239)(cid:200)czy si(cid:218) debuger
za pomoc(cid:200) klawiszy Shift+F5.
61
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
W trybie diagnostycznym mo(cid:285)na prowadzi(cid:202) normaln(cid:200) diagnostyk(cid:218) programu za pomoc(cid:200) pole-
ce(cid:241) wymienionych w poni(cid:285)szej tabeli:
Czynno(cid:258)(cid:202)
Wkroczenie
Wyj(cid:258)cie
Pomini(cid:218)cie
Kontynuacja
Wy(cid:258)wietlenie listy
Zatrzymanie
Pobranie stosu wywo(cid:239)a(cid:241)
Polecenie
StepInto
StepOut
StepOver
Continue
List
Quit
Get-PSCallStack
Skrót
S
O
V
C
L
Q
K
Kiedy(cid:258) w Windows PowerShellu mo(cid:285)na by(cid:239)o diagnozowa(cid:202) tylko skrypty uruchomione lokalnie.
Próby ustawienia punktów wstrzymania w zdalnej sesji ko(cid:241)czy(cid:239)y si(cid:218) b(cid:239)(cid:218)dem. Ale w Windows
PowerShellu 4.0 zmieniono to i mo(cid:285)na ju(cid:285) ustawia(cid:202) punkty wstrzymania w zdalnych sesjach,
a tak(cid:285)e diagnozowa(cid:202) zdalne skrypty w taki sam sposób jak lokalne. Aby mo(cid:285)na by(cid:239)o korzysta(cid:202)
z mo(cid:285)liwo(cid:258)ci zdalnego diagnozowania skryptów, zarówno na lokalnym, jak i na zdalnym kom-
puterze musi by(cid:202) zainstalowane narz(cid:218)dzie Windows PowerShell 4.0.
Techniki obs(cid:239)ugi b(cid:239)(cid:218)dów
W Windows PowerShellu do obs(cid:239)ugi b(cid:239)(cid:218)dów terminalnych (wyj(cid:200)tków), podobnie jak w j(cid:218)zyku
C#, u(cid:285)ywa si(cid:218) instrukcji Try{}, Catch{} oraz Finally{}. B(cid:239)(cid:218)dy terminalne s(cid:200) obs(cid:239)ugiwane
przez instrukcj(cid:218) Catch{} tylko wtedy, gdy zmieni si(cid:218) warto(cid:258)(cid:202) zmiennej $ErrorActionPreference
na stop.
62
Kup książkęPoleć książkęRozdzia(cid:225) 2. • PowerShell w s(cid:225)u(cid:298)bie programisty
$ErrorActionPreference = stop
Try
{
Get-ChildItem C:\movies
}
Catch [System.Exception]
{
Nie znaleziono obiektu.
}
Finally
{
New-item -ItemType Directory -Path C:\Movies
Obiekt zosta(cid:239) utworzony.
}
Wi(cid:218)cej informacji na temat instrukcji Try, Catch i Finally mo(cid:285)na znale(cid:283)(cid:202) w pomocy About w nast(cid:218)-
puj(cid:200)cych tematach:
(cid:81) About_Trap
(cid:81) About_Throw
(cid:81) About_Try_Catch_Finally
Zmienne $Error i $LastExitCode
Gdy podczas dzia(cid:239)ania PowerShella wyst(cid:200)pi b(cid:239)(cid:200)d, zostaje on zapisany w globalnej zmiennej
$Error. Jest to egzemplarz klasy ArrayList, który zawiera obiekty b(cid:239)(cid:218)dów PowerShella i w któ-
rym ostatni b(cid:239)(cid:200)d jest zapisany pod indeksem o numerze zero. Ze zmiennej tej mo(cid:285)na wyci(cid:200)gn(cid:200)(cid:202)
ró(cid:285)ne szczegó(cid:239)owe informacje na temat zaistnia(cid:239)ych b(cid:239)(cid:218)dów, jak zosta(cid:239)o pokazane poni(cid:285)ej:
PS D:\ $Error[0].Exception
Cannot find path C:\movies because it does not exist.
PS D:\ $Error[0].FullyQualifiedErrorId
PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
PS D:\ $Error[0].ScriptStackTrace
at ScriptBlock , No file : line 5
Wi(cid:218)cej informacji na temat rejestracji b(cid:239)(cid:218)dów mo(cid:285)na znale(cid:283)(cid:202) na stronie http://msdn.microsoft.com/en-
us/library/system.management.automation.errorrecord_members(v=vs.85).aspx.
Na podstawie kodu zako(cid:241)czenia okre(cid:258)la si(cid:218) status wykonawczy macierzystych aplikacji, takich
jak ping.exe czy robocopy.exe, to znaczy czy ich wykonywanie zako(cid:241)czy(cid:239)o si(cid:218) pomy(cid:258)lnie, czy
nie. Najcz(cid:218)(cid:258)ciej warto(cid:258)(cid:202) 0 oznacza powodzenie, a 1 niepowodzenie, ale niektóre aplikacje mog(cid:200)
63
Kup książkęPoleć książkęWindows PowerShell 4.0 dla programistów .NET
zwraca(cid:202) bardziej zró(cid:285)nicowane kody oznac
Pobierz darmowy fragment (pdf)