You are on page 1of 405

Sos Tibor s Szernyi Lszl

Microsoft PowerShell 1.0


rendszergazdknak elmlet s gyakorlat

PS C:\> Get-Book | Where-Object {$_.Title -match "PowerShell"}

Microsoft Magyarorszg 2008

2008, Sos Tibor, Szernyi Lszl Els kiads Minden jog fenntartva. A szerzk a knyv rsa sorn trekedtek arra, hogy a lert tartalom a lehet legpontosabb s napraksz legyen. Ennek ellenre elfordulhatnak hibk, vagy bizonyos informcik elavultt vlhattak. A knyvben lert programkdokat mindenki sajt felelssgre alkalmazhatja. Javasoljuk, hogy ezeket ne les krnyezetben prbljk ki. A felhasznlsbl fakad esetleges krokrt sem a szerzk, sem a kiad nem vonhat felelssgre. Az oldalakon elfordul mrka- valamint kereskedelmi vdjegyek bejegyzjk tulajdonban llnak.

Aki msra nz, ha vlaszra vr, magt sohasem rti meg. m ha tkrkpt krdezi szntelen, a vilg lesz rthetetlenebb. Aki nem tekint az gre, nem nz r a napsugr. Aki nem tekint a fldre, az forrsra nem tall. Aki elremenne, de mindig htra nz, elvt minden tirnyt. m ha cljn kvl semmit se lt, magra lti a magnyt. Aki nem tekint az gre, jjel vakon imbolyog. Aki nem tekint a fldre, nmk annak a csillagok. /Lar Andrs: Aki/

Tartalomjegyzk
1. Elmlet ............................................................................................... 1
1.1 Elsz.................................................................................................... 1 1.2 Kezdetek ............................................................................................... 4
1.2.1 A PowerShell teleptse ..................................................................................... 4 1.2.2 Indtsuk el a PowerShellt! .................................................................................. 4 1.2.3 Hello World! ....................................................................................................... 8 1.2.4 DOS parancsok vgrehajtsa .............................................................................. 8 1.2.5 Gyorsbillentyk, belltsok ............................................................................... 9 1.2.6 A TAB-billenty................................................................................................. 11 1.2.7 Promptok, beviteli sor ...................................................................................... 13 1.2.8 Parancstrtnet ............................................................................................... 14 1.2.9 A PowerShell, mint szmolgp ....................................................................... 16 1.2.10 A konzol trlse.............................................................................................. 16 1.2.11 Kis-nagybet ................................................................................................... 16

1.3 Segdprogramok ................................................................................. 18


1.3.1 PowerGUI, PowerGUI Script Editor .................................................................. 18 1.3.2 RegexBuddy...................................................................................................... 21 1.3.3 Reflector ........................................................................................................... 21 1.3.4 PSPlus ............................................................................................................... 22 1.3.5 MoreMotion Editor .......................................................................................... 23

1.4 Alapfogalmak ...................................................................................... 24


1.4.1 Architektra ..................................................................................................... 24 1.4.2 OOP alapok....................................................................................................... 26 1.4.2.1 Osztly (tpus) ........................................................................................... 26 1.4.2.2 Pldny (objektum) .................................................................................. 27 1.4.2.3 Pldnyosts............................................................................................ 27 1.4.2.4 Metdusok s vltozk ............................................................................ 27 1.4.2.5 Pldnyvltoz, pldnymetdus ............................................................ 27 1.4.2.6 Statikus vltoz, statikus metdus ........................................................... 28 1.4.2.7 Vltozk elrejtse ..................................................................................... 28 1.4.2.8 Overloaded metdusok ............................................................................ 28 1.4.2.9 rklds ................................................................................................. 29 1.4.3 Mi is az a .NET keretrendszer ........................................................................... 29 1.4.3.1 Futtatkrnyezet (Common Language Runtime, CLR) ............................. 29 1.4.3.2 Class Library (osztlyknyvtr) ................................................................. 30 1.4.3.3 Programnyelvek ....................................................................................... 30 1.4.3.4 Programfordts ....................................................................................... 31

1.4.3.5 Programfuttats ....................................................................................... 31 1.4.3.6 Assemblyk (kdkszletek) ........................................................................ 31 1.4.3.7 rtk- s referenciatpusok ...................................................................... 32 1.4.4 COM-objektumok ............................................................................................ 32 1.4.4.1 Tpusknyvtrak ....................................................................................... 33 1.4.5 Command s cmdlet ........................................................................................ 33 1.4.6 Segtsg! (Get-Help) ......................................................................................... 34 1.4.7 Ki-mit-tud (Get-Member)................................................................................. 37 1.4.8 Alias, becenv, lnv........................................................................................ 39 1.4.9 PSDrive ............................................................................................................. 41 1.4.9.1 Meghajtk ltrehozsa s trlse (New-PSDrive, Remove-PSDrive) ....... 43 1.4.10 Vltozk, konstansok ..................................................................................... 45 1.4.11 Idzjelezs, escape hasznlat ...................................................................... 49 1.4.12 Sortrs, tbbsoros kifejezsek ..................................................................... 50 1.4.13 Kifejezs- s parancsfeldolgozs .................................................................... 51 1.4.14 Utastsok lezrsa ........................................................................................ 53 1.4.15 Csvezetk (Pipeline) ..................................................................................... 54 1.4.16 Kimenet (Output) ........................................................................................... 56 1.4.17 Egyszer formzs ......................................................................................... 58 1.4.18 HTML output .................................................................................................. 63

1.5 Tpusok ................................................................................................ 65


1.5.1 Tpusok, tpuskezels ....................................................................................... 65 1.5.2 Szmtpusok ..................................................................................................... 68 1.5.3 Tmbk ............................................................................................................ 68 1.5.3.1 Egyszer tmbk ...................................................................................... 68 1.5.3.2 Tbbdimenzis tmbk ........................................................................... 76 1.5.3.3 Tpusos tmbk ........................................................................................ 77 1.5.4 Sztrak (hashtblk) s sztrtmbk ........................................................... 77 1.5.5 Dtumok (*datetime+, Get-Date, Set-Date) ..................................................... 81 1.5.5.1 Idtartam szmts (New-TimeSpan) ....................................................... 83 1.5.6 Automatikus tpuskonverzi ............................................................................ 84 1.5.7 Tpuskonverzi ................................................................................................. 85 1.5.8 .NET tpusok, statikus tagok ............................................................................. 88 1.5.9 A .NET osztlyok feldertse ............................................................................ 89 1.5.10 Objektumok testre szabsa, kiegsztse ...................................................... 95 1.5.11 Osztlyok (tpusok) testre szabsa ................................................................. 98 1.5.11.1 PSBase, PSAdapted, PSExtended ......................................................... 100 1.5.12 Objektumok mentse, visszatltse ............................................................ 105

1.6 Opertorok ........................................................................................ 107


1.6.1 Aritmetikai opertorok .................................................................................. 107 1.6.1.1 sszeads ............................................................................................... 107

1.6.1.2 Tbbszrzs .......................................................................................... 109 1.6.1.3 Oszts, maradkos oszts....................................................................... 110 1.6.2 rtkads........................................................................................................ 111 1.6.3 sszehasonlt opertorok ............................................................................ 113 1.6.4 Tartalmaz (-contains, -notcontains) ............................................................... 116 1.6.5 Dzsker-mintk (-like) .................................................................................... 116 1.6.6 Regex (-match, -replace) ................................................................................ 119 1.6.6.1 Van-e benne vagy nincs? ........................................................................ 119 1.6.6.2 Van benne, de mi? .................................................................................. 122 1.6.6.3 A moh regex ......................................................................................... 122 1.6.6.4 Escape a Regex-ben ................................................................................ 123 1.6.6.5 Tudjuk, hogy mi, de hol van? .................................................................. 124 1.6.6.6 Tekintsnk elre s htra a mintban .................................................... 128 1.6.6.7 A mintm visszakszn........................................................................... 130 1.6.6.8 Vltozatok a keressre ........................................................................... 131 1.6.6.9 Tudjuk, hogy mi, de hnyszor? ............................................................... 134 1.6.6.10 Csere ..................................................................................................... 137 1.6.7 Logikai s bitszint opertorok ...................................................................... 138 1.6.8 Tpusvizsglat, tpuskonverzi (-is, -as) .......................................................... 139 1.6.9 Egytag opertorok (+, -, ++, --, *tpus+) ......................................................... 140 1.6.10 Csoportost opertorok .............................................................................. 141 1.6.10.1 Gmbly zrjel: () ............................................................................. 141 1.6.10.2 Dollros gmbly zrjel: $() ............................................................. 142 1.6.10.3 Kukacos gmbly zrjel: @() ............................................................ 143 1.6.10.4 Kapcsos zrjel: ,- (bajusz) ................................................................... 144 1.6.10.5 Szgletes zrjel: *+ .............................................................................. 145 1.6.11 Tmbopertor: , ........................................................................................ 145 1.6.12 Tartomny-opertor: .. ............................................................................. 146 1.6.13 Tulajdonsg, metdus s statikus metdus opertora: . .......................... 146 1.6.14 Vgrehajts .................................................................................................. 147 1.6.15 Formz opertor ........................................................................................ 148 1.6.16 tirnyts: >, >> .................................................................................... 150

1.7 Vezrl utastsok ..............................................................................152


1.7.1 IF/ELSEIF/ELSE ................................................................................................ 152 1.7.2 WHILE, DO-WHILE .......................................................................................... 152 1.7.3 FOR ................................................................................................................. 153 1.7.4 FOREACH ........................................................................................................ 153 1.7.4.1 $foreach vltoz ..................................................................................... 154 1.7.5 ForEach-Object cmdlet ................................................................................... 156 1.7.6 Where-Object cmdlet ..................................................................................... 157 1.7.7 Cmkk, trs (Break), folytats (Continue) ................................................... 158 1.7.8 SWITCH........................................................................................................... 159

1.7.8.1 wildcard ................................................................................................ 161 1.7.8.2 regex .................................................................................................... 162 1.7.8.3 $switch vltoz ...................................................................................... 162

1.8 Fggvnyek ........................................................................................ 164


1.8.1 Az els fggvnyem ....................................................................................... 164 1.8.2 Paramterek .................................................................................................. 164 1.8.2.1 Paramterinicializls ............................................................................ 165 1.8.2.2 Tpusos paramterek ............................................................................. 166 1.8.2.3 Hibajelzs ............................................................................................... 167 1.8.2.4 Vltoz szm paramter ...................................................................... 168 1.8.2.5 Hivatkozs paramterekre ..................................................................... 169 1.8.2.6 Kapcsol paramter (*switch+) ............................................................... 170 1.8.2.7 Paramter-definci a fggvnytrzsben (param) ................................. 171 1.8.2.8 Paramterek, vltozk ellenrzse (validls) ....................................... 172 1.8.3 Vltozk lthatsga (scope) ......................................................................... 175 1.8.4 Fggvnyek lthatsga, dotsourcing ........................................................ 177 1.8.5 Referencilis hivatkozs paramterekre (*ref+) ............................................. 179 1.8.6 Kilps a fggvnybl (return) ....................................................................... 180 1.8.7 Pipe kezelse, filter ........................................................................................ 181 1.8.8 Szkriptblokkok ................................................................................................ 183 1.8.8.1 Anonim fggvnyek ............................................................................... 184 1.8.9 Fggvnyek trlse, mdostsa ................................................................... 185 1.8.10 Gyri fggvnyek ......................................................................................... 188

1.9 Szkriptek ............................................................................................ 190


1.9.1 Szkriptek engedlyezse s indtsa .............................................................. 190 1.9.2 Vltozk kiszippantsa a szkriptekbl (dot sourcing) .................................... 193 1.9.3 Paramterek tvtele s a szkript ltal visszaadott rtk ............................. 194 1.9.4 Szkriptek rsa a gyakorlatban ....................................................................... 196 1.9.4.1 PowerGUI Script Editor .......................................................................... 196 1.9.4.2 Megjegyzsek, kommentezs (#) ........................................................... 197 1.9.5 Adatbekrs (Read-Host) ............................................................................... 197 1.9.6 Szkriptek digitlis alrsa .............................................................................. 198 1.9.7 Vgrehajtsi preferencia ................................................................................ 204

1.10 Fontosabb cmdletek ......................................................................... 206


1.10.1 Csvezetk feldolgozsa (Foreach-Object) jra ........................................ 206 1.10.2 A csvezetk elgaztatsa (Tee-Object) ...................................................... 207 1.10.3 Csoportosts (Group-Object) ...................................................................... 208 1.10.4 Objektumok talaktsa (Select-Object) ...................................................... 210 1.10.5 Rendezs (Sort-Object) ................................................................................ 213 1.10.6 Mg egyszer format-table............................................................................ 215 1.10.7 Gyjtemnyek sszehasonltsa (Compare-Object) .................................... 215

1.10.8 Klnbz objektumok (Get-Unique) .......................................................... 217 1.10.9 Szmlls (Measure-Object) ........................................................................ 219 1.10.10 Nyomtats (Out-Printer) ............................................................................ 220 1.10.11 Kirs fjlba (Out-File, Export-) ................................................................... 220 1.10.12 talakts szvegg (Out-String) ................................................................ 224 1.10.13 Kimenet trlse (Out-Null) ......................................................................... 225

1.11 sszefoglal: PowerShell programozsi stlus ....................................226

2.

Gyakorlat ................................................................................... 228


2.1 PowerShell krnyezet .........................................................................228
2.1.1 Szkriptknyvtrak, futtatsi informcik ($myinvocation) ............................ 228 2.1.1.1 A $MyInvocation felhasznlsa parancssor-elemzsre .......................... 232 2.1.2 Krnyezeti vltozk (env:) .............................................................................. 233 2.1.3 Lpjnk kapcsolatba a konzolablakkal ($host) ............................................... 235 2.1.4 Prompt belltsa ........................................................................................... 238 2.1.5 Snapin-ek........................................................................................................ 238 2.1.6 Konzolfjl ........................................................................................................ 241 2.1.7 Profilok ........................................................................................................... 242 2.1.8 rktsk meg munknkat (start-transcript) ................................................. 243 2.1.9 Stopperoljuk a futsi idt s vrakozzunk (measure-command, start-sleep) 244 2.1.10 Elrehalads jelzse (write-progress) .......................................................... 245

2.2 Hibakezels ........................................................................................246


2.2.1 Megszakt s nem megszakt hibk ............................................................ 246 2.2.2 Hibajelzs kiolvassa ($error) ........................................................................ 249 2.2.3 Hibakezels globlis paramterei .................................................................. 251 2.2.4 Hibakezels sajt fggvnyeinkben (trap) ..................................................... 252 2.2.4.1 Tbbszint csapda .................................................................................. 257 2.2.4.2 Dobom s elkapom................................................................................. 259 2.2.5 Nem megszakt hibk kezelse fggvnyeinkben ........................................ 261 2.2.6 Hibakeress .................................................................................................... 262 2.2.6.1 Sttusjelzs (write-verbose, write-debug) ............................................. 263 2.2.6.2 Lpsenknti vgrehajts s szigor vltozkezels (set-psdebug) ...... 264 2.2.6.3 ssunk mg mlyebbre (Trace-Command) ............................................ 266 2.2.7 A PowerShell esemnynaplja ....................................................................... 270

2.3 Fjlkezels ..........................................................................................271


2.3.1 Fjl s knyvtr ltrehozsa (new-item), ellenrzse (test-path) .................. 271 2.3.2 Rejtett fjlok ................................................................................................... 272 2.3.3 Szvegfjlok feldolgozsa (Get-Content, Select-String) ................................. 273 2.3.4 Sortrs kezelse szvegfjlokban ................................................................ 276 2.3.5 Fjl hozzfrsi listja (get-acl, set-acl) .......................................................... 277

2.3.5.1 Fjlok tulajdonosai ................................................................................. 279 2.3.6 Ideiglenes fjlok ltrehozsa.......................................................................... 280 2.3.7 XML fjlok kezelse ........................................................................................ 280 2.3.8 Megosztsok s webmappk elrse ............................................................ 282

2.4 Az Esemnynapl feldolgozsa (Get-Eventlog) .................................... 284 2.5 Registry kezelse ................................................................................ 288
2.5.1 Olvass a registrybl ...................................................................................... 288 2.5.2 Registry elemek ltrehozsa, mdostsa ..................................................... 291 2.5.3 Registry elemek hozzfrsi listjnak kiolvassa ......................................... 292

2.6 WMI .................................................................................................. 293


2.6.1 A WMI ttekintse ......................................................................................... 293 2.6.2 A WMI felptse ........................................................................................... 294 2.6.3 A WMI objektummodellje .............................................................................. 295 2.6.4 Smk ............................................................................................................ 296 2.6.5 Nvterek ........................................................................................................ 297 2.6.6 A legfontosabb providerek ............................................................................ 299 2.6.7 WMI objektumok elrse PowerShell-bl ..................................................... 299 2.6.8 WMI objektumok metdusainak meghvsa ................................................. 302 2.6.9 Fontosabb WMI osztlyok ............................................................................. 306

2.7 Rendszerfolyamatok s szolgltatsok ................................................ 309


2.7.1.1 Szolgltatsok Startup tulajdonsga ...................................................... 312

2.8 Teljestmny-monitorozs .................................................................. 315 2.9 Felhasznl-menedzsment, Active Directory ....................................... 316
2.9.1 Mi is az ADSI? ................................................................................................. 316 2.9.2 ADSI providerek ............................................................................................. 316 2.9.3 Az ADSI gyorsttr ........................................................................................ 317 2.9.4 Active Directory informcik lekrdezse ..................................................... 317 2.9.5 Csatlakozs az Active Directory-hoz .............................................................. 319 2.9.6 AD objektumok ltrehozsa........................................................................... 320 2.9.7 AD objektumok tulajdonsgainak kiolvassa, mdostsa ............................ 321 2.9.7.1 Munka tbbrtk (multivalued) attribtumokkal ................................ 326 2.9.7.2 Specilis tulajdonsgok kezelse ........................................................... 328 2.9.8 Jelsz megvltoztatsa .................................................................................. 329 2.9.9 Csoportok kezelse ........................................................................................ 329 2.9.10 Keress az AD-ben ....................................................................................... 330 2.9.10.1 Keress id tpus adatokra ................................................................. 333 2.9.10.2 Keress bitekre..................................................................................... 334 2.9.11 Objektumok trlse ..................................................................................... 335 2.9.12 AD objektumok hozzfrsi listjnak kezelse .......................................... 335

2.9.13 sszetett feladat ADSI mveletekkel ........................................................... 338

2.10 .NET Framework hasznos osztlyai ....................................................340


2.10.1 Levlklds ................................................................................................... 340 2.10.2 Bngszs ..................................................................................................... 340 2.10.3 Felhasznli informcik.............................................................................. 342 2.10.4 DNS adatok lekrdezse............................................................................... 342

2.11 SQL adatelrs..................................................................................344 2.12 COM objektumok kezelse................................................................347


2.12.1 A Windows shell kezelse ............................................................................ 347 2.12.2 WScript osztly hasznlata ........................................................................... 348 2.12.3 Alkalmazsok kezelse ................................................................................. 350

3.

Bvtmnyek ............................................................................... 352


3.1 Quest ActiveRoles Management Shell for Active Directory ................352 3.2 PCX PowerShell Community Extensions ............................................357 3.3 Exchange Server 2007 .........................................................................362
3.3.1 Te j g! Csak nem egy jabb parancssori krnyezet? .................................. 362 3.3.2 Az Exchange cmdletek feltrkpezse ........................................................... 366 3.3.3 Help szerkezete .............................................................................................. 369 3.3.4 Felhasznl- s csoportkezels ...................................................................... 370 3.3.5 Get s Set ....................................................................................................... 372 3.3.6 j paramterfajta: Identity ............................................................................ 374 3.3.7 Filter paramter ............................................................................................. 376

3.4 Adatok vizualizlsa, PowerGadgets ...................................................379 3.5 Kitekints a PowerShell 2.0-ra.............................................................383

4. 5.

Hasznos linkek ............................................................................ 385 Trgymutat............................................................................... 389

Elmlet

1. Elmlet
1.1 Elsz
Ha egyetlen mondatban kellene megfogalmaznunk, hogy mi is a PowerShell amirl ez a knyv szl -, akkor azt mondhatnnk, hogy a PowerShell egy teljesen objektumorientlt, a .NET keretrendszerre pl parancsfeldolgoz- s szkriptkrnyezet, ami gykeresen j alapokra helyezi (s fogja helyezni) a Windows opercis rendszerekkel s kiszolgloldali alkalmazsokkal kapcsolatos felgyeleti feladataink elvgzst. A Windows rendszerek parancssori felletnek viszonylagos gyengesge trtnelmi okokra vezethet vissza. A Windows fejlesztsnek f vonala a kezdetektl fogva a grafikus felhasznli fellet tkletestse volt, a parancssor sokig csak mint kiegszt eszkz szerepelt, gy a lehetsgek tbb-kevsb korltozottak voltak. A Microsoft clja alapveten az, hogy minden parancs vagy lista, ami az MMC konzolon vagy egy webes adminisztrcis felletrl elrhet, illetve amit az adott szerveralkalmazs kiajnl magbl automatizcihoz, vagy sajt felgyelethez, az Windows PowerShell parancsok vagy providerek formjban is rendelkezsre lljon. gy a rendszergazda eldntheti, hogy a grafikus, vagy a parancssoros interfszt hasznlja feladatai elvgzshez. A grafikus fellet nyilvn sokak szmra egyszerbb, azonban a parancssor hasznlatval messze tbb lehetsgnk addik; pldul ugyanazokkal az eszkzkkel barangolhatunk a registry, a fjlrendszer, a tanstvnytr, vagy ppen az Exchange mailboxok kztt, s egy nagyon korrektl sszerakott, tpusos, .NET-alap szkriptnyelvvel dolgozhatunk az ott tallt adatokkal. Ha egy mveletsort egyetlen gpen csak egyetlen egyszer kell vgrehajtanunk, akkor a grafikus fellet a logikus vlaszts, ebben az esetben a parancssor hasznlata, vagy a megfelel szkript megrsa csupn idignyes (br szrakoztat) hobbinak tekinthet. Egszen ms a helyzet azonban, ha az adott mveleteket minden nap el kellene vgeznnk (vagy esetleg 300 gpen kell minden nap elvgeznnk). Akinek mg gy is knyelmesebb a grafikus fellet, annak vljon egszsgre az egerszs. Az Exchange Server 2007-ben br nagyon sok funkci elrhet a hozz tartoz j MMC konzolrl, azonban nem mindent tudunk belltani onnan. J nhny, ritkbban hasznlatos bellts csak PowerShell parancsokkal vgezhet s. s ha automatizlni szeretnnk az Exchange Server 2007 konfigurlst, akkor ezt mindenkppen a Windows PowerShell alapokra pl Exchange Management Shellel tehetjk meg. Az Exchange 2007, nagyon hasonlan az SQL Server 2005-hz mr arra is kpes, hogy ha a grafikus felleten mdostunk valamit, azt szkriptknt is visszaadja neknk. Mgpedig egy olyan PowerShell szkript kpben, amit azonnal tudunk az j parancssorban, vagy automatizlshoz hasznlni.

Elsz
Az pedig, hogy a PowerShell szinte teljesen .NET-alap, mg egy rdekessget mutat: az eddig szinte kizrlag programozknak szl osztlyknyvtrak vgre elrhetek egyszerbb formban a rendszergazdk szmra is, gy a szerverszoftverek testre szabshoz s automatizlshoz kevesebb alkalommal lesz szksg a fejleszt beavatkozsra. Ezzel egy idben pedig a rendszergazdk is kzelebb kerlhetnek a .NET alap programozshoz. Aki ltja a jvt, az tudhatja, hogy a PowerShell mindent visz. Elbb-utbb mindenkinek ugyangy meg kell tanulnia, mint annak idejn a DOS-t egyszeren nincs nlkle let a Windows-vilgban.

Szernyi Lszl

A knyvet ketten rtuk, Sos Tibor s Szernyi Lszl. Az egyes alfejezeteket vagy egyiknk, vagy msikunk, ez indokolja a knyvben alkalmazott egyes szm els szemly alkalmazst. Lszl leginkbb a 1.2, 1.4, 1.10 s a gyakorlati rsz egyes alfejezeteibe segtett be. Annak ellenre, hogy ketten rtuk, bzom benne, hogy az olvassban s a megrtben ez nem okoz zavart, prbltam azrt szerves egssz sszegyrni a szveget. A knyv rst elszr tanfolyami jegyzetknt kezdtem el, majd annyi dolog tolult fel bennem PowerShell tmban, hogy egyre csak hzott az anyag, gy kt hnap utn megrleldtt bennem, hogy knyvv kellene talaktani. Ennek ellenre vgig az lebegett a szemem eltt, hogy ez olyan knyv legyen, amely segtsgvel meg lehet tanulni a PowerShell hasznlatt. Prbltam azokat a rszeket rszletesebben lerni, amelyek anno nekem nehezebben voltak rthetek. Termszetesen pusztn a knyv elolvassa mg nem elegend ahhoz, hogy profi PowerShell programozk legynk, sok gyakorlsra is szksg van. A Microsoft Script Center weboldaln telente szoktak hirdetni Winter Scripting Games nven szkriptelsi versenyt, javaslom a tisztelt olvasnak, hogy nzze meg milyen feladatok voltak az elmlt vekben, prblja meg megoldani azokat, s javaslom, hogy akr nevezzen is be a kvetkez vetlkedbe, nagyon sokat lehet ebbl tanulni! Ha valaki idt szeretne nyerni, akkor javaslok egy - ltalam tartott - tanfolyam elvgzst, amely ennek a knyvnek az anyagra pl. A ngynapos tanfolyam sorn az elmlet elmagyarzsa mellett lehetsg van gyakorlsra. A kiadott feladatokat megbeszljk, megnzzk, hogy a klnbz megoldsi javaslatok kzl vajon melyik tanfolyami rsztvev megoldsa a legelegnsabb, leggyesebb. Ezt a fajta tanulst a knyv nmagban nem helyettesti. Ezen a ngy napon hozzvetlegesen 2 hnap nll ismeretelsajttsnak idejt lehet megsprolni. A PowerShell szmomra szrakozs, szellemi jtk is. Bzom benne, hogy a kedves olvas szmra is sikerl ezt az oldalt is megmutatni, s lvezettel prblja ki mindenki a pldaszkripteket s akr el is jtszadozik velk, tovbb is fejleszti azokat.

Elmlet
A PowerShell 2.0 mr kszlben van. Terveim szerint a megjelense utn nem sokkal aktualizlom ezt a knyvet, gy a 2. kiads mr az jdonsgokat is tartalmazni fogja. Szvesen fogadom a knyvvel kapcsolatos visszajelzseket! Akr valami elgpelst, vagy nehezen rthet pldt tallnak, vagy javasolnnak valamit, ami mg illene egy ilyen jelleg knyvbe, krem, rjk meg! Cmem: soost@IQJB.hu .

Sos Tibor

Kezdetek

1.2 Kezdetek
1.2.1 A PowerShell teleptse
A PowerShell 1.0 telepthet Windows XP SP2, Windows Server 2003 SP1 s ezeknl jabb opercis rendszerre. A telepts elfelttele a .NET Framework 2.0 meglte a gpen. Mind a PowerShell, mind a .NET Framework letlthet a Microsoft weboldalrl. A PowerShell teleptkszleteihez legegyszerbben a http://www.microsoft.com/powershell cmen megjelen Download szekcibl tudunk eljutni. Az indokolja a tbbes szmot, hogy minden opercis rendszer tpushoz s processzor-platformhoz kln teleptkszlet van, gy fontos, hogy a megfelelt tltsk le s teleptsk. A PowerShell-t a Start men Windows PowerShell 1.0 csoportjban tallhat Windows PowerShell parancsikon segtsgvel, vagy kzvetlenl a powershell.exe meghvsval indthatjuk. A 64 bites Windows-okon kt PowerShell ikonunk is lesz, egy 64 bites s egy 32 bites parancssori krnyezet indtsra:

1. bra PowerShell programcsoport ikonjai (64 bites)

A programcsoportban a PowerShell dokumentcijnak ikonjai is megtallhatk.

1.2.2 Indtsuk el a PowerShellt!


Indts utn a rgi, megszokott Parancssorhoz (cmd.exe) hasonl fellet jelenik meg. Amint az albbi brn is lthat, ksrteties a hasonlsg, nem lesz itt baj, gondosan tartsuk magunktl tvol a dokumentcit s prblkozzunk btran.

Elmlet

2. bra, A cmd.exe s a PowerShell

Kezdetnek prbljuk ki teht a megszokott parancsokat, vajon mit szl hozzjuk az j shell.
PS C:\> dir Directory: Microsoft.PowerShell.Core\FileSystem::C:\ Mode ---d---d---d---d-r-d---d----a---a--LastWriteTime ------------2007.06.10. 12:41 2007.06.13. 21:30 2003.10.25. 18:59 2007.06.04. 20:36 2006.09.13. 18:10 2007.05.31. 19:50 2003.08.15. 19:35 2003.08.15. 19:35 Length Name ------ ---Config.Msi Documents and Settings Inetpub Program Files temp WINDOWS 0 AUTOEXEC.BAT 0 CONFIG.SYS

Amint lthat, nem trtnt semmi meglep, kaptunk egy mappa- s fjllistt, nagyjbl a megszokott mdon. Eddig rendben, a nehezn tl is vagyunk, ez is csak egy parancssor. Prblkozzunk valami nehezebbel, rjuk be mondjuk a kvetkezt:
PS C:\> dir /s Get-ChildItem : Cannot find path 'C:\s' because it does not exist. At line:1 char:4 + dir <<<< /s

Ht ez mr nem jtt ssze: szp piros hibazenet tjkoztat, hogy a C:\s mappa nem ltezik. Ez gy teljesen igaz is, de ki akart oda menni? (Egybknt teljesen korrekt a hibazenet, mivel ha mgis van ilyen mappa, akkor azt gond nlkl kilistzza, vagyis a /

Kezdetek
karakter a gykrmappt jelenti.) Mi trtnik itt? gy ltszik, mgis segtsget kell krnnk, de vajon hogyan? Mondjuk, legyen a kvetkez:
PS C:\> help dir NAME Get-ChildItem SYNOPSIS Gets the items and child items in one or more specified locations. ...

Taln meglep, de a help parancs mkdik. Taln mg meglepbb, de pldul a man parancs is mkdik! A vlaszbl viszont az derl ki, hogy a dir egyltaln nem is ltezik, a mappalistt valjban a Get-ChildItem nev parancs produklta az elbb. Kiderl az is, hogy hogyan kell t az alknyvtrakba lekldeni: -recurse, vagy egyszeren: -r kapcsolval. A Get-ChildItem lerst elolvasva joggal krdezhetjk, hogy mirt vltozott meg az gvilgon minden, ha egyszer ugyanazt a feladatot hajtja vgre a Get-ChildItem, mint a j reg dir parancs. A vlasz pedig egyszeren az, hogy nem ugyanazt vgzi el, nem ugyangy, s nem ugyanazzal az eredmnnyel! A Get-ChildItem pldul nemcsak mappkbl, hanem szmos ms adathalmazbl is kpes listt produklni, gy a regisztrcis adatbzisbl, a tanstvnytrbl, stb. is, kimenete pedig korntsem az a lista, amit a kpernyn lttunk. Ha kiadjuk az albbi parancsot, szomoran lthatjuk, hogy help parancs sem ltezik, az igazi neve Get-Help.
PS C:\> help help

Hogy tovbb szaportsuk a nem ltez, de ennek ellenre jl mkd parancsok szmt, prbljuk ki a cd parancsot, majd krjk el az sglapjt is. Lthatjuk, hogy az igazi neve Set-Location, s termszetesen nemcsak a fjlrendszerben, hanem a regisztrcis adatbzisban, tanstvnytrban, stb. is remekl mkdik. Valjban a cd, s a tbbi 1 nem ltez, de mkd parancs csupn egy alias , egy becenv, lnv a megfelel PowerShell parancsra (lsd: Get-Alias), amelyek hivatalos neve cmdlet (ejtsd: kommandlet, magyarul parancsocska). A kvetkezkben felsorolunk a fenti parancsokkal kapcsolatos nhny egszen egyszer pldt, amelyek kztt rszben a rgi cmd parancsok megfelelit, rszben az j kpessgek demonstrcijt tallhatjuk. dir *.txt /s

PS C:\> Get-ChildItem -Include *.txt -Recurse

A help s a man nem alias, hanem fggvny, de ennek a mi szempontunkbl most nincs jelentsge.

Elmlet
A HKLM/Software g kilistzsa a registrybl.

PS C:\> Get-ChildItem registry::HKLM/Software

dir *.exe

PS C:\> Get-ChildItem * -i *.exe

cd q:

PS C:\> Set-Location q:

Jelenlegi pozci elmentse .

PS C:\> Push-Location

tlls a HKEY_CURRENT_USER gra a registryben.

PS C:\> Set-Location HKCU:

Visszaugrs egy korbbi elmentett pozcira.

PS C:\> Pop-Location

tlls a tanstvnytr meghajtra.

PS C:\> Set-Location Cert:

Azrt volt nhny elg furcsa klsej parancs, igaz? Tanstvnytr meghajt!? Mi lesz mg itt? Ksrletezznk tovbb! Ha mr ilyen szpen tudjuk hasznlni a nem ltez parancsokat, prbljunk ki valami olyat, ami tnyleg biztosan nem ltezhet:
PS C:\> 1 1

Semmi hibazenet, a PowerShell egyszeren visszarta a szmot a konzolra. A PowerShell ablakot bezrni az Exit paranccsal lehet, de ez nem PowerShell parancs, nem is alias, a help sem ad semmi tmpontot.

Ahogyan a nv sugallja, tbb pozci is elmenthet egyms tetejre, vagyis egy verembe. A Pop-Location mindig a legfell lvre tr vissza, majd eldobja azt.

Kezdetek

1.2.3 Hello World!


Az elzekben a PowerShell sajt parancsaival s DOS-os lnevekkel ksrleteztnk, most kezd kezdjnk el alkotni, sajt programot rni! Bjarne Stroustrup ta, azt hiszem, minden programozssal foglalkoz knyv azzal kezddik, hogy olyan programot runk, amelyik kirja a kpernyre, hogy Hello world!. Nzzk meg, hogy ez hogyan megy PowerShellben:

3. bra Els PowerShell parancsom

Nagyon egyszer, idzjelek kzt berjuk a szveget, Enter, s mr ki is rta. Ennl egyszerbben nem is lehetne ezt!

1.2.4 DOS parancsok vgrehajtsa


Lttuk, hogy a Dir parancs lefutott, de knny neki, hiszen a Dir egy PowerShell parancs lnven. De vajon a tbbi DOS paranccsal mi trtnik? Azokkal is nyugodtan prblkozzunk! Pldul prbljuk ki az IPConfig parancsot:

4. bra IPConfig a PowerShell ablakban

Elmlet
Ez is lefutott, az ipconfig ugyangy mkdik, mint a DOS ablakban. Ehhez hasonlan a tbbi DOS parancsot is nyugodtan kiprblhatjuk, azaz akr teljes egszben ttrhetnk a PowerShell krnyezet hasznlatra, akr a nem PowerShell parancsok futtatsval is.

1.2.5 Gyorsbillentyk, belltsok


Nagyban meggyorstja munknkat, ha ismerjk azokat a gyorsbillentyket, amelyek elrhetek a PowerShell ablakban: TAB Shift + TAB F1 F2 F3 vagy F4 F5 vagy F6 F7 F8 F9 Jobbkattints Egrrel kijell + Enter ESC Automatikus kiegszts, tovbbi TAB tovbbi tallatokat ad Visszalp az elz tallatra 1 karakter a trtnet-trbl Bert karakterig msol Elz parancs a trtnet-trbl Kurzortl az adott karakterig trl Lpked vissza a trtnet-trbl hatstalan Trtnettrat megjelenti Parancstrtnet, de csak a mr begpelt szvegre illeszkedeket Bekri a trtnettr adott elemnek szmt s futtatja Beilleszts Msols Karaktert lpked, res sorban a parancstrtnet-trbl hv el karaktereket Karaktert lpked Trli az aktulis parancssort

Tovbb gyorstja a munknkat, ha a PowerShell ablak nhny belltsra is odafigyelnk. Ha jobb egrgombbal kattintunk az ablak bal fels sarkban lev PowerShell ikonra ( ), akkor a kvetkez men jelenik meg:

5. bra A PowerShell ablak menje

Kezdetek
Itt minket a Properties menpont rdekel, kattintsunk r. A megjelen prbeszdpanelben van nhny fontos, munknkat segt belltsi lehetsg: Az Options fln a QuickEdit Mode fontos, hogy be legyen kapcsolva. Ennek birtokban tudjuk az egrrel kijellni a konzolon megjelen szvegeket s Enter letsvel a vglapra helyezni. Szintn ez kell ahhoz, hogy a vglapra valahonnan kimsolt szveget a jobb egrgombbal beilleszthessk a kurzor pozcijtl kezdden.

6. bra Options fl

A Font fln llthatunk be az ignyeinknek s szemnknek esetleg jobban megfelel bettpust s mretet. A Layout fln lehet optimlisabb ablakmretet belltani. Ez fleg az ablak szlessge szempontjbl fontos, mert majd ltni fogjuk, hogy a PowerShell parancsok kimenete nagyon gyakran tblzat jelleg, s annak jobb, ha minl szlesebb ablakban tudjuk megjelenteni.

7. bra Az ablak mretnek belltsa

Jelen knyvbe msolt konzoltartalmak miatt n az ablakmretemet levettem 76 karakterre, mert ez pont mg megfelel fontmrettel beilleszthet a knyv lapjaira, de igazi

10

Elmlet
munkban, amikor j nagy felbonts monitort hasznlunk, akkor ezt rdemes akr 150 karakterre megnvelni. Szintn praktikus, ha a lthat ablak szlessge s a mgtte lev Screen Buffer szlessge egyforma, mert akkor nem lesz vzszintes grdt svunk, ami j, ha nincs. Ezzel szemben a fggleges puffer-mret lehet j nagy, hogy hosszabb listk is gond nlkl teljes terjedelmkkel kifrjenek, s fggleges grdtssel megtekinthetek legyenek. Az utols fl a sznek belltsra val. Alaphelyzetben mlykk alapon fehr betkkel nylik meg a PowerShell ablak. Ha valaki knyvet r, s a kpernykpek nyomtatsra kerlnek, akkor rdemes festkkmls cljbl inkbb fehr alapon fekete betket hasznlni. Ha testre szabtuk az ablakot, akkor a prbeszdpanel bezrskor rkrdez a fellet, hogy ezeket a belltsok csak az adott ablakra vonatkozzanak, vagy legkzelebb is viszont akarjuk ltni a vltoztatsainkat, ha jra megnyitjuk a Start menbl a PowerShell ablakot. rdemes ez utbbi opcival elmenteni vltoztatsainkat kiprbls utn.

1.2.6 A TAB-billenty
Az egyik legtbbet hasznlt gyorsbillenty a TAB-billenty, amit rdemes kicsit rszletesebben is trgyalni, mivel ez rengeteg flsleges gpelstl mentheti meg a lustbb (ez hatrozottan pozitv tulajdonsg) szkriptelket. A PowerShell TAB-billentyje annyira sokrten hasznlhat, hogy akr olyan informciforrsknt is tekinthetnk r, ami gyorsan, knnyen elrhet s mindig kznl van. A TAB hasznlata nem igazi jdonsg, nyilvn sokan hasznltk a cmd.exe-be ptett vltozatt, de a PowerShell-ben szmos j kpessggel is tallkozhatunk. Mi a teend pldul, ha t akarunk vltani a C:\Documents and Settings mappra? Termszetesen begpelhetjk a teljes parancsot:
PS C:\> Set-Location "c:\documents and settings"

Nem is olyan sok ez. Akinek mgis, az csak ennyit rjon:


PS C:\> Set-Location c:\d<tab>

Ha a c: meghajt gykerben nincs ms d betvel kezdd mappa, akkor kszen is vagyunk, a shell kiegsztette a parancsot, mg az idzjeleket is begpelte helyettnk. Ha tbb mappa is kezddik d-vel akkor sincs nagy baj, a TAB-billenty szorgalmas nyomkodsval elbb-utbb eljutunk a megfelel eredmnyig. Mg ez is tl sok? Prblkozzunk tovbb! A PowerShell nemcsak a mappa s fjlneveket, hanem a cmdletek nevt is kitallja helyettnk:
PS C:\> Set-L<tab> c:\d<tab>

Mi trtnik vajon, ha csak ezt gpeljk be:

11

Kezdetek
PS C:\> Set-<tab>

Bizony, a TAB-billenty nyomkodsval vgiglpkednk az sszes Set- parancson, gy akkor is knnyen kivlaszthatjuk a megfelelt, ha a pontos nv ppen nem jut esznkbe. A Shift+TAB-bal vissza tudunk lpni az elz tallatra, ha tl gyorsan nyomkodva esetleg tovbb lptnk, mint kellett volna. Mi a helyzet a cmdletek paramtereivel? Gpeljk be a kvetkezt:
PS C:\> Get-ChildItem -<tab>

Taln mr nem is meglep, hogy a lehetsges paramterek listjn is vgiglpkedhetnk, hogy a megfelelt knnyebben kivlaszthassuk kzlk. A paramterek megadsval kapcsolatban itt emltnk meg egy msik lehetsget is (br nem kell hozz TAB). Egyszeren annyi a teendnk, hogy egyltaln nem adunk meg paramtert, mivel ebben az esetben a parancs indtsa eltt a PowerShell szp sorban bekri a ktelez paramtereket:
PS C:\> New-Alias Supply values for the following parameters: Name: ga Value: Get-Alias

Hamarosan rszletesen megismerkednk a PowerShell vltozk rejtelmeivel s az objektumok hasznlatval, most csak egy kis elzetes kvetkezik a TAB-billenty kapcsn. Ha a PowerShell munkamenetben sajt vltozkat definilunk, a TAB ezek nevnek kiegsztsre is kpes, amint az albbi pldn lthat:
PS C:\> $ezegynagyonhosszunevuvaltozo = 1 PS C:\> $ez<tab>

gyes! s mi a helyzet a .NET vagy COM-objektumok tulajdonsgaival s metdusaival? A TAB-billenty ebben az esetben is kszsgesen segt:
PS PS PS PS C:\> C:\> C:\> C:\> $s = "hell" $s.<tab> $excel = new-object -comobject excel.application $excel.<tab>

Aki mg arra is kvncsi, hogy ezt a sok okossgot mi vgzi el helyettnk, adja ki a kvetkez kt parancsot (termszetesen a TAB-billenty sr nyomkodsval):
PS C:\> Set-Location function: PS Function:\> (get-item tabexpansion).definition

A kpernyn a PowerShell beptett TabExpansion nev fggvnynek kdja jelenik meg; ez fut le a TAB-billenty minden egyes letsekor. A kd most mg taln egy

12

Elmlet
kicsit ijesztnek tnhet, de hamarosan mindenki folykonyan fog olvasni PowerShell-l. A kd azonban nemcsak olvasgatsra j, meg is vltoztathatjuk azt, st akr egy teljesen j, sajt fggvnyt is rhatunk a gyri darab helyett (a fggvnyekrl ksbb termszetesen mg lesz sz).

1.2.7 Promptok, beviteli sor


Lthat, hogy a PowerShell is a parancssorok elejn, amikor tlnk vr valamilyen adatbevitelt, akkor egy kis jelz karaktersorozatot, u.n. promptot r ki. Ez alaphelyzetben gy nz ki:
PS alaphelyzet szerinti knytr elrsi tja\>

Az alaphelyzet szerinti knyvtr nagy valsznsggel a My Documents knyvtrra mutat. Ez a prompt testre szabhat. Itt ebben a knyvben sok helyen ilyen mdostott prompt lthat a pldimnl:
[1] PS I:\>

A PS el biggyesztettem egy nvekv szmot szgletes zrjelek kztt, hogy jobban tudjak hivatkozni az egyes sorokra a magyarz szvegben. A prompt tbbszint, viszont csak 1 szint mlysgig jelzi a >> jellel az alapszinttl eltr mlysget, ennl mlyebb szintekre nincs kln specilis prompt:

8. bra Tbbszint prompt

Ha rzi, hogy kell mg folytatdnia a sornak, >> lesz a prompt. Ha mr ki akarunk szllni a mlyebb szint promptbl, akkor azt egy res sorban lettt Enterrel tehetjk meg. Ha egy hosszabb sort inkbb kln sorba szeretnnk tenni, a visszafeleaposztrf (` AltGr 7) hasznlatos:

13

Kezdetek

9. bra Sortrs Escape (`) karakter utn

Ez az u.n. Escape karakter, ami hatstalantja a kvetkez specilis karakter (itt pl. az Enter) hatst. Amgy nyugodtan folytatdhat a parancssorunk a kvetkez sorban, ha tl hossz. Ha tbb utastst szeretnnk egy sorba berni, akkor a ; karakterrel tudjuk azokat elvlasztani.
[1] PS I:\>"Els utasts"; 1+3; "Vge" Els utasts 4 Vge

1.2.8 Parancstrtnet
A PowerShell ablak megjegyzi a korbban begpelt parancssorainkat. Ezt a parancstrtnet-trat az F7 billentyvel tudjuk megjelenteni. Vigyzat! Ktfajta trtnetsorszmozs van:

10. bra A PowerShell parancstrtnet-tr

Az F7-re megjelen trtnettrban minden tnyleges sor (alpromptok is) kln vannak nyilvntartva. Van azonban egy PowerShell cmdletnk is, a get-history, amiben

14

Elmlet
fpromptonknt kapunk j sorszmot. Radsul a trtnettrbl elhvott parancsok esetben a sorszmok msknt viselkednek a ktfajta elhvs sorn. Az albbi bra azt demonstrlja, hogy elhvtam a 3. parancsot a trtnettrbl. Az F7-es trtnettr ezek utn ezt a parancsot nem jelenti meg jra, azt mutatja, hogy ezt a 3. parancsot egyszer hajtottam vgre. Ezzel szemben a get-history kirta, mint 5. vgrehajtst:

11. bra A megismtelt parancsok nem jelennek meg a trtnettrban

A parancstrtnetbl Enterrel lehet vgrehajtatni a kijellt korbbi parancsot, de gyakran arra van szksgnk, hogy egy rgebbi parancsot kicsit mdostva hajtsuk jra vgre. Ekkor ne Entert, hanem a jobbnylt nyomjuk meg.

15

Kezdetek

1.2.9 A PowerShell, mint szmolgp


A PowerShell alaphelyzetben szmolgpknt is mkdik:

12. bra Szmolsi mveletek a PowerShell ablakban

Ltszik a fenti brn, hogy tmogatja az alapmveleteket s a leggyakoribb szmtstechnikban elfordul mrtkegysgeket: kb, mb, gb. Ezeket szmmal egyberva kell hasznlni, klnben hibajelzst kapunk. A % a maradkos osztst vgzi. Sajnos a terabjtot nem tmogatja, s ahogy a fenti hibajelzsekbl is lthat, a mrtkegysgek nllan nem llhatnak, mindig szmmal kell bevezetni, mg akkor is, ha egyrl van sz.

1.2.10 A konzol trlse


Ha mr jl telertuk a PowerShell ablakot, s szeretnnk, ha res lenne jra, akkor futtassuk a Clear-Host cmdletet. Ennek van kt gyakran hasznlt lneve is: cls, clear.

1.2.11 Kis-nagybet
A PowerShell a legtbb esetben nem klnbzteti meg a kis- s nagybetket. A parancsokat, kifejezseket akr kis, akr nagybetkkel berhatjuk. De mg az ltalunk ltrehozott vltoznevek tekintetben is figyelmen kvl hagyja ezt:
[2] PS I:\>$kis = 1 [3] PS I:\>$KIS 1 [4] PS I:\>get-command get-help

16

Elmlet

CommandType ----------Cmdlet

Name ---Get-Help

Definition ---------Get-Help [[-Name] <String>...

[5] PS I:\>GET-COMMAND get-HELP CommandType ----------Cmdlet Name ---Get-Help Definition ---------Get-Help [[-Name] <String>...

Az sszehasonltsoknl sincs alaphelyzetben szerepe a bet mretnek, termszetesen itt majd ezt az alapmkdst fellbrlhatjuk, hogy a kis-nagybetket tekintse klnbznek:
[6] PS I:\>"alaphelyzet" -eq "ALAPHELYZET" True [7] PS I:\>"kis-nagybet rzkeny" -ceq "kis-NAGYbet rZKeNy" False

A fenti pldban az alaphelyzet szerinti egyenlsget vizsgl opertor nem kisnagybet rzkeny, ha rzkeny vltozatot szeretnnk hasznlni, akkor az a c eltaggal (azaz a case-sensitive) kln jelezni kell. Az sszehasonlts mveletrl az 1.6 Opertorok fejezetben lehet bvebben olvasni.

17

Segdprogramok

1.3 Segdprogramok
Ha kezdk vagyunk PowerShellben, akkor mindenkppen rdemes felszerelkeznnk nhny hasznos segdprogrammal, amelyek megknnytik a munknkat s a tanulsi folyamatot. Ebben a fejezetben nhny ilyen programot mutatok be, amelyek tbbsge ingyenesen letlthet, hasznlhat, vagy legalbbis van ingyenes prbavltozata.

1.3.1 PowerGUI, PowerGUI Script Editor


A PowerShellhez az egyik legpraktikusabb segdprogram a Quest Software PowerGUI csomagja. Ez kt f programbl ll. Az els maga a PowerGUI, ami j nhny elre elksztett PowerShell parancsot tartalmaz egy fastruktrba fzve:

13. bra A PowerGUI fellete

A fastruktra egybknt bvthet, pldul Active Directory elemekkel, attl fggen, hogy milyen bvtmnyeket teleptettnk a gpnkre, s mi magunk is kszthetnk hozz faelemeket. A programban az ikonnal jelzett faelemek mgtt PowerShell szkriptek vannak:

18

Elmlet

14. bra A PowerGUI faelemek mgtti PowerShell parancsok

Ez lehet egy egyszer PowerShell parancs, n. cmdlet, mint a Processes-nl, vagy bonyolultabb szkript, mint a Services-nl. Az ablak aljn a PowerShell Code flre kattintva meg lehet figyelni, hogy pontosan mit hajt vgre a PowerGUI amikor kattintgatunk a felletn:

15. bra A PowerGUI ltal vgrehajtott parancsok

Pldul a fenti kpen, kzptjon ltszik, hogy amikor a processzek listjn a ProcessName oszlopra kattintottam, akkor erre egy get-process | Sort-Object -property ProcessName parancs hajtdott vgre. Kezdknt sokat lehet tanulni ebbl. Illetve az oszlopfejlcen jobb egrgombbal kattintva lehet krni egy ilyen listt:

19

Segdprogramok

16. bra Oszlopok, azaz tulajdonsgok kivlasztsa

Ez mutatja, hogy az adott parancs kimeneteknt kapott objektumtpusnak milyen tulajdonsgai, property-jei vannak. A msik eszkz a PowerGUI csomagban a Script Editor. Ez nagyon nagy szolglatot tesz a PowerShell-t tanulknak, hiszen ahogy gpeljk a parancsokat rgtn szintaxisellenrzst vgez, klnbz sznnel jelli a klnbz fajtj szvegelemeket (parancs, kifejezs, vltoz, sztring, stb.) Gpels kzben a lehetsges parancsokat egy listban azonnal megjelenti, a parancsok argumentumlistjt kis felugr ablakban kirja. F1-re az adott parancs helpjt is megjelenti.

17. bra Help s parancskivlaszt a PowerGUI Script Editorban

20

Elmlet
Az ablak fels rszben szerkeszthetjk a kdot, bal als rszben lthatjuk vltozinkat s azok rtkt, a jobb als rszben a futtatott kd kimenett olvashatjuk.

1.3.2 RegexBuddy
Ksbb fogunk foglalkozni a regulris kifejezsekkel, amelyek a sztringek sszehasonltsban, vizsglatban segtenek. Pl. meg lehet ilyen kifejezsek segtsgvel llaptani, hogy egy szveg vajon e-mailcmet tartalmaz-e, vagy pl. telefonszmot. Regex kifejezsekkel ki lehet nyerni szvegekbl adott formtum, adott mintra illeszked karaktersorozatokat. Regex kifejezseket rni nem egyszer, ebben segt a RegexBuddy.

18. bra Bartunk a RegexBuddy

Az ablak fels rszn lthat, hogy kivlaszthatjuk a regex kifejezsnk tjszlst, ami a PowerShell esetben .NET. Ez alatt van a szerkeszt fellet, legalul meg egy flrendszeren sok minden. A Create fl rtelmezst adja a regex kifejezsemnek, s regex elemeket, u.n. tokeneket is hozz tudok fzni. Ami mg rdekes szmunkra a Test fl, ahol minta sztringeket tudok begpelni s ellenrizni tudom, hogy a regex mintm illeszkedike arra, amire kellene, illetve nem illeszkedik-e arra, amire nem kell. Hasznos segtsget nyjt a Library fl, ahol sok problma megoldshoz vannak elre elksztett regex kifejezsek, amiket segtsgl tudunk hvni s testre tudjuk szabni a sajt ignyeinknek megfelelen.

1.3.3 Reflector
A PowerShell a .NET Frameworkre pl, a keretrendszer osztlyaival, objektumaival dolgozik, gy fontos tudni, hogy a keretrendszerben mi tallhat. A Visual Studio termszetesen az Object Browser-vel segt a .NET osztlyok feldertsben, de a PowerShell felhasznlk zme nem fejleszt, nincs szksgk ltalban a Visual Studiora, s csak az Object Browser miatt telepteni azt elg nagy luxus.

21

Segdprogramok
Az interneten Lutz Rder jvoltbl elrhet egy Reflector nev kis ingyenes program (http://www.aisto.com/roeder/dotnet/ ), amellyel helyettesteni lehet az Object Browsert. Radsul ez tartalmaz egy PowerShell add-in-t, amivel PowerShell szintaxisra lehet lefordtani a .NET-es objektumokat.

19. bra Rendszergazdk Object Browsere: .NET Reflector

Ha talltunk olyan .NET osztlyt, vagy annak valamilyen tagjt, ami rdekel minket, akkor Ctrl+M billentykombincival kzvetlenl el tudjuk hvni az MSDN website megfelel lapjt, ahol rszletes lerst kapunk a kivlasztott elemnkrl.

1.3.4 PSPlus
A PowerShell Plus hasonl clokat szolgl, mint a PowerGUI Script Editora, csak jval sszetettebb, tbb szolgltatst nyjt.

20. bra PowerShell Plus fellete

22

Elmlet
Ez az eszkz integrl magban az eredeti PowerShell konzolablakhoz nagyon hasonl ablakrszt, lthatjuk a vltozkat s egyb paramtereket. Kln szkriptszerkesztje is van:

21. bra PowerShell Plus Script Editora

Ez az Office 2007 stlus szerkesztfellet hasonl szolgltatsokat nyjt, mint a PowerGUI Script Editora.

1.3.5 MoreMotion Editor


A PowerShellben is elfordul az XML adatformtum, gy rdemes egy Notepad-nl esetleg okosabb XML szerkesztvel felszerelkezni. n egy teljesen ingyenes s teleptst nem ignyl programot talltam erre a clra, a MoreMotion Editort:

22. bra MoreMotion Editor: XML szerkeszt

A fenti kpeken lthat, hogy kt nzete van, az els a forrskd szint nzet, a msodik a fastruktra-nzet, amelyben az XML tag-ek hierarchijt s adattartalmt sokkal jobban t lehet tekinteni. A program rendelkezik szintaxisellenrzsi funkcival, automatikus formzsi lehetsgekkel is.

23

Alapfogalmak

1.4 Alapfogalmak
Mi is a PowerShell? Ketts szerepe van: egyrszt a PowerShell egy parancssori krnyezet, azaz egy olyan program, ahol a felhasznl kapcsolatba lphet a szmtgpes rendszerrel (direkt nem korltozva le az opercis rendszerre!). Ebbl a szempontbl sok olyan szolgltatst kell nyjtania, ami a gyors, knyelmes adatbevitelt, azaz a gpelst szolglja. Msrszt a PowerShell egy programnyelv is, mint ilyennek rendelkeznie kell azokkal a programrshoz szksges elemekkel, mint pldul a ciklus, vltozk, fggvnyek, adatszerkezetek. A PowerShell mindkt szempontot prblja a lehet legjobban kielgteni, tmaszkodik ms, elssorban a Unix s Linux klnbz shelljeire s onnan tveszi a legjobb megoldsokat. De termszetesen ez egy Windowsos shell, teht nem prbl kompatibilis lenni a Unixos shellekkel, hanem inkbb a Windows adottsgaihoz s lehetsgeihez alkalmazkodik, ezen bell is a .NET Framework a legfontosabb alapja. Ellenttben a DOS shellel, a PowerShell nmagban is nagyon sok parancsot tartalmaz. Pldul DOS shellben a fjlok msolst a copy.com vgzi, maga a parancssori krnyezet nem tud fjlt msolni. Ezzel szemben a PowerShellnek van egy copy-item parancsa, u.n. cmdlet-je, amellyel lehet fjlt (de nem csak fjlt!) msolni.

1.4.1 Architektra
A PowerShell teht a .NET Frameworkre pl, az 1.0-s PowerShellhez a 2.0-s .NET Framework szksges. Ez a rpls szmos elnnyel jr, fleg ha azt is tudjuk, hogy a PowerShell objektumokkal dolgozik. Pl. a dir parancsot futtatva nem egyszeren egy karaktersorozatot kapunk vissza vlaszknt, hanem a fjlok, alknyvtrak objektumainak halmazt, u.n. collection-t, gyjtemnyt. Teht kt megjegyzend fogalom: OBJEKTUM, COLLECTION! Mi az, hogy objektum? Olyan kpzdmny, amely tulajdonsgokkal (property) s meghvhat metdusokkal (method) rendelkezik. A hagyomnyos shellek (command.com, cmd.exe, bash, stb.) mindegyikt karakterlnc-orientltnak nevezhetjk; a parancsok bemenete s kimenete (nhny specilis esetet nem szmtva) karakterlncokbl ll. Pldul a cmd.exe esetn a dir parancs kimenete valban s pontosan az a fjl- s mappalistt ler karaktersorozat, amely a kpernyn megjelenik, se tbb, se kevesebb. Ez bizonyos szempontbl j, hiszen gy azt ltjuk, amit kapunk. Msrszrl viszont csak azt kapjuk, amit ltunk, ez pedig sajnos nem tl sok. A PowerShell adatkezelse azonban alapjaiban klnbzik ettl; az egyes parancsok bemenete s kimenete is .NET osztlyokon alapul objektumokbl (objektumreferencikbl) ll, vagyis a kirtakon kvl tartalmazza a .NET objektum szmtalan msik tulajdonsgt is. Amint lthattuk, a dir parancs kimenete itt is a kpernyre kirt fjl s mappalistnak tnik, de ez csak egyszer rzki csalds, a kimenet valjban egy System.IO.DirectoryInfo s System.IO.FileInfo osztly objektumokbl ll gyjtemny. Mivel azonban az objektumok nem alkalmasak emberi fogyasztsra,

24

Elmlet
kpernyn val megjelentsk termszetesen szveges formban, legfontosabb (illetve kivlasztott) jellemzik felsorolsval trtnik. A fentiekbl nyilvnvalan kvetkezik az objektumorientlt megkzelts kt fontos elnye; egyrszt a parancsok kimenete rengeteg informcit tartalmaz, amelyeket szksg esetn felhasznlhatunk, msrszt nincs szksg szvegfeldolgoz parancsok s eszkzk hasznlatra, ha a kimenetknt kapott adathalmazbl csak egy meghatrozott informcidarabra van szksgnk, mivel minden egyes adatmez egyszeren a nevre val hivatkozssal, nllan is lekrdezhet. Kpzeljk el pldul, hogy a dir parancs ltal produklt fenti listbl szvegfeldolgoz parancsokkal kell kivlasztanunk azokat a fjlokat (mappkat nem), amelyek 2007. prilis 12-e utn mdosultak. Jaj. Persze megoldhat a feladat, de helyesen fog lefutni az a szkript egy nmet nyelv Windowson is? (s akkor pldul a knai nyelv rendszerekrl mg nem is beszltnk.) Ha viszont a kimenet objektumokbl ll, akkor termszetesen egyltaln nincs szksg a megjelen szveg feldolgozsra, mert minden egyes objektum tudja magrl, hogy fjl, vagy mappa, s az opercis rendszer nyelvtl fggetlenl, DateTime objektumknt adja vissza az utols mdostsnak idejt. Most egyelre - klnsebb magyarzat nlkl - nzzk, hogy egy fjl milyen objektumjellemzkkel, tagjellemzkkel (member) br, a get-member cmdlet futtatsval:
[2] PS C:\> get-item szamok.txt | get-member TypeName: System.IO.FileInfo Name ---AppendText CopyTo Create ... Delete ... MoveTo ... Attributes CreationTime CreationTimeUtc Directory DirectoryName Exists Extension FullName IsReadOnly LastAccessTime LastAccessTimeUtc LastWriteTime LastWriteTimeUtc Length Name BaseName Mode MemberType ---------Method Method Method Method Method Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property ScriptProperty ScriptProperty Definition ---------System.IO.StreamWriter AppendTe... System.IO.FileInfo CopyTo(Strin... System.IO.FileStream Create() System.Void Delete() System.Void MoveTo(String destF... System.IO.FileAttributes Attrib... System.DateTime CreationTime {g... System.DateTime CreationTimeUtc... System.IO.DirectoryInfo Directo... System.String DirectoryName {get;} System.Boolean Exists {get;} System.String Extension {get;} System.String FullName {get;} System.Boolean IsReadOnly {get;... System.DateTime LastAccessTime ... System.DateTime LastAccessTimeU... System.DateTime LastWriteTime {... System.DateTime LastWriteTimeUt... System.Int64 Length {get;} System.String Name {get;} System.Object BaseName {get=[Sy... System.Object Mode {get=$catr =...

25

Alapfogalmak
ReparsePoint ScriptProperty System.Object ReparsePoint {get...

Mint ahogy egy fjltl elvrhatjuk, msolhatjuk (CopyTo), trlhetjk (Delete) s egy csom jellemzjt kiolvashatjuk: utols hozzfrs idejt (LastAccessTime) s hosszt (Length). Azaz ezekhez a tevkenysgekhez nem kell kls program, mg csak kln PowerShell parancs sem, maga az objektum tudja ezeket. Pl. a trls:
[3] PS C:\> (get-item szamok.txt).Delete()

Visszatrve pl. a dir parancs futtatsra, ltalban egy knyvtrban nem egy fjl vagy alknyvtr van, hanem tbb. Ebben az esetben a PowerShell a parancs vgrehajtsa sorn egy u.n. collection-t, azaz egy objektumhalmazt, objektumgyjtemnyt vagy ms kifejezssel objektumtmbt kapunk vissza. Ennek a halmaznak radsul nem felttlenl kell egyforma tpus elemekbl llnia, mint ahogy egy knyvtrban is lehetnek fjlok is s alknyvtrak is. A PowerShell az ilyen collection-k, azaz gyjtemnyek feldolgozsra nagyon sok praktikus, nyelvi szint tmogatst ad, amit a ksbbiekben ltni fogunk.

1.4.2 OOP alapok


Az elzekben mr tallkozhattunk azzal a kijelentssel, hogy a PowerShell egy objektumorientlt shell. Els hallsra taln furcsnak tnhet ez a szkapcsolat, mr csak azrt is, mert ilyen egyszeren nem ltezett korbban; a PowerShell az els, s pillanatnyilag az egyetlen ilyen tulajdonsg parancsfeldolgoz. A kvetkezkben ttekintjk, mit is jelent, s milyen kvetkezmnyekkel jr az objektumorientlt felpts. Nzzk meg rszletesebben az objektumorientlt programozshoz kapcsold legfontosabb fogalmakat, amelyek pontos ismeretre a ksbbiekben felttlenl szksgnk lesz.

1.4.2.1 Osztly (tpus)


Az osztlyok az objektumok tervrajzai; tartalmazzk a klnfle funkcikat megvalst programkdot s deklarljk az objektumok adatszerkezeteit. Az osztlyok s objektumok viszonya megegyezik a vltoztpus s konkrt vltoz viszonyval. Ahogyan a vltozhoz tartoz tpus meghatrozza a vltoz lehetsges llapotait, s rajta vgezhet mveleteket, gy hatrozza meg az objektum osztlya a benne trolhat adatokat (tulajdonsgokat), s az ltala elvgezhet mveleteket (metdusokat). Az osztly definilja teht a majdani objektumok adatait, s azokat a mveleteket (eljrsok s fggvnyek), amelyek elvgzsre az osztly alapjn ltrehozott objektum kpes.

26

Elmlet

1.4.2.2 Pldny (objektum)


Az adott osztly (tervrajz) alapjn ltrehozott objektumpldnyok kpesek az osztlyban definilt vltozknak megfelel informci trolsra, s az osztly ltal meghatrozott mveletek (eljrsok s fggvnyek) vgrehajtsra. Minden objektum egy meghatrozott memriaterletet foglal el, itt trolja adatait. Az adatok pillanatnyi rtkt az objektum llapotnak nevezzk. Kt objektum azonban akkor sem azonos, ha llapotuk megegyezik (vagyis valamennyi adatuk rendre egyenl), mivel az objektumot nem az llapota, hanem az ltala elfoglalt memriaterlet kezdcme azonostja. Programjainkban az objektumok teht memriacmknt (objektumreferencia) jelennek meg.

1.4.2.3 Pldnyosts
Az objektum osztlya teht az objektum viselkedst, kpessgeit meghatroz kdbl, s adatainak tpusdefinciibl ll. Pldnyostsnak azt a mveletet nevezzk, amelynek sorn a szksges memriaterletet lefoglalva, egy osztly alapjn objektumot hozunk ltre. Az objektum ltrehozsakor elvgzend mveleteket az adott osztlyban definilt specilis fggvny, az osztly konstruktora hatrozza meg. Az osztly alapjn ltrehozott objektum adatszegmense a konstruktornak tadott paramterlista, vagy ms adatforrs alapjn a pldnyosts sorn, vagyis az objektum ltrehozsa kzben tltdik fel. Programunk szempontjbl a pldnyosts vgtermke egy memriacmet tartalmaz vltoz (objektumreferencia, mutat, pointer); a kvetkezkben ennek segtsgvel rhetjk el az adott pldny adatait, s hvhatjuk meg az osztlyban definilt eljrsokat s fggvnyeket. Ha egyszerre tbb azonos osztly objektumot is hasznlunk, az objektumok kdja csak egyetlen pldnyban kerl a memriba (hiszen ez minden azonos osztlyba tartoz objektum esetn felttlenl egyforma), de termszetesen az adatszegmens minden objektum esetben nllan ltezik. Minden objektum tartalmaz egy referencit (this), amely az osztlyt azonostja, ennek felhasznlsval hvhatja meg az osztlyban trolt metdusokat.

1.4.2.4 Metdusok s vltozk


Az osztlyokban definilt fggvnyeket s eljrsokat az osztly, illetve az osztly alapjn ltrehozott objektum metdusainak nevezzk. Ugyangy, az osztlyok vltozit statikus vltozknak, a

1.4.2.5 Pldnyvltoz, pldnymetdus


Azokat a vltozkat, amelyek objektum-pldnyonknt kln memriaterletre kerlnek pldnyvltozknak, a pldnyvltozkat felhasznl metdusokat pedig pldnymetdusoknak nevezzk. Ha meghvjuk egy objektum pldnymetdust, akkor a metdus kdja az osztlybl szrmazik ugyan, az elvgzett mveletek viszont ltalban az

27

Alapfogalmak
objektum pldny sajt adatait fogjk felhasznlni, vagyis megvltoztatjk az objektum llapott.

1.4.2.6 Statikus vltoz, statikus metdus


Bizonyos vltozk nem egy konkrt objektum-pldnyra, hanem az egsz osztlyra jellemzk. Az ilyen kzs, az egsz osztlyra jellemz vltozkat osztlyvltozknak, vagy statikus vltozknak nevezzk. A statikus vltozk rtke minden pldny esetn megegyezik, ezrt csak egy helyen kell trolni, minden pldny ezt az egy memriaterletet ri el. Osztlymetdusnak, vagy statikus metdusnak nevezzk azokat a metdusokat, amelyek objektum-pldny nlkl, kzvetlenl az osztlyra val hivatkozssal futtathatk. A statikus metdusok csak a statikus vltozkat rik el a pldnyvltozkat nem. Teht a pldnyvltozkat csak a pldnymetdusok rik el, mg a statikus vltozkat a statikuss pldnymetdusok egyarnt hasznlhatjk.

1.4.2.7 Vltozk elrejtse


Az objektumok egyik fontos tulajdonsga, hogy a klvilg szmra csak azokat a metdusokat (s ritkn adatokat) teszi elrhetv, amelyek felttlenl szksgesek az objektum hasznlathoz. Az objektum teht egy jl meghatrozott interfszen keresztl rhet el, amelyet termszetesen az osztly kszti igyekeznek a lehet legkisebbre kszteni. Az osztlyokban definilt vltozk ltalban csak metdusokon keresztl, vagyis ellenrztt mdon rhetk el. Ezzel megakadlyozhat az objektum llapotnak elrontsa, azaz minden adatmeznek csak olyan rtk adhat, amelynek trolsra azt a programoz sznta. Elnys tovbb az is, hogy ilyen mdon az osztly teljes bels adatszerkezete lecserlhet anlkl, hogy az osztlyt hasznl komponenseknek errl tudniuk kellene.

1.4.2.8 Overloaded metdusok


A metdus szignatrja a nevn kvl tartalmazza paramtereinek szmt s az egyes paramterek tpust is. A metdusokat a fordtprogram nem pusztn a nevk, hanem a szignatrjuk alapjn azonostja, vagyis egy osztlyon bell lehet tbb azonos nev, de eltr paramterlistj metdus is. A metdus meghvsakor a fordt a nv s az aktulisan tadott paramterek alapjn vlasztja ki azt a metdust, amelyik le fog futni. Ilyen metdusokkal igen gyakran fogunk tallkozni a .NET keretrendszer osztlyaiban is. A je3 lensget method overloading -nak, azaz metdus-jratltsnek, -felltltsnek, -fellbrlsnak nevezzk.

Sajnos erre a kifejezsre nincsen j magyar sz, a szoksosan hasznlt tlterhelt metdus kifejezs inkbb valamifle elmegygyszati diagnzisra emlkeztet.

28

Elmlet

1.4.2.9 rklds
Az rklds kt osztly kztt rtelmezett kapcsolat, azt fejezik ki, hogy az egyik osztly (az utd) specializlt vltozata a msiknak, az sosztlynak. A specializls sorn egy mr meglv objektum lershoz, tervrajzhoz, j, egyedi jellemzket s kpessgeket adunk hozz. A specializlt osztly teht rkli az sosztly adatait s metdusait, de az rkls sorn ezekhez jabbakat is hozzadhatunk, illetve mdosthatjuk a meglvket. Egy osztly rktsekor hrom lehetsget hasznlhatunk: j vltozkat adhatunk hozz az sosztlyhoz. j metdusokat adhatunk hozz az sosztlyhoz. 4 Fellrhatjuk az sosztly metdusait.

1.4.3 Mi is az a .NET keretrendszer


A .NET mr sok ve velnk van, s a hrom bet valsznleg mindenkinek ismersen cseng, de taln nem flsleges rviden ttekinteni, hogy pontosan mirl is van sz, s mirt j neknk ez az egsz. A .NET Framework a Windows opercis rendszerekbe egyre szorosabban integrld komponens, amely az alkalmazsok j genercijnak fejlesztst s futtatst teszi lehetv. A .NET egyszeren az infrastruktra szintjre emeli szmos ltalnos feladat megoldst, amelyekkel korbban minden programoznak magnak kellett jl-rosszul megkzdenie. Aki ismeri s betartja a szablyokat, az hasznlhatja az infrastruktrt. A .NET alap programok mr nem kzvetlenl veszik ignybe az opercis rendszer szolgltatsait s nem is kzvetlenl a processzor futtatja ket; egy jabb absztrakcis rteg (ez maga a .NET keretrendszer) kapcsoldott be a jtkba. Ez termszetesen nmi sebessgcskkenst okoz a programfuttats szintjn, de igen jelents sebessgnvekedssel jr, ha a fejlesztsre fordtott idt vesszk figyelembe. A keretrendszer alapveten kt komponesbl ll, ezek a CLR (Common Language Runtime) s a mgtte ll osztlyhierarchia, a Class Library.

1.4.3.1 Futtatkrnyezet (Common Language Runtime, CLR)


A .NET keretrendszer felhasznlsval ksztett programok, egy szoftveres virtulis krnyezetben (CLR) futnak, amely biztostja a programfuttatshoz szksges feltteleket. A CLR egysges futsi krnyezetet biztost a .NET alap programok szmra, fggetlenl attl, hogy azokat milyen programnyelven ksztettk. Elvgzi a memriakezelst s biztostja a programfutshoz szksges egyb alapvet szolgltatsokat, kezeli a programszlakat, biztonsgos futsi krnyezetet ad a programkdnak, s megakadlyozza, hogy a

Az sosztly adatait nem lehet fellrni.

29

Alapfogalmak
futtatott programok brmifle ltala szablytalannak tlt mveletet vgezzenek. A CLR fennhatsga alatt fut programokat felgyelt kdnak (managed code) nevezzk. A CLR biztostja a programnyelvek kztti teljes egyttmkdst, gy lehetv vlik a klnbz nyelveken megrt komponensek problmamentes egyttmkdse is. A CLR szigor tpusrendszerre pl, amelyhez minden CLR-kompatibilis programnyelvnek alkalmazkodnia kell. Ez azt jelenti, hogy az adott nyelv minden elemnek (tpusok, struktrk, elemi adattpusok) a CLR ltal ismert tpusokk konvertlhatnak kell lennie. Tovbbi felttel, hogy a fordtprogramoknak a kdban lv tpusokat s hivatkozsokat ler metaadatokat kell elhelyeznik a lefordtott llomnyokban. A CLR ezek felhasznlsval felgyeli a folyamatokat, megkeresi s betlti a megfelel osztlyokat, elhelyezi az objektum-pldnyokat a memriban, stb. A CLR minden erforrst az adott folyamat szmra ltrehozott felgyelt heap-en (halom) helyez el. A felgyelt heap hasonl a hagyomnyos programnyelvek ltal hasznlt heap-hez, de az itt ltrehozott objektumokat nem a programnak kell megszntetnie, a memria felszabadtsa automatikusan trtnik, ha az adott objektumra mr nincs tbb szksg. A .NET egyik fontos szolgltatsa a szemtgyjt (Garbage Collector, GC), amely kpes a hivatkozs nlkl maradt objektumok felkutatsra, s az ltaluk lefoglalt memriaterlet felszabadtsra.

1.4.3.2 Class Library (osztlyknyvtr)


A Class Library egy tbb ezer(!) osztlybl ll gyjtemny, amelyek segtsgvel szinte brmilyen feladatot megoldhatunk, lehetv teszi parancssori, grafikus, vagy webes felletet, hlzati s biztonsgi szolgltatsokat hasznl alkalmazsok fejlesztst. Segtsgvel gyakorlatilag a Windows rendszerek valamennyi szolgltatsa a korbbinl lnyegesen egyszerbb formban elrhetv vlik. A Class Library lehetv teszi szinte az szszes, eddig csak a Win32 API segtsgvel megvalsthat szolgltats hasznlatt, s mg tbb ezer ms feladatra is megoldst ad. Megtallhatjuk benne a klasszikus algoritmusok (rendezsek, keressek, stb.) megvalstst, valamint rengeteg gyakori feladat szinte ksz megoldst is. A Class Library-t termszetesen brmely .NET-kpes programnyelvbl hasznlhatjuk, a nyelvek kztti klnbsg gy tulajdonkppen szinte jelentktelen szintaktikai klnbsgg vlik, a lnyeg, az osztlyknyvtr azonos, brmelyik nyelvet (vagy akr a PowerShellt) is hasznljuk.

1.4.3.3 Programnyelvek
A CLR ltal nyjtott szolgltatsokat a Visual Basic, a C#, a Visual C++, s a Jscript programnyelvekbl, nhny kls gyrt ltal fejlesztett nyelvbl (pldul Eiffel, Perl, COBOL stb.), illetve most mr a PowerShellbl is elrhetjk. A szksges fordtprogramok parancssori vltozatai megtallhatk a .NET Framework SDK csomagban klnfle egyb eszkzkkel egytt (debugger, disassembler stb.). Ilyen mdon a .NET alap programok ksztshez nincs felttlenl szksg integrlt fejleszti krnyezetre (pldul a

30

Elmlet
Visual Studiora), elvben brmilyen alkalmazst elkszthetnk a notepad.exe s a megfelel fordtprogram felhasznlsval.

1.4.3.4 Programfordts
A .NET fordtprogramjai forrskdunkat egy kztes nyelvre (Intermediate Language, IL) fordtjk. Az IL olyan processzorfggetlen kd, amely igen hatkonyan fordthat tovbb egy adott platform gpi kdjv. A compilerek kimenete teht az IL-kd, amit a fordtprogram exe, vagy dll llomnyba csomagol. Az elksztett exe llomnyok a felhasznl szempontjbl a szoksos mdon futtathatk, a httrben azonban termszetesen egszen ms trtnik.

1.4.3.5 Programfuttats
Mivel a processzor csak natv programok futtatsra kpes, az IL llomnyt vgrehajts eltt gpi kdd kell fordtani. A gpi kd ellltst a futsidej fordt (just-in-time compiler, JIT) vgzi el, de csak akkor, ha az adott kd valban le is fog futni. Az IL llomnyba irnyul minden metdushvs az els alkalommal meghvja a JIT-fordtt, ami gpi kdd alaktja az adott metdust, ezt futtatja majd a processzor. Ha jra meghvjuk ugyanazt a metdust, mr nincs szksg fordtsra, kzvetlenl az eltrolt gpi kd vltozat fog lefutni. gy az egyes metdusokat csak egy alkalommal kell lefordtani, ami jelentsen gyorsthatja a programok futst. Tovbbi idmegtakartst jelent, hogy a nem hasznlt IL-kdot a JIT egyltaln nem fordtja le. Amikor az alkalmazs lell, a generlt gpi kd automatikusan trldik, jraindts utn teht jra szksg van a metdusok futsidben trtn fordtsra. A JIT fordt termszetesen minden tmogatott processzor-architektrra rendelkezsre ll, gy a fordtprogramok ltal ksztett IL-kd vltoztats nlkl futtathat a 5 klnbz architektrj szmtgpeken.

1.4.3.6 Assemblyk (kdkszletek)


A .NET-ben az assemblyk jelentik az alapvet teleptsi, verzikvetsi s biztonsgi egysget. Az assembly tbb fizikai dll-t s esetleg ms fjlokat egy nll logikai egysgben gyjt ssze. Az assemblykben lv fizikai dll-ek a modulok, amelyekben minden esetben IL-kd tallhat. Az assembly ezen fell nler adatokat (manifest) is tartalmaz, ami metaadatok formjban rja le az assemblyben tallhat kdot s egyb erforrsokat. Ha egy assemblyt tbb alkalmazs is hasznl, akkor azt egy specilis helyre, a .NET globlis assembly gyorsttrba (Global Assembly Cache, GAC) kell helyeznnk az SDK gacutil.exe programjnak segtsgvel. Az osztott hasznlat assemblyk nyilvnos kulcs titkostssal biztostjk nevk egyedisgt.

Persze csak akkor, ha nincs benne olyan API hvs, amely csak az adott platformon ltezik.

31

Alapfogalmak

1.4.3.7 rtk- s referenciatpusok


A .NET keretrendszerben kt alapveten eltr tpussal tallkozhatunk. Az rtk tpusok (ilyen pldul az int, a byte, vagy a char) a veremmemriban jnnek ltre, s helyk automatikusan felszabadul, amikor a deklarl kdblokk vget r, vagyis nincs szksgk a szemtgyjt szolgltatsaira. Ha rtkadsban hasznljuk ket, akkor nem egy rjuk mutat referencia, hanem tnyleges rtkk msoldik t. Minden egyes rtk tpus vltozhoz sajt, nll memriaterlet tartozik, vagyis az egyik vltozn vgzett mvelet egyetlen msik vltoz tartalmt sem vltoztathatja meg. Sajt magunk is ltrehozhatunk rtk szerinti tpusokat a struct kulcsszval. Ilyen struktra pldul az int tpushoz tartoz System.Int32 is, amely az osztlyokhoz hasonlan adatmezket s metdusokat is tartalmazhat. A referenciatpusok nem magt az adatot, hanem egy memriacmre val hivatkozst trolnak. Egy memriacmre tbb hivatkozs is mutathat, teht egy referencin (vagyis az ltala mutatott objektumon) vgzett mveletek a tbbi referencit is rintik. A referenciatpusokat a new opertorral hozzuk ltre, s azok a szemtgyjt (GC) ltal kezelt memriba kerlnek (vagyis a felgyelt heap-re). Amikor az rtkadsokban referenciatpusokat hasznlunk, mindig csak a referencia rtke msoldik t, a valdi objektumhoz nem nylunk hozz. Valamennyi rtk s referenciatpus elrhet System.Object osztly referencia segtsgvel. Ha az rtk szerinti tpust referencin keresztl rjk el, akkor a fordt olyan kdot hoz ltre, amely a tpusnak megfelel memrit a heap-en foglalja le, s tmsolja ide a vltoz tartalmt a verembl. Ezt az eljrst Boxing-nak (dobozolsnak) nevezzk.

1.4.4 COM-objektumok
A Component Object Model (COM) a komponens alap rendszerek fejlesztsnek Microsoft fle szabvnya. Lehetv teszi, hogy a COM-gyfelek binris szinten hvjanak meg olyan fggvnyeket, amelyeket a COM-objektumok szmukra elrhetv tesznek. A COM-objektumok mindegyike egyedileg azonosthat, nll komponens, a klnfle alkalmazsok, s ms komponensek egy jl meghatrozott csatolfelleten keresztl vehetik ignybe az adott komponens szolgltatsait. A Microsoft is COM-komponensekkel tette lehetv a hozzfrst az opercis rendszer fggvnyeihez, gy a rendszerfelgyelettel kapcsolatos szkriptek igen jelents rsze hasznl COM-objektumokat; segtsgkkel rhetjk el a rendszer klnfle elemeit, jrahasznosthatjuk a mr ltez, elre megrt funkcikat. PowerShell esetn gyakran mg akkor is COM-objektumot hasznlunk, amikor ltszlag nem, mivel a .NET rendszerfelgyelettel kapcsolatos osztlyainak legtbbje titokban szintn a megfelel COM-objektum metdusait hvogatja (ADSI, WMI, stb.). A szkriptjeinkben hasznlt COM-objektumok mindegyike teht olyan funkcionalitsgyjtemny, amelyet gondos kezek elre elksztettek, s jl felhasznlhat formban

32

Elmlet
sszecsomagoltak szmunkra. Ezek az objektumok szinte minden esetben binris formban lteznek, gpnkn egy dinamikusan csatolt knyvtr (dll), vagy Active-X kontroll (ocx) kpben tallhatk meg. Szerencsre a COM-objektumok bels felptsrl, adatszerkezeteirl semmit nem kell tudnunk ahhoz, hogy megrhassuk a velk kommunikl szkriptet, s felhasznlhassuk a bennk rejtz kpessgeket. Az objektumokkal val kommunikci metdusaik meghvst s tulajdonsgaik belltst jelenti; a rendszerfelgyeleti szkriptek legfontosabb funkcii ilyen mdon valsthatk meg.

1.4.4.1 Tpusknyvtrak
Tpusknyvtrnak az olyan csomagokat (dll vagy ocx fjlok) nevezzk, amelyek tbb, ltalban egymssal szoros kapcsolatban ll osztlybl llnak. A tpusknyvtr hasznlatval az abban szerepl osztlyok mindegyike alapjn ltrehozhatjuk a megfelel objektumot, azaz elvgezhetjk az osztly pldnyostst.

1.4.5 Command s cmdlet


A PowerShellben a parancsokat cmdlet-nek (kommandlet) hvjuk. Hogy mirt? Valszn megklnbztetsl a DOS-os parancsoktl, amelyek valjban kls programok meghvst jelentik (pl.: netsh netsh.exe, attrib attrib.exe). Lnyeg, hogy a cmdletek a PowerShell sajtjai, egysges szerkezetet alkotnak ige-fnv formban. Ezeket a get-command cmdlettel ki is listzhatjuk:
[4] PS C:\> get-command CommandType ----------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet ... Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Name ---Add-Content Add-History Add-Member Add-PSSnapin Clear-Content Clear-Item Write-Debug Write-Error Write-GZip Write-Host Write-Output Write-Progress Write-Tar Write-Verbose Write-Warning Write-Zip Definition ---------Add-Content [-Path] <Strin... Add-History [[-InputObject... Add-Member [-MemberType] <... Add-PSSnapin [-Name] <Stri... Clear-Content [-Path] <Str... Clear-Item [-Path] <String... Write-Debug [-Message] <St... Write-Error [-Message] <St... Write-GZip [-Path] <String... Write-Host [[-Object] <Obj... Write-Output [-InputObject... Write-Progress [-Activity]... Write-Tar [-Path] <String[... Write-Verbose [-Message] <... Write-Warning [-Message] <... Write-Zip [-Path] <String[...

Emltettem, hogy a cmdletek a PowerShell sajtjai, teht nem kls programok, de ez termszetesen nem azt jelenti, hogy kls programokat nem lehet meghvni. s azt sem jelenti, hogy csak a PowerShell teleptsvel ltrejv cmdleteket hasznlhatjuk, ilyene-

33

Alapfogalmak
ket mi is rhatunk vagy klnbz gyrtk ltal (pl.: PowerShell Community Extensions: http://www.codeplex.com/PowerShellCX) ksztett cmdleteket is bepthetnk a PowerShellbe, de innentl kezdve ezek a cmdletek is a PowerShell sajtjaiv vlnak. Termszetesen arra is lehetsg van, hogy magunk hozzunk ltre cmdleteket, de ez olyan mlyen bevinne minket az igazi programozk veszlyekkel teli fldjre, hogy ebben knyvben nem foglakozunk a tmval. Akit mgis rdekel a dolog, s elegend btorsgot is rez magban, az pldul elolvashatja a Professional Windows PowerShell Programming - Snap-ins, Cmdlets, Hosts, and Providers cm knyvet, ami a Wiley Publishing, Inc. gondozsban jelent meg 2008-ban angol nyelven. Ezen kvl a PowerShellben vannak kifejezsek s egyb nyelvi elemek, amelyekkel a kvetkezkben foglalkozom.

1.4.6 Segtsg! (Get-Help)


A PowerShell kiterjedt bels sgrendszerrel rendelkezik, a sgtmk teljes listjt a get-help paranccsal krhetjk le:
PS C:\> get-help * Name ---ac asnp clc cli clp ... Category -------Alias Alias Alias Alias Alias Synopsis -------Add-Content Add-PSSnapin Clear-Content Clear-Item Clear-ItemProperty

A megjelen listban szerepel valamennyi alias, cmdlet, provider s szmos olyan sgtma, amely nem konkrt utastshoz, hanem valamely PowerShell-beli fogalomhoz kthet. A lista egyes elemeihez tartoz sgtma a kvetkez paranccsal krhet le:
PS C:\> get-help <alias, cmdlet, provider, helpfile>

Ha a Get-Help helyett a help fggvnyt hasznljuk, akkor a szveget oldalakra trdelve lthatjuk. Ha nem tudjuk a keresett funkcihoz tartoz cmdlet teljes nevt, megtippelhetjk a kttag kifejezs egyik felt, vagy brmilyen tredkt, s ez alapjn is krhetnk segtsget. Az albbi utasts pldul kilistzza valamennyi Service vgzds parancsot:
PS C:\> get-help *-service Name ---Get-Service Stop-Service Start-Service Category -------Cmdlet Cmdlet Cmdlet Synopsis -------Gets the services on ... Stops one or more run... Starts one or more st...

34

Elmlet
Suspend-Service Resume-Service Restart-Service Set-Service New-Service Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Suspends (pauses) one... Resumes one or more s... Stops and then starts... Changes the display n... Creates a new entry f...

A megjelen listbl a pontos nv s a rvid lers alapjn mr knnyen kivlaszthatjuk a megfelelt. Az egyes cmdletek sgoldalai ngy klnbz nzetben is megjelenthetk. A nzetet a Get-Help paramtereivel vlaszthatjuk ki. Alaprtelmezs szerint egy rvidtett, gyors ttekintsre alkalmas vltozat jelenik meg. A -detailed paramter hasznlatval egy bvebb vltozat, az -example paramter hatsra csak a mintapldk (ezek nagyon hasznosak lehetnek), a -full paramter segtsgvel pedig teljes sgtma jelenthet meg. A PowerShellben nagyon sok fogalom is van, szerencsre ezekre is van sg-tma. Ezeket about_ eltaggal lttk el:
[6] PS C:\> get-help about_* Name ---about_alias about_arithmetic_opera... about_array about_assignment_opera... about_associative_array about_automatic_variables about_break about_command_search about_command_syntax about_commonparameters about_comparison_opera... about_continue about_core_commands about_display.xml about_environment_vari... about_escape_character about_execution_enviro... about_filter about_flow_control about_for about_foreach about_function about_globbing about_history about_if about_line_editing about_location about_logical_operator about_method about_namespace about_object about_operator about_parameter Category -------HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile Synopsis -------Using alternate names... Operators that can be... A compact data struct... Operators that can be... A compact data struct... Variables automatical... A statement for immed... How the Windows Power... Command format in the... Parameters that every... Operators that can be... Immediately return to... Windows PowerShell co... Controlling how objec... How to access Windows... Change how the Window... Factors that affect h... Using the Where-Objec... Using flow control st... A language command fo... A language command fo... Creating and using fu... See Wildcard Retrieving commands e... A language command fo... Editing commands at t... Accessing items from ... Operators that can be... Using methods to perf... Namespaces maintained... Working with objects ... Types of operators su... Working with Cmdlet p...

35

Alapfogalmak
about_parsing about_path_syntax about_pipeline about_property about_provider about_pssnapins about_quoting_rules about_redirection about_ref about_regular_expression about_reserved_words about_scope about_script_block about_shell_variable about_signing about_special_characters about_switch about_system_state about_types about_where about_while about_wildcard HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile HelpFile How the Windows Power... Full and relative pat... Combining commands in... Using object properti... Windows PowerShell pr... A Windows PowerShell ... Rules for setting the... Redirecting output fr... How to create and use... Using regular express... Words in the Windows ... The visibility a func... Grouping statements a... Variables that are cr... Describes the Windows... The special character... Using a switch to han... Data maintained by th... Extending the .NET ty... Filter objects based ... A language statement ... Using wildcards in Cm...

rdemes ezeket is elolvasni, mert gyakran olyan referenciainformcik is fellelhetk bennk, amelyek ilyen tant jelleg knyvekben nem szerepelnek. Ha valaki nem szeret karakteres konzolon olvasgatni, akkor elksztettk ezen sgtmk grafikus vltozatt is, ami letlthet a PowerShell weboldalrl. Ezzel nem csak jobban olvashat szveget kapunk, hanem a teljes szveges keress s a tmk kzti navigci is sokkal egyszerbb vlik.

23. bra PowerShell kln letlthet grafikus sgja

36

Elmlet

1.4.7 Ki-mit-tud (Get-Member)


Korbban mr megllaptottuk, hogy a PowerShellben minden objektum, s mint ilyen, lekrdezhet tulajdonsgok s meghvhat metdusok jl meghatrozott kszletvel rendelkezik. Az egyes objektumok kpessgeinek feldertsre a Get-Member cmdlet szolgl. Korbban, a nem ltez parancsok kiprblsakor mr tallkozhattunk az albbi pldval:
PS C:\> 1 1

Mi is trtnt itt? A bert szm ebben az esetben nyilvnvalan nem parancs, hanem mi is lehet? Termszetesen egy integer tpus konstans. Ha ezt a konstanst odaadjuk a Get-Member cmdletnek, az megmondja, hogy az integer (ami egy rtk-tpus) milyen tulajdonsgokkal s kpessgekkel rendelkezik (brmilyen szm j) :
PS C:\> 1 | Get-Member TypeName: System.Int32 Name ---CompareTo Equals GetHashCode GetType GetTypeCode ToString MemberType ---------Method Method Method Method Method Method Definition ---------System.Int32 CompareTo(Int32 value), System.Int3... System.Boolean Equals(Object obj), System.Boolea... System.Int32 GetHashCode() System.Type GetType() System.TypeCode GetTypeCode() System.String ToString(), System.String ToString...

A megjelen listbl lthat, hogy a tpust tartalmaz struktra neve System.Int32, s ugyan nem rendelkezik tulajdonsgokkal (egyetlen tulajdonsga az rtke), de van nhny meghvhat metdusa: vissza tudja adni a tpust, t tudja alaktani magt karakterlncc, sszehasonlthat egy msik szmmal, stb. A listban szerepelnek az adott metdus klnfle paramterezssel meghvhat (overloaded) vltozatai, s az egyes vltozatok ltal visszaadott rtk tpusa is. Prbljuk ki, mit tud egy karakterlnc!
PS C:\> "Hell" | Get-Member TypeName: System.String Name ---Clone CompareTo Contains CopyTo EndsWith MemberType ---------Method Method Method Method Method Definition ---------System.Object Clone() System.Int32 CompareTo(Object va... System.Boolean Contains(String v... System.Void CopyTo(Int32 sourceI... System.Boolean EndsWith(String v...

37

Alapfogalmak
Equals ... Method System.Boolean Equals(Object obj...

Ez a lista mr jval bvebb, csak gyzznk vlogatni. Akinek esetleg feltnt korbban, hogy a PowerShellben egyetlen karakterlnc-feldolgozsra kpes utasts sincsen, most megkaphatja a magyarzatot: nincs szksg ilyesmire, mert a .NET Framework String osztlya mindent tud, ami ebben a tmban felmerlhet. A kvetkezkben kiprblunk nhny egyszer karakterlnc-mveletet. Bvtsk a bert karakterlncot (vagyis a Hell karakterlncra hvjuk meg a String osztly Insert metdust, els paramter a pozci, msodik a beszrand karakterlnc):

PS C:\> "Hell".Insert(5, " vilg!") Hell vilg!

Cserljnk ki benne egy bett egy msikra (a karaktereket idzjelek vagy aposztrfok kztt adhatjuk meg):

PS C:\> "Hell".Replace('e', 'a') Hall

Alaktsuk t a karakterlncot csupa nagybetss:

PS C:\> "Hell".ToUpper() HELL

Szmoljuk meg a karakterlnc betit (nem metdus, hanem tulajdonsg, gy nem kell zrjel):

PS C:\> "Hell".Length 5

A Get-Member lehet a segtsgnkre akkor is, ha egy adott cmdlet kimenett szeretnnk kzelebbrl megvizsglni, megmondja milyen tpus objektumokbl ll a kimenet, s azoknak milyen tulajdonsgai, metdusai vannak. Ha a kimenet nem egyetlen objektum, hanem gyjtemny (legtbbszr ez a helyzet), akkor abban akr tbb klnbz tpus objektum is elfordulhat, de a Get-Member ebben az esetben sem jn zavarba; a gyjtemnyben lv valamennyi tpust kilistzza. A mappkra kiadott GetChildItem pldul szoksosan FileInfo s DirectoryInfo objektumokat is tartalmaz, ekkor a Get-Member kimenetben mindkt tpus megtallhat.
PS C:\> Get-ChildItem | Get-Member TypeName: System.IO.DirectoryInfo

38

Elmlet
Name MemberType ------------Create Method CreateObjRef Method ... TypeName: System.IO.FileInfo Name ---AppendText CopyTo ... MemberType ---------Method Method Definition ---------System.Void Create(), System.V... System.Runtime.Remoting.ObjRef...

Definition ---------System.IO.StreamWriter AppendT... System.IO.FileInfo CopyTo(Stri...

A .NET objektumokkal, metdusokkal, tulajdonsgokkal s adattpusokkal kapcsolatos informcit a .NET Framework SDK dokumentcijbl kaphatunk, itt igen rszletes lerst tallhatunk valamennyi osztly valamennyi elemvel kapcsolatban. Egyszerbb esetben azonban nem rdemes a rettenetes mennyisg informci kztti keresglssel sokkolni magunkat, nmi segtsg kzvetlenl a PowerShellbl is hozzfrhet az albbi mdszer hasznlatval (egy karakterlnc objektumra meghvhat Replace() metdus defincijt krjk le, a kimenetben lthat a visszaadott rtk, s a lehetsges paramterlistk):
PS Run:\> ("Hell" | get-member replace).definition System.String Replace(Char oldChar, Char newChar), System.String Replace( String oldValue, String newValue)

Ugyanez (legalbbis az eleje) persze megjelenik egy kznsges Get-Member hvs kimenetben is (Definition oszlop), de ott a szks hely miatt a hosszabb szvegek vge ltalban mr nem lthat.

1.4.8 Alias, becenv, lnv


Ahogy a fejezet bevezetjben emltettem, a PowerShell ketts clt szolgl: j shell s j programnyelv prbl lenni. A j shellre az jellemz, hogy knyelmes, knnyen kezelhet, keveset kell gpelni, fl szavakbl is megrti a felhasznlt. Ennek eszkze a nhny betbl ll alias (becenevek, lnevek) hasznlatnak lehetsge. lnevet kapcsolhatunk (akr tbbet is) klnbz PowerShell elemekhez. Az alias brmilyen parancsban, kifejezsben teljes rtk helyettestje gazdjnak, gy nincs szksg az eredeti nv begpelsre. Az lnevek termszetesen szkriptekben is korltozs nlkl hasznlhatk, de 6 alkalmazsuk jelentsen ronthatja a szkript olvashatsgt . lnevet a kvetkez elemekhez rendelhetnk:
6

PowerShell fggvnyek PowerShell szkriptek

Ugyancsak a jobb olvashatsg miatt nem nagyon hasznlunk aliasokat a knyvben szerepl mintapldkban s szkriptekben sem.

39

Alapfogalmak
Fjlok Brmilyen vgrehajthat llomny (exe, com, cmd, vbs, stb.)

A PowerShell szmos beptett lnvvel is rendelkezik, ezek kzl nhnnyal (dir, cd, stb.) mr a korbbi fejezetekben is tallkozhattunk. Az lnevek teljes listjt a GetAlias cmdlet jelenti meg:
PS C:\> Get-Alias CommandType ----------Alias Alias Alias Alias Alias Alias ... Name ---ac asnp clc cli clp clv Definition ---------Add-Content Add-PSSnapin Clear-Content Clear-Item Clear-ItemProperty Clear-Variable

Rendelkezsnkre ll tovbb az Alias: meghajt is, amely a mr megismert mdon teszi hozzfrhetv a beceneveket:
PS C:\> Set-Location alias: PS Alias:\> Get-ChildItem

Ha nem a teljes listra, hanem csak egy konkrt aliasra vagyunk kvncsiak, akkor a kvetkez parancsot hasznlhatjuk:
PS C:\> Get-Alias -name dir CommandType ----------Alias Name ---dir Definition ---------Get-ChildItem

Kiss bonyolultabb a helyzet, ha az egy adott parancshoz hasznlhat aliasokat szeretnnk felderteni (termszetesen ilyenbl tbb is lehet). Az albbi parancs a Set7 Location cmdlethez tartoz lneveket listzza ki :
PS C:\> Get-Alias * | Where-Object {$_.Definition -eq "Set-Location"} CommandType ----------Alias Alias Alias Name ---sl cd chdir Definition ---------Set-Location Set-Location Set-Location

A mr ismert Get-Alias cmdleten kvl az albbi listban lthat ngy tovbbi parancs is az aliasokkal kapcsolatos klnfle mveletek elvgzsre szolgl.
7

A parancs egyes rszeinek jelentsrl a kvetkez fejezetben lesz sz.

40

Elmlet
PS C:\> Get-Help *-alias Name ---Export-Alias Get-Alias Import-Alias New-Alias Set-Alias Category -------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Synopsis -------Exports information a... Gets the aliases for ... Imports an alias list... Creates a new alias. Creates or changes an...

A New-Alias cmdlet segtsgvel (meglepets!) j lneveket definilhatunk, paramterknt az alias nevt s a vele helyettestend parancsot kell megadnunk. Az albbi parancs a word aliast hozza ltre, amely a tovbbiakban a szvegszerkeszt egyszer indtst teszi lehetv (termszetesen a winword.exe valdi helyt kell megadnunk):
PS C:\> New-Alias -name word -Value "c:\program files\microsoft office\office10\winword.exe" PS C:\> word

A meghajtkhoz hasonlan a ltrehozott aliasok is csak az adott munkameneten bell lnek, a rendszeresen hasznlni kvnt darabokat a PowerShell profilba kell felvennnk (lsd ksbb). Az Export-Alias cmdlet segtsgvel a teljes alias listt fjlba menthetjk, a fjl pedig (pldul egy msik szmtgpen) az Import-Alias parancs segtsgvel tlthet vissza.

1.4.9 PSDrive
Mivel a PowerShellnek kiterjedt sajt parancskszlete van ezrt logikus az elkpzels, hogy egy-egy parancs hasonl objektumokon is ugyanabban a formban futtathat lehessen. Pldul a fjlrendszer s a registry is hasonl mappastruktra-szeren pl fel. Ebbl jhetett a PowerShell alkotinak az az tlete, hogy kiterjesztettk a meghajt fogalmt, PSmeghajt lett gy a fjlrendszeren kvl a registry, a tanstvnytr, de a fggvnyeinket s a krnyezeti s sajt vltozinkat is ilyen PSDrive-okon keresztl is megnzhetjk. Ezekhez a klnbz PSDrive-okhoz tartozik egy-egy provider (ami egy .NET alap program), ami biztostja az egysges felletet, amelyhez a PowerShell cmdletjei csatlakozhatnak. A meghajtk (illetve a mgttk ll providerek) teszik lehetv, hogy a SetLocation, a Get-ChildItem, stb. parancsok a fjlrendszerben, a registryben, a tanstvnytrban s mg szmos ms helyen is teljesen azonos mdon mkdhessenek. A provider ltal tmogatott cmdletek mindegyike hasznlhat a providerre alapul meghajtkon, illetve vannak specilisan egy meghatrozott providerhez kszlt cmdletek is. Az egyes providerek gynevezett dinamikus paramtereket is adhatnak a cmdletekhez, amelyek csak akkor hasznlhatk, ha a cmdletet az adott provider segtsgvel ltrehozott adatforrson hasznljuk. A PowerShell rendszerrel kapott providerek kszlete tovbb bvthet, gy jabb adatforrsok (pldul az Active Directory!) is elrhetv tehetk a szoksos cmdletek szmra (lsd ksbb).

41

Alapfogalmak
A PowerShell meghajtk teht olyan logikai adattrak, amelyek a megfelel provider kzremkdsvel a fizikai meghajtkhoz hasonl mdon rhetk el. A PowerShell meghajtk semmilyen mdon nem hasznlhatk a shell krnyezeten kvlrl, de termszetesen a fizikai s hlzati meghajtk csatlakoztatst, illetve eltvoltst a shell is rzkeli. A PSmeghajtk kilistzshoz hasznlhatjuk a Get-PSDrive cmdletet, egy ilyen drive-on bell rvnyes pldul a get-childitem parancs, azaz alias dir:
[1] PS C:\> Get-PSDrive Name ---Alias C cert D E Env F Function G HKCU HKLM Variable Provider -------Alias FileSystem Certificate FileSystem FileSystem Environment FileSystem Function FileSystem Registry Registry Variable Root ---C:\ \ D:\ E:\ F:\ G:\ HKEY_CURRENT_USER HKEY_LOCAL_MACHINE CurrentLocatio n --------------

[2] PS C:\> dir hkcu: Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER SKC --2 0 23 0 1 4 3 37 0 0 0 VC -0 32 1 2 6 0 1 0 0 1 4 Name ---AppEvents Console Control Panel Environment Identities Keyboard Layout Printers Software UNICODE Program Groups SessionInformation Volatile Environment Property -------{} {ColorTable00, ColorTable01, Colo... {Opened} {TEMP, TMP} {Identity Ordinal, Migrated5, Las... {} {DeviceOld} {} {} {ProgramCount} {LOGONSERVER, CLIENTNAME, SESSION...

[3] PS C:\> dir 'HKCU:\Keyboard Layout' -Recurse Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Keyboard Lay out SKC --1 VC Name -- ---0 IMEtoggle Property -------{}

42

Elmlet
Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Keyboard Lay out\IMEtoggle SKC --0 VC Name -- ---0 scancode Property -------{}

Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Keyboard Lay out SKC --0 0 0 VC -1 0 3 Name ---Preload Substitutes Toggle Property -------{1} {} {Hotkey, Language Hotkey, Layout ...

1.4.9.1 Meghajtk ltrehozsa s trlse (New-PSDrive, Remove-PSDrive)


PSDrive ltrehozsval a gyakran hasznlt helyek elrst jelentsen megknnythetjk. Feladat: Ksztsnk egy Run nev PS meghajtt, amely a registry HKLM/Software/Microsoft/Windows/CurrentVersion/Run helyre mutat!

A New-PSDrive paramtereknt az j meghajt nevt, a hasznland providert s a gykr elrsi tjt kell megadnunk az albbiak szerint, s mris hasznlhatjuk a frissen ltrehozott meghajtt:
PS C:\> New-PSDrive -Name Run -PSProvider Registry -root HKLM:\Software\Mi crosoft\Windows\CurrentVersion\Run Name ---Run Provider -------Registry Root ---HKEY_LOCAL_MACHINE\Software\Micr... CurrentLocat ion ------------

PS C:\> Set-Location Run: PS Run:\> Get-ChildItem Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\ Microsoft\Windows\CurrentVersion\Run SKC --3 VC Name -- ---0 OptionalComponents Property -------{}

43

Alapfogalmak
A ltrehozott meghajt csak az adott PowerShell munkamenetben hasznlhat, kilpskor egyszeren elvsz. A rendszeresen hasznlt meghajtkat mgsem kell minden egyes alkalommal jra ltrehoznunk, a megfelel parancsok beilleszthetk a PowerShell indtsakor automatikusan lefut profil-szkriptbe is (lsd ksbb). Ha a munkameneten bell trlni szeretnnk a ltrehozott meghajtt, ezt nagyon egyszeren megtehetjk, csupn a nevt kell paramterknt megadnunk a Remove-PSDrive cmdletnek:
PS C:\> Remove-PSDrive Run

Korbban emltettk, hogy a PSmeghajtk csak a PowerShellbl rhetk el, a Windows, s ms alkalmazsok nem ismerik fel az ilyen mdon ltrehozott tvonalakat. Ha azonban egy kls programot a shellbl indtunk el, akkor mgis van md a korltozs megkerlsre. Hozzuk ltre a C:\documents and settings\scripts mappt s ksztsnk benne egy hello.txt nev szveges fjlt tetszleges tartalommal, majd rendeljk a mapphoz a scripts nev PowerShell-meghajtt!
PS C:\> New-PSDrive -name scripts -PSProvider FileSystem -Root 'C:\Documents and Settings\scripts' Name ---scripts Provider -------FileSystem Root ---C:\Documents and Settings\scripts CurrentLoc... -------------

Prbljuk notepad segtsgvel megnyitni a hello.txt fjlt!


PS C:\> notepad scripts:\hello.txt

Elg rosszul nz ki, igaz? Az a baj, hogy ilyen esetben a bert tvonalat nem a PowerShell, hanem az elindtott alkalmazs rtelmezi (illetve esetnkben nem rtelmezi). 8 Az eredmny csakis egy szp hibazenet lehet . Azt kne megoldanunk, hogy a PowerShell (aki persze tudja az igazsgot), ne a bert karakterlncot, hanem az annak alapjn megfejtett igazi tvonalat adja oda szegny, buta notepadnak, hiszen az mg soha nem is hallhatott a scripts: meghajt ltezsrl. A PowerShell bels hasznlat tvonalainak megfejtsre, feloldsra a Resolve-Path cmdlet szolgl, ami az albbi mdon hasznlhat:
PS C:\> (Resolve-Path scripts:\hello.txt).ProviderPath C:\Documents and Settings\scripts\hello.txt

Az gy talaktott tvonalat mr brmely kls alkalmazsnak, gy a notepadnak is odaadhatjuk.


PS C:\> notepad (Resolve-Path scripts:/hello.txt).ProviderPath

Nem a PowerShell, hanem a notepad fogja a hibazenetet megjelenteni.

44

Elmlet

1.4.10 Vltozk, konstansok


Vltozknak az olyan memriaterleteket nevezzk, amelyeket szkriptnkben vagy programunkban nvvel jellnk meg, s a programnak lehetsge van az adott memriaterlet rtkt futsa sorn megvltoztatni. A nvvel elltott memriaterlet tartalmazhatja kzvetlenl a vltoz rtkt (rtk tpus vltozk), illetve tartalmazhat egy hivatkozst (memriacmet), ami az adatok valdi helyt azonostja (referencia tpus vltozk). Minden ltrehozott vltoz szmra program adatszegmensn lefoglaldik a megfelel nagysg memriaterlet, amelyet ezutn a programbl a nvre val hivatkozssal rhetnk el, kiolvashatjuk vagy bellthatjuk annak rtkt, illetve referencia esetn a nv segtsgvel rhetjk el a mutatott objektumot is. Az rtk- s referenciatpusok a PowerShellben gyakorlati szempontbl nem klnbznek egymstl lnyegesen. A tpusok kztti konverzi minden esetben a .NET szablyai szerint trtnik, ahogyan a ksbbi pldkban lthat. Mi trolhat teht egy PowerShell vltozban? Brmi, amit a .NET a memriban trolhat, mghozz szigoran tpusos formban. A PowerShell vltoznevei minden esetben a $ karakterrel kezddnek (ha nmagban hasznljuk ket s nem valamilyen vltozkat kezel cmdlet segtsgvel), betket, szmokat s specilis karaktereket is tartalmazhatnak. Vltozkat PowerShellben legegyszerbben a kvetkez formban tudunk ltrehozni, hasznlni:
PS C:\> $a = "bcdefghijklmnopqrstuvwxyz" PS C:\> $b = 12 PS C:\> $c = Get-Location PS C:\> $a bcdefghijklmnopqrstuvwxyz PS C:\> $b 12 PS C:\> $c Path ---C:\

Ltszik, hogy a vltozk rtkadshoz nem kell semmilyen kulcsszt hasznlni, az egyenlsgjel elg az rtkadshoz. A vltozkhoz nem felttlenl kell tpust rendelni, azaz brmilyen tpust, objektumosztlyt tartalmazhatnak. Azt, hogy egy vltoz ppen milyen tpus rtket tartalmaz a GetType() metdus meghvsval krdezhetjk le:
PS C:\> $a.GetType() IsPublic IsSerial Name -------- -------- ---True True String PS C:\> $b.GetType() BaseType -------System.Object

45

Alapfogalmak

IsPublic IsSerial Name -------- -------- ---True True Int32 PS C:\> $c.GetType() IsPublic IsSerial Name -------- -------- ---True False PathInfo

BaseType -------System.ValueType

BaseType -------System.Object

Ltszik, hogy a $c vltoznk nem egyszeren egy szveget tartalmaz, hanem egy PathInfo tpus objektumot. A vltozk tpusa nem rgzl, azaz egy String vltoznak ksbb adhatunk Int32 rtket minden tovbbi hiba nlkl, a vltoz tpusa az rtknek megfelelen mdosul.
PS C:\> $a bcdefghijklmnopqrstuvwxyz PS C:\> $a = 22

Ez a megolds persze nagyon knyelmes, de az automatikus vltozdeklarci komoly problmkkal is jrhat; minden elgpelsbl j, rejtlyes vltozk szletnek, rdekes, de legalbbis nehezen felderthet futsi hibkat s memriaproblmkat okozva. Szkriptek esetn mindenkppen clszer legalbb a hibakeress fzisban vltoztatni az alaprtelmezett viselkedsen a kvetkez mdon:
PS C:\> Set-PSDebug -strict

Ezutn a PowerShell hibazenetet ad, ha olyan vltoznevet hasznlunk, amihez korbban mg nem rendeltnk rtket:
PS C:\> $a = 2 PS C:\> $a + $b The variable $b cannot be retrieved because it has not been set yet. At line:1 char:7 + $a + $b <<<<

Az alaprtelmezett viselkeds a kvetkez parancs hasznlatval llthat vissza:


PS C:\> Set-PSDebug -off

A vltozk gyakran nem egyszer elemeket tartalmaznak, hanem collection-ket (gyjtemnyeket, vegyes elem tmbket) vagy hagyomnyos tmbket:
PS C:\> $alias = get-alias a* PS C:\> $alias CommandType ----------Name ---Definition ----------

46

Elmlet
Alias Alias Alias Alias Alias Alias ac asnp apv adl asp apropos Add-Content Add-PSSnapin Add-PathVariable Add-DirectoryLength Add-ShortPath Get-HelpMatch

A fenti pldban az a kezdet aliasok gyjtemnye lesz a $alias vltoz tartalma. A gyjtemnyekkel s tmbkkel ksbb foglalkozom rszletesebben. Vltozknak mg preczebben is tudunk rtket adni. A set-variable cmdlet nagyon sok opcit biztost erre:
PS C:\> Set-Variable -Name PI -Value 3.14159265358979 -Option Constant PS C:\> $PI 3.14159265358979

A fenti pldban pldul a PI nev vltozt konstansknt hoztuk ltre, ami azt jelenti, hogy nem engedi fellrni ms rtkkel, illetve brhonnan lthat ez a vltoz (scope-pal, azaz lthatsggal ksbb foglalkozom). Ezt mg trlni sem lehet a Remove-Variable cmdlettel. A Set-Variable cmdletnek van mg egy rdekessge is, magyarzatot lehet adni ezzel a mdszerrel a vltozknak:
PS C:\> Set-Variable -Name Nevem -Value "Sos Tibor" -Description "Ez az n nevem" PS C:\> $nevem Sos Tibor

De vajon hogyan olvashatjuk ki ksbb ezt a magyarz szveget? Ht gy nem:


PS C:\> $nevem.description

Ehhez a get-variable cmdletet kell hasznlni:


PS C:\> (get-variable nevem).Description Ez az n nevem

A get-variable kimeneteknt nem maga a vltoz tartalma jn vissza, hanem egy PSVariable tpus objektum, aminek mr kiolvashat a Description tulajdonsga is.
PS C:\> (get-variable nevem).gettype() IsPublic IsSerial Name -------- -------- ---True False PSVariable BaseType -------System.Object

47

Alapfogalmak
A korbban mr mutatott Set-Variable cmdlethez hasonlan a new-variable is hasznlhat j vltozk definilshoz, a kt parancs kztt csak az a klnbsg, hogy a set-variable segtsgvel mr meglev vltozk tartalmt is meg lehet vltoztatni, a new-variable erre nem alkalmas:
[35] PS I:\>$x="Krte" [36] PS I:\>New-Variable x -Value 55 New-Variable : A variable with name 'x' already exists. At line:1 char:13 + New-Variable <<<< x -Value 55

Ha meguntunk egy vltozt, akkor trlhetjk is a Clear-Variable cmdlet segtsgvel. Ez klnsen akkor fontos, ha pldul egy nagymret gyjtemny kerl bele a vltozba, ami aztn szksgtelenn vlik. Ha nem trljk, akkor az tovbbra is foglalja a memrit. Ez magt a vltozt nem sznteti meg, csak az rtkt trli:
[29] PS I:\>$x = "alma" [30] PS I:\>Get-Variable x Name ---x [31] PS I:\>Clear-Variable x [32] PS I:\>Get-Variable x Name ---x Value ----Value ----alma

[33] PS I:\>Remove-Variable x [34] PS I:\>Get-Variable x Get-Variable : Cannot find a variable with name 'x'. At line:1 char:13 + Get-Variable <<<< x

A [32]-es promptnl ltjuk, hogy a Clear-Variable utn az $x vltozm mg ltezik, csak nincs rtke. A Remove-Variable utn a [34]-es promptban viszont mr nem ltezik $x. Megjegyzs Vltoznvnek mindenfle csnyasgot is hasznlhatunk, de lehetsg szerint ne tegynk ilyet, mert a szkriptnk, parancssorunk rtelmezhetsgt nagyon megnehezthetjk:
[37] PS I:\>$1 = 5 [38] PS I:\>$1 5

48

Elmlet
[39] PS I:\>$1+2 7 [40] PS I:\>${kd}="sor" [41] PS I:\>"${kd}sor" sorsor [42] PS I:\>$$ = "Dollr" [43] PS I:\>$$ Dollr [44] PS I:\>$_a="bla" [45] PS I:\>$_a bla

1.4.11 Idzjelezs, escape hasznlat


Az idzjelek hasznlata arra szolgl, hogy a PowerShell szmra egybknt valamifle specilis jelentssel br szvegdarabokat egyszer karakterlncknt olvastassuk be. A PowerShellben ktfajta idzjel ltezik. Az egyik a macskakrm (), a msik az aposztrf (). Ez utbbi nem tvesztend ssze a visszafele aposztrffal (`- AltGr + 7), ami a korbban emltett Escape, azaz hatstalant karakter.
PS C:\> $szveg = "karaktersorozat" PS C:\> $szveg karaktersorozat PS C:\> "Ez itt egy $szveg." Ez itt egy karaktersorozat. PS C:\> 'Ez itt egy $szveg' Ez itt egy $szveg PS C:\>

A fenti pldban ltszik, hogy a macskakrm () kzti szvegben a PowerShell szreveszi a vltozkat (a $ jel alapjn) s behelyettesti a vltoz rtkt. Az aposztrf ()nl nem rtkel ki semmit sem, minden karaktert sz szerint rtelmez. Hogyan kell pldul macskakrm () kztt akkor $ jelet kiratni?
PS C:\> "Ez most itt egy `$jel" Ez most itt egy $jel

Itt jn jl az Escape karakter, ami hatstalantja a $ alaphelyzet szerinti hatst. Vigyzat, a $ jel hatsa macskakrmk kztt csak az els szelvlaszt karakterig rvnyes! Azaz nem mkdik gy egy adott szveg hossztulajdonsgnak kiratsa:
PS C:\> $sz = "ablak" PS C:\> "Az ablak sz $sz.Length karakter hossz." Az ablak sz ablak.Length karakter hossz.

Hogyan lehet az egsz kifejezst kirtkeltetni a macskakrmk kztt?

49

Alapfogalmak
PS C:\> "Az ablak sz $($sz.Length) karakter hossz." Az ablak sz 5 karakter hossz.

Azaz a problematikus rszt bezrjelezzk, s felhvjuk a PowerShell figyelmt, hogy a vltozknl megszokott kirtkels szerint jrjon el ez egsz zrjeles kifejezs esetben, ezrt el tesznk mg egy $ jelet. Tbbsoros szveget is egyszeren be tudunk rni:
PS >> >> >> PS 1. 2. 3. C:\> $hossz = "1. sor 2. sor 3. sor" C:\> $hossz sor sor sor

Egyszeren Entert nyomunk a sortrsnl. A parancssor rtelmez beindul s szreveszi, hogy egy idzjel utn vagyunk, gy tvlt egy alpromptra s vrja a szveget a kvetkez idzjelig.

1.4.12 Sortrs, tbbsoros kifejezsek


A PowerShell nagyon rugalmasan kezeli a tbbsoros kifejezseket. Ha egy nyit karakter (macskakrm, aposztrf, minden fajta zrjel) utn j sort kezdnk, akkor kapunk egy u.n. nested prompt-ot, azaz begyazott promptot, melyet kt > jel jelez, s ahol folytathatjuk a parancssorunk rst. A macskakrm pldjt mr elzleg mutattam, most nzznk pr egyb pldt:
PS C:\> (get-service >> ).count >> 91

Szgletes zrjel:
PS C:\> $a = get-service PS C:\> $a[ >> 1] >> Status -----Stopped Name ---Alerter DisplayName ----------Alerter

Minden egyb esetben, amikor teht nem egyrtelm a PowerShell szmra, hogy folytatdik a sor, ott segtsnk neki a mr emltett (`) karakterrel.

50

Elmlet
PS C:\> get-service -name ` >> Alerter >> Status -----Stopped Name ---Alerter DisplayName ----------Alerter

A szvegek tbbsoros trolsra van mg egy lehetsg, az u.n. here string alkalmazsa, amit egy nll sorban lev @ vagy @ karakterprral vezetnk be s egy nll @ vagy @ karakterprral fejeznk be. Ennl - hasonlan a korbbiakhoz - a macskakrms vltozat kirtkeld, az aposztrfos pedig annyira ers idzjelezsnek szmt, hogy a kztes `, s jelet sem veszi figyelembe:
PS C:\> $szveg = @' >> Itt aztn lehet brmi, sortrs >> Escape karakter ` >> Aposztrf ' >> Macskakrm " >> '@ >> PS C:\> $szveg Itt aztn lehet brmi, sortrs Escape karakter ` Aposztrf ' Macskakrm "

1.4.13 Kifejezs- s parancsfeldolgozs


A PowerShell kt klnbz zemmdban kpes rtelmezni a bert szveget kifejezs s parancs zemmdban. Kifejezs zemmdban a shell a legtbb magas szint programnyelvhez hasonlan viselkedik: a szmokat szmnak tekinti, a karakterlncokat idzjelek kz kell tennnk, stb. Kifejezsek pldul a kvetkezk:
2+2 "Hell" + " vilg!"

Parancs zemmdban a karakterlncokhoz nincs szksg idzjelekre, mivel a shell a vltozkon s a zrjelben lv kifejezseken kvl mindent karakterlncnak tekint. Ilyen mdon rtelmezi a parancsfeldolgoz az albbi utastsokat:
write-host 2+2 copy-item egyik.txt masik.txt

Most mr csak azt kellene tudnunk, hogy pontosan mi az, aminek hatsra a PowerShell egyik vagy msik zemmdot vlasztja a parancsunk rtelmezsre. Az zemmdot az els beolvasott token (vagyis rtelmezhet parancsdarab) fogja meghatrozni az albbiaknak megfelelen:

51

Alapfogalmak
Kifejezs zemmdba vlt a PowerShell, ha a bert szveg szmmal (vagy egy pont karaktert kvet szmmal), idzjelek kz tett karakterlnccal, vagy $ jellel kezddik. Parancs zemmdba vlt a PowerShell, ha a bert szveg brmilyen betvel, a & karakterrel, egy pont utni szkzzel, vagy pont utni betvel kezddik.

A kt zemmd vegyes hasznlatt zrjelezssel rhetjk el, a zrjelek kztti szvegre minden esetben jra megtrtnik az zemmd meghatrozsa a fenti szempontok szerint.
PS C:\> 2+2 4 PS C:\> Write-Host 2+2 2+2 PS C:\> Write-Host (2+2) 4 PS C:\> (Get-Date).Year + 3 2010 PS C:\> "Get-Date" Get-Date PS C:\> &"Get-Date" 2007. jlius 11. 15:37:51

A fenti pldkon jl lthat a kt zemmd kztti klnbsg s az zemmd vlts knyszertse. Az els utastst a PowerShell kifejezs zemmdban rtelmezte, elvgezte a mveletet s kirta az eredmnyt. A msodik sor egy cmdlet nevvel, vagyis betvel kezddik, ennek hatsra aktivldik a parancs zemmd, s a shell mr nem adja ssze a kt szmot, egyszer karakterlncknt (pedig nincs idzjelek kztt!) olvassa be. A harmadik sor betvel kezddik (parancs zemmd), de a zrjelek miatt ksbb jra megtrtnik az zemmd meghatrozsa, s a zrjelben lv szmok hatsra a PowerShell az sszeads erejig kifejezs zemmdra vlt. Az negyedik sorban a zrjeles szvegre parancs zemmd indul, gy a cmdlet kimenete kerl a teljes kifejezsbe. Az tdik sorban egy karakterlncot adunk meg (ami ppen egy cmdlet neve), de az idzjelek miatt a PowerShell kifejezs zemmdra vlt, gy nem ismeri fel a cmdletet, a nevet egyszer karakterlncnak tekinti. Az utols sorban a & karakter segtsgvel lefuttatjuk a karakterlncot, vagyis parancs zemmdra knyszertjk a shellt.

Feladat: Szmoljuk meg, hogy hny parancs (cmdlet) van a PowerShell-ben!

A cmdletek listjt a Get-Command adja vissza egy objektumcsoport kpben, a .NET-ben pedig minden objektumcsoporthoz tartozik egy Count tulajdonsg, amely az elemek szmt adja vissza. Vagyis:
PS C:\> get-command.Count The term 'get-command.Count' is not recognized as a cmdlet, function, oper able program, or script file. Verify the term and try again.

52

Elmlet
At line:1 char:17 + get-command.Count <<<<

A hibazenetbl megtudhatjuk, hogy nem sikerlt a Get-Command.Count utastst vgrehajtani, ahogyan az vrhat is volt. Termszetesen nem egyszerre kellene vgrehajtani az egsz parancsot, hanem elsknt csak a Get-Command-nak kellene lefutnia, ezutn pedig a kimeneten megjelen gyjtemnyre kellene Count-ot krni. Ezt az albbi szintaktika szerint rhetjk el:
PS C:\> (get-command).Count 129

Lttuk a fenti pldkban, hogy a PowerShell a cmdletek paramtereit alapveten szvegknt rtelmezi (parancsmd), kivve a vltozkat:
PS C:\> $bla="PowerShell" PS C:\> Write-Output $bla PowerShell

St! Ilyenkor mg a vltoz metdusaira s tulajdonsgaira is lehet hivatkozni klnsebb trkkzs nlkl:
PS C:\> Write-Output $bla.Length 10 PS C:\> Write-Output $bla.split("S") Power hell

1.4.14 Utastsok lezrsa


A PowerShell utastsainak lezrsra kt karakter is hasznlhat: az egyik a pontosvessz (;), a msik pedig az jsor karakter. Az jsor karakter azonban csak akkor jelenti az utasts vgt, ha az adott utastst a PowerShell szintaktikailag teljesnek s befejezettnek tekinti, ellenkez esetben a shell megprblja bekrni a hinyz befejezst. Nzznk egy-egy pldt ezekre. Elsknt az egy sorban tbb kifejezs megadsra:
PS C:\> 1+2; 54/12; "Ezek voltak az eredmnyek egy sorban kiszmolva" 3 4,5 Ezek voltak az eredmnyek egy sorban kiszmolva

A PowerShellnek hinyrzete van, alpromptot nyit a kifejezs korrekt lezrshoz:

53

Alapfogalmak
PS C:\> 2 + >> 2 >> 4 PS C:\>

Ha a lezrtnak is tekinthet utastsokat mgis folytatni szeretnnk, akkor ismt a korbban mr megismert Escape (`) karaktert kell hasznlnunk:
PS C:\> write-host ` >> Hell ` >> vilg ` >> Hell vilg

1.4.15 Csvezetk (Pipeline)


A hagyomnyos shellekhez hasonlan a PowerShellnek is fontos eleme a csvezetk (pipeline), azzal a lnyeges klnbsggel, hogy a PowerShell-fle csvezetkben komplett objektumok (illetve objektumreferencik) kzlekednek, gy a csvezetk minden eleme megkapja az eltte ll parancs ltal generlt teljes adathalmazt, fggetlenl attl, hogy az adott kimenet hogyan jelenne meg a kpernyn. De mi is az a csvezetk, s hogyan mkdik? Taln nem is szerencss a csvezetk elnevezs, hiszen ha valamit bentnk egy csvezetk elejn, az ltalban vltozatlan formban bukkan fel a vgn, a PowerShell-fle csvezetk lnyege pedig ppen a benne utaz dolgok (objektumok) talaktsa, megfelel formra hozsa. Sokkal szemlletesebb, ha csvek helyett egy futszalagot kpzelnk el, amelyen objektumok utaznak, a szalag mellett ll munksaink (a cmdletek) pedig szorgalmasan elvgzik rajtuk a megfelel talaktsokat, mindegyikk azt, amihez ppen rt a legjobban. Egyikk lefaragja s eldobja a flsleget, a kvetkez kivlogatja a hibs darabokat, egy msik kivlogatja, s szpen becsomagolja az egybetartozkat, stb. A szalag vgn pedig mi megkapjuk a ksztermket, ha gyesek voltunk (vagyis a megfelel munksokat lltottuk a szalag mell, s pontosan megmondtuk nekik, hogy mit kell csinlniuk), akkor ppen azt, s olyan formban, amire s ahogyan szksgnk volt. A csvezhetsg azzal is jr, hogy az egyik cmdlet kimenete a kvetkez cmdlet bemeneteknt megy tovbb, anlkl hogy neknk az els kimenetet el kellene mentennk vltozba. Ezt a paramtertadst a PowerShell helyettnk elvgzi. Ez - annak figyelembevtelvel - klnsen praktikus, hogy a klnbz cmdletek kimeneteknt tbbfajta, elre nem biztos, hogy pontosan meghatrozhat tpus kimenet, ltalnosan gyjtemny, azaz collection lehet. Radsul, ha ilyen gyjtemny a kimenet, akkor lehet, hogy annak els tagja hamar elll. Ha gyesen van megrva a kvetkez csszakasz helyn ll cmdlet, akkor az mr a rendelkezsre ll els gyjtemnyelemet el is kezdheti feldolgozni, st, akr tovbb is adhatja az utna kvetkez csszakasznak. Ez jval hatkonyabb feldolgozst tesz lehe-

54

Elmlet
tv memria-felhasznls tekintetben, hiszen nem kell bevrni az utols elem megrkezst s eltrolni az addigi elemeket. Nzznk egy nagyon egyszer pldt, a mr tbbszr alkalmazott get-member cmdlet pldjn. Lthat, hogy a csszakaszok csatlakozst a | jel (Alt Gr + W) jelenti:
[4] PS C:\> "sztring" | get-member TypeName: System.String Name ---Clone CompareTo Contains CopyTo EndsWith Equals ... MemberType ---------Method Method Method Method Method Method Definition ---------System.Object Clone() System.Int32 CompareTo(Object val... System.Boolean Contains(String va... System.Void CopyTo(Int32 sourceIn... System.Boolean EndsWith(String va... System.Boolean Equals(Object obj)...

A bert sztring kimenete maga a sztring, ezt kldjk tovbb a get-member cmdletnek, amely kilistzza a sztring objektum tagjait. De vajon honnan tudja a PowerShell, hogy a get-member szmos paramtere kzl melyik legyen a csbl kies kimenet? Ehhez az adott cmdlet helpje (itt most kicsit megkurttva) ad segtsget:
[5] PS C:\> get-help get-member -full NAME Get-Member SYNOPSIS Gets information about objects or collections of objects. SYNTAX Get-Member [[-name] <string[]>] [-inputObject <psobject>] [-memberType {<AliasProperty> | <CodeProperty> | <Property> | <NoteProperty> | <Scri ptProperty> | <Properties> | <PropertySet> | <Method> | <CodeMethod> | <ScriptMethod> | <Methods> | <ParameterizedProperty> | <MemberSet> | <A ll>}] [-static] [<CommonParameters>] DETAILED DESCRIPTION Gets information about the members of objects. Get-Member can accept in ... PARAMETERS -name <string[]> Specifies the member names to retrieve information about. Required? Position? Default value Accept pipeline input? false 1 * false

55

Alapfogalmak
Accept wildcard characters? true

-inputObject <psobject> Specifies the objects to retrieve information about. Using this par ameter to provide input to Get-Member results in different output t han pipelining the same input. When you pipeline input to Get-Membe r, if the input is a container, the cmdlet returns information abou t each unique type of element in the container. If you provide the same input by using the InputObject parameter, the cmdlet returns i nformation about the container object itself. If you want to use pi pelining to retrieve information about a container, you must procee d the pipelined input by a comma (,). For example, if you informati on about processes stored in a variable named $process, you would t ype ,$process | get-member to retrieve information about the contai ner. Required? Position? Default value Accept pipeline input? Accept wildcard characters? ... false named true (ByValue) false

Teht a cmdlet azon paramtere, amely fogadja a csvezetken rkez adatot az ltalban inputObject nvre hallgat, illetve a sgban fel van tntetve, hogy Accept pipeline input? true. Az 1.8 Fggvnyek fejezetben mg rszletesebben ismertetem a csvezst, hiszen ott majd mi magunk is runk ilyen cskpes fggvnyt.

1.4.16 Kimenet (Output)


Az elz alfejezetben bemutattam a csvezs lehetsgt. Ez nem egyszeren csak paramtertads, hanem el is kaphatjuk az ppen tadott paramtert, s annak tulajdonsgaival, metdusaival is jtszhatunk. Az gy tadott paramtert a $_ specilis, automatikusan generld vltozn keresztl rhetjk el. Fontos fogalom mg a PowerShellben az output, azaz a kimenet fogalma. Majdnem minden cmdletnek van kimenete. Ha mgsem lenne, akkor is van, merthogy ha nem ksztnk explicit kimenetet, akkor az implicit mdon alaphelyzetben az outputra addik t. Ez az output lesz a kvetkez csszakaszban elrhet $_ vltoz tartalma. Nzznk erre pldt:
[1] PS C:\> "szveg" | ForEach-Object{$_.Length} 6 [2] PS C:\> write-output "szveg" | ForEach-Object{$_.Length} 6 [3] PS C:\> write-host "szveg" | ForEach-Object{$_.Length} szveg

56

Elmlet
Az els s a msodik promptnl ugyanazt az eredmnyt kapjuk, azaz az els csszakaszban megszletik a szveg objektum, amit tadunk a kvetkez csszakasznak. Az els esetben implicit mdon adjuk t, a msodik esetben pedig explicit mdon. A write-output cmdletet igazbl nem emberi fogyasztsra sznjk, ez tisztn a csszakaszok kzti paramtertadsra van sznva, nem pedig a csicss, sznes-szagos konzolos adatmegjelentsre. Ms krds, hogy ha a csvezetk legvgn nem rendelkeznk a csvezetk tartalmrl, akkor az kifolyik a konzol ablakba, azaz kirdik a kpernyre. Nzzk meg a write-output helpjbl a szintaxist:
[7] PS C:\> (get-help write-output).syntax Write-Output [-inputObject] <PSObject[]> [<CommonParameters>]

Nincs tl sok extra lehetsgnk. A fenti [3]-as promptnl viszont nem az outputra kldm a szveg-et, hanem a write-host cmdlettel a konzolra (kpernyre), gy a kvetkez csszakasz nem kap semmit s ezrt nem is jelenik meg semmilyen hosszadat, csak a write-host ltal kirt szveg. Nzzk meg a write-host szintaxist is:
[8] PS C:\> (get-help write-host).syntax Write-Host [[-object] <Object>] [-noNewLine] [-separator <Object>] [-foregr oundcolor {<Black> | <DarkBlue> | <DarkGreen> | <DarkCyan> | <DarkRed> | <D arkMagenta> | <DarkYellow> | <Gray> | <DarkGray> | <Blue> | <Green> | <Cyan > | <Red> | <Magenta> | <Yellow> | <White>}] [-backgroundColor {<Black> | < DarkBlue> | <DarkGreen> | <DarkCyan> | <DarkRed> | <DarkMagenta> | <DarkYel low> | <Gray> | <DarkGray> | <Blue> | <Green> | <Cyan> | <Red> | <Magenta> | <Yellow> | <White>}] [<CommonParameters>]

Ez mr sok olyan lehetsget is tartalmaz, amelyek tnyleg az kirt adatok lvezeti rtkt fokozzk: httr- s betsznt lehet belltani, valamint azt, hogy ne nyisson j sort a kirs vgn. Amgy szmos egyb helyekre is tudjuk irnytani a kimenetet:
[10] PS C:\> get-command write* -CommandType cmdlet CommandType ----------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Name ---Write-Debug Write-Error Write-Host Write-Output Write-Progress Write-Verbose Write-Warning Definition ---------Write-Debug [-Message] <St... Write-Error [-Message] <St... Write-Host [[-Object] <Obj... Write-Output [-InputObject... Write-Progress [-Activity]... Write-Verbose [-Message] <... Write-Warning [-Message] <...

57

Alapfogalmak
A fenti egyb write- cmdleteknek a szkriptek hibakeressnl van elsdlegesen jelentsgk, gy majd a hibakeress fejezetben fogok ezzel rszletesen foglalkozni.

1.4.17 Egyszer formzs


Az output fogalmhoz tartozik hozz, hogy hrom alapvet formzsi mdrl beszljek. Emltettem, hogy a PowerShell objektumokat kezel, amelyeknek klnbz kiolvashat tulajdonsgaik (property) vannak. Egy-egy objektum tpusnak nagyon sok ilyen tulajdonsga is lehet, gy problma, hogy akkor egy ilyen objektumot hogyan is jelentsnk meg a kpernyn, hiszen ez az elsdleges interakcis felletnk a PowerShellel. Nzznk a problmra egy pldt, listzzuk ki a gpen fut W-vel kezdd szolgltatsokat:
[47] PS C:\> get-service w* Status -----Running Running Stopped Running Stopped Stopped Stopped Running Running Running Running Name ---W32Time WebClient WinHttpAutoProx... winmgmt WmdmPmSN Wmi WmiApSrv wscsvc WSearch wuauserv WZCSVC DisplayName ----------Windows Time WebClient WinHTTP Web Proxy Auto-Discovery Se... Windows Management Instrumentation Portable Media Serial Number Service Windows Management Instrumentation ... WMI Performance Adapter Security Center Windows Search Automatic Updates Wireless Configuration

Ltszik, hogy alaphelyzetben tblzatos nzetben ltjuk a szolgltatsok hrom tulajdonsgt: Status, Name, DisplayName. A DisplayName oszlopban nem minden szveg fr ki, ezrt van egy msik listzsi lehetsgnk is:
[48] PS C:\> get-service w* | format-list Name DisplayName Status DependentServices ServicesDependedOn CanPauseAndContinue CanShutdown CanStop ServiceType Name DisplayName Status DependentServices ServicesDependedOn : : : : : : : : : : : : : : W32Time Windows Time Running {} {} False True True Win32ShareProcess WebClient WebClient Running {} {MRxDAV}

58

Elmlet
CanPauseAndContinue CanShutdown CanStop ServiceType Name DisplayName Status DependentServices ServicesDependedOn CanPauseAndContinue CanShutdown CanStop ServiceType : : : : : : : : : : : : : False True True Win32ShareProcess WinHttpAutoProxySvc WinHTTP Web Proxy Auto-Discovery Service Stopped {} {Dhcp} False False False Win32ShareProcess

Itt mr jl kifrnek a hosszabb feliratok is, ezt a formzst hvjuk lista nzetnek, s az objektumok ilyen jelleg megjelentst a format-list cmdlet vgzi. Ezt olyan gyakran hasznljuk, hogy ennek rvid alias nevt rdemes mindenkppen megjegyezni: fl. Van, hogy pont az ellenkezjre van szksg, a listanzet helyett szeretnnk tblzatos nzetet. Ennek cmdletje a format-table, rviden az ft. Mindkt esetben kapunk egy alaphelyzet szerinti tulajdonsglistt. Azaz nem szabad megijedni, ha pont azokat az informcikat nem ltjuk, amire szksgnk lenne. Elszr rdemes minden objektum esetben a get-member-rel ellenrizni a tulajdonsgok listjt s utna ezekre hivatkozhatunk a format- parancsoknl:
[11] PS C:\> Get-Service w* | Get-Member -MemberType properties TypeName: System.ServiceProcess.ServiceController Name ---Name CanPauseAndContinue CanShutdown CanStop Container DependentServices DisplayName MachineName ServiceHandle ServiceName ServicesDependedOn ServiceType Site Status MemberType ---------AliasProperty Property Property Property Property Property Property Property Property Property Property Property Property Property Definition ---------Name = ServiceName System.Boolean CanPauseAndContinue {get;} System.Boolean CanShutdown {get;} System.Boolean CanStop {get;} System.ComponentModel.IContainer Conta... System.ServiceProcess.ServiceControlle... System.String DisplayName {get;set;} System.String MachineName {get;set;} System.Runtime.InteropServices.SafeHan... System.String ServiceName {get;set;} System.ServiceProcess.ServiceControlle... System.ServiceProcess.ServiceType Serv... System.ComponentModel.ISite Site {get;... System.ServiceProcess.ServiceControlle...

[12] PS C:\> Get-Service w* | Format-Table Name, Status, CanStop Name ---Status -----CanStop -------

59

Alapfogalmak
W32Time W3SVC WebClient WinHttpAutoProxySvc winmgmt WmdmPmSN Wmi WmiApSrv wscsvc wuauserv WZCSVC Running Running Running Stopped Running Stopped Stopped Stopped Running Running Running True True True False True False False False True True True

Az [11]-es promptnl lekrdezem a szolgltatsok tulajdonsgait. Ltszik, hogy okos a Get-Member, hiszen tbb szolgltats-objektumot kap a bemeneteknt, de mivel mindegyik egyforma tpus, teljesen egyforma a tulajdonsgaik vannak, gy csak egyszer adja meg a tulajdonsglistt. Ezutn a *12+-es promptban kivlasztottam, hogy a Name, Status, CanStop tulajdonsgok kellenek nekem, ezeket tadom paramterknt a Format-Table cmdletnek s megkapom a kvnt tblzatot. Ezt mg szebb lehet tenni az AutoSize kapcsolval, amellyel csak a szksges minimlis tblzatszlessget hasznlja, s nem hzza szt az egszet a kpernyn:
[13] PS C:\> Get-Service w* | Format-Table Name, Status, CanStop -AutoSize Name ---W32Time WebClient WinHttpAutoProxySvc winmgmt WmdmPmSN Wmi WmiApSrv wscsvc WSearch wuauserv WZCSVC Status CanStop ------ ------Running True Running True Stopped False Running True Stopped False Stopped False Stopped False Running True Running True Running True Running True

A Format-Table olyan gyakran hasznlatos, hogy nzzk meg nhny gyes tovbbi lehetsgt. Pldul nzzk az a s b betvel kezdd nev szolgltatsokat:
[14] PS C:\> Get-Service [a-b]* Status -----Running Stopped Running Stopped Stopped Running Name ---AeLookupSvc Alerter ALG AppMgmt aspnet_state AudioSrv DisplayName ----------Application Experience Lookup Service Alerter Application Layer Gateway Service Application Management ASP.NET State Service Windows Audio

60

Elmlet
Stopped Stopped BITS Browser Background Intelligent Transfer Ser... Computer Browser

Csoportostsuk ezeket Status szerint:


[15] PS C:\> Get-Service [a-b]* | ft -GroupBy Status Status: Running Status -----Running Name ---AeLookupSvc DisplayName ----------Application Experience Lookup Service

Status: Stopped Status -----Stopped Name ---Alerter DisplayName ----------Alerter

Status: Running Status -----Running ... Name ---ALG DisplayName ----------Application Layer Gateway Service

Hopp! Ez nem valami j. Itt tetten rhetjk a csvezst. Ugye a format-table szpen kapja egyms utn a szolgltatsokat s nyit egy aktulis csoportot a Status alapjn. Ha a kvetkez szolgltats is ugyanilyen sttus, akkor szpen mg biggyeszti, de ha nem, akkor nyit egy j csoportot. Azaz kicsit sszevissza az eredmnynk. A megolds az lenne, hogy ideiglenesen sszegyjtennk a csvezetken tmen sszes objektumot egy pufferben, s utna berendezzk az elemeket Status alapjn, majd utna jelentjk meg a csoportostott nzetet. Ezt a pufferelst s sorbarendezst vgzi a Sort-Object cmdlet:
[16] PS C:\> Get-Service [a-b]* | sort-object status, name |ft -GroupBy Status Status: Stopped Status -----Stopped Stopped Stopped Stopped Stopped Name ---Alerter AppMgmt aspnet_state BITS Browser DisplayName ----------Alerter Application Management ASP.NET State Service Background Intelligent Transfer Ser... Computer Browser

61

Alapfogalmak
Status: Running Status -----Running Running Running Name ---AeLookupSvc ALG AudioSrv DisplayName ----------Application Experience Lookup Service Application Layer Gateway Service Windows Audio

Ha pedig a hossz nev szolgltatsok neveit is szeretnnk ltni teljesen, akkor a -wrap kapcsolt rdemes hasznlni:
[17] PS C:\> Get-Service [a-b]* | sort-object status, name |ft -GroupBy Status -wrap Status: Stopped Status -----Stopped Stopped Stopped Stopped Stopped Name ---Alerter AppMgmt aspnet_state BITS Browser DisplayName ----------Alerter Application Management ASP.NET State Service Background Intelligent Transfer Servic e Computer Browser

Status: Running Status -----Running Running Running Name ---AeLookupSvc ALG AudioSrv DisplayName ----------Application Experience Lookup Service Application Layer Gateway Service Windows Audio

Megjegyzs: Kicsit zlelgessk ezt a kifejezsrszt: Format-Table Name, Status, CanStop. Most ez itt mi? Mirt van itt vessz? Nem elg a szkz? Majd ksbb nzzk rszletesen a kifejezsek argumentumait, elljrban annyit, hogy a FormatTable itt egy hromelem tmbt kap argumentumknt, ezrt kell vessz. Melyik argumentuma kaphat tmbt? A sgbl ez ltszik:
PARAMETERS -property <Object[]> Specifies the object properties that appear in the display and the order in which they appear. Wildcards are permitted.

62

Elmlet
Az <Object[]> jelzs vgn a szgletes zrjelpr jelli a tmbt. Azaz a PowerShellben nagyon fontos, hogy a tbb paramtert nem a vessz jelzi, hanem a szkz! Viszont a tmbk esetben az elemeket vesszvel kell elvlasztani.

1.4.18 HTML output


Ha mr ilyen szp tblzatokat tudunk kszteni, akkor j lenne ezeket valamilyen mg szebb formban megjelenteni. Ezt szolglja a PowerShell beptett HTML tmogatsa:
[7] PS C:\> Get-Service [a-b]* | ConvertTo-Html -Property Status,Name,DisplayName -head "Services on my computer" > service.html

24. bra Convert-HTML eredmnye bngszben

Termszetesen itt a kimenetet nem a konzolon rdemes nzni, mert ott a html forrskdot ltjuk, hanem rdemes tirnytani egy fjlba, amit a bngszben lehet megnzni. Ltjuk, hogy szp tblzatos formtumot ad, kis gyessggel lehet ezt mg fokozni. Itt most mg nem clom a teljes kd elmagyarzsa, csak egy kis kedvcsinlknt rom ide, a PowerGUI Script editorbl kimsolva:
Get-Service [a-b]* | ConvertTo-Html -Property Status,Name,DisplayName ` -head "Services on my computer" | foreach { if ($_ -like "*<td>Running</td>*") {$_ -replace "<td>Running", "<td bgcolor=green>Running"}

63

Alapfogalmak
elseif ($_ -like "*<td>Stopped</td>*") {$_ -replace "<td>Stopped", "<td bgcolor=red>Stopped"} else {$_ -replace "<tr>", "<tr bgcolor=#C0C0C0>"} } > c:\service.html

s a vgeredmny:

25. bra Kicsit kibvtett HTML kimenet a bngszben

(Ugyan a knyvben nem ltszik, de a fut szolgltatsok Status-a zld, a lelltak pedig piros htter.)

64

Elmlet

1.5 Tpusok
A PowerShellben a tpusoknak (vagy ha valaki inkbb a programozs terminolgit szereti, akkor osztlyoknak) nagyon nagy jelentsge van, hiszen a parancsok kimenete ltalban nem egyszer sztring, hanem valamilyen egyb objektum. Ennek ellenre az a cl, hogy a tpuskezels minl egyszerbb legyen, azaz hogy a PowerShell alkalmas legyen hatkony parancssori felhasznlsra. Ebben a fejezetben a PowerShell ltal kezelt legfontosabb tpusokat s azok kezelst mutatom be.

1.5.1 Tpusok, tpuskezels


Lthattuk, hogy ha nem adunk meg konkrt tpust, akkor a PowerShell a vltoznak adott rtk alapjn nllan hatrozza meg, hogy milyen tpus vltozt is hoztunk ltre. A parancssorba beirklt nhny utasts esetn ez teljesen rendben is van, a (ltszlagos) tpustalansg rendszerint nem okoz klnsebb problmt. Ms a helyzet azonban hoszszabb, bonyolultabb szkriptek esetn. Ekkor a kdolst, de mg inkbb a hibakeresst nagymrtkben megknnyti, ha biztosak lehetnk benne, hogy milyen tpus vltozkat is hasznlunk. A vltoz tpusnak meghatrozsa a kvetkezkppen trtnik:
PS C:\> [System.Int32]$szam = 1 PS C:\> $szam = "akarmi" Cannot convert value "akarmi" to type "System.Int32". Error: "Nem megfelel a bemeneti karakterlnc formtuma." At line:1 char:6 + $szam <<<< = "akarmi"

A $szam vltozt Int32 tpusknt hozzuk ltre, ezutn csak szmot (vagy szmknt rtelmezhet karakterlncot) adhatunk neki rtkknt, ms tpus vltozk, vagy objektumreferencik mr nem kerlhetnek bele. Az albbi rtkads tpustalan esetben egy karakterlncot eredmnyezne, de gy a karakterlnc szm megfelelje lesz a vltoz rtke.
PS C:\> [System.Int32]$szam = "123" PS C:\> $szam | get-member TypeName: System.Int32

rtkads nlkl is ltrehozhatunk vltozt a kvetkez mdon:


PS C:\> $b = [System.Int32]

A PowerShell vltozinak tpusaknt teht a .NET valamennyi rtk-, illetve referenciatpust megadhatjuk. Most tegyk egy vltozba a Get-ChildItem cmdlet kimenett:

65

Tpusok
PS C:\> $lista = Get-ChildItem

Tudjuk, hogy a Get-ChildItem kimenete objektumokbl ll, de vajon a vltozba ez milyen formban kerl? Lehet, hogy csak a kpernyre kirt lista van benne egyszer szvegknt? Hogy biztosak lehessnk a dologban, hvjuk segtsgl a rendszergazda legjobb bartjt, a get-member cmdletet:
PS C:\> $lista | get-member TypeName: System.IO.DirectoryInfo Name ---Create CreateObjRef CreateSubdirectory ... MemberType ---------Method Method Method Definition ---------System.Void Create(), System.V... System.Runtime.Remoting.ObjRef... System.IO.DirectoryInfo Create...

Lthatjuk, hogy a vltoz teljesen az eredeti formban, System.IO.DirectoryInfo s System.IO.FileInfo objektumok alakjban tartalmazza a cmdlet kimenett, mg az sem okozott problmt, hogy a gyjtemny kt klnbz tpust is tartalmazott. Interaktv zemmdban a Get-Member tkletesen alkalmas a tpusok feldertsre, de a tpus meghatrozsra nem csak itt, hanem szkriptek kdjban is szksg lehet. Ebben az esetben tbb megolds kzl is vlaszthatunk, taln a legegyszerbb az -is s -isnot opertorok hasznlata. Krdezzk meg, hogy milyen objektumok alkotjk a Get-Process kimenett:
PS C:\> $a = get-process PS C:\> $a -is "System.Diagnostics.Process" False

Nem Process objektumok?! Persze azok, csak nem jl krdeztnk. A GetProcess kimenete ugyanis egy gyjtemny, a Process objektumok pedig ennek belsejben vannak. A Get-Member ezek szerint, br teljesen rthet okok miatt, de mgis hamis eredmnyt ad. Hogyan tudhatjuk meg az igazi tpust? A GetType() metdus az Object osztlybl rkldik, vagyis minden elkpzelhet objektum s vltoz esetn meghvhat:
PS C:\> $a = get-process PS C:\> $a.GetType() IsPublic IsSerial Name -------- -------- ---True True Object[] BaseType -------System.Array

66

Elmlet
A kimenet teht egyszeren egy tmb, amelynek elemei Object tpus objektumok, vagyis brmi beletehet. Ha beleindexelnk a tmbbe, akkor kivehetjk belle az egyik Process objektumot, hogy annak tpust is lekrdezhessk (a Get-Member ezt elzkenyen megteszi helyettnk):
PS C:\> $a = get-process PS C:\> $a[0] -is "System.Diagnostics.Process" True

Mit kell tennnk akkor, ha korltozni szeretnnk ugyan a vltozba kerl tpusok krt, de olyan mdon, hogy mgis tbb klnbz (br hasonl) tpus is belefrjen? A megoldst az osztlyok kztti rklds krnykn kell keresnnk. Minden objektum ugyanis a sajt konkrt tpusn kvl valamennyi sosztly tpusba is beletartozik, mindent tud amit az sei, de ezen fell van mg nhny specilis tulajdonsga s kpessge is. Egy FileInfo osztly objektum teht nemcsak FileInfo, hanem FileSystemInfo (az sosztly) s Object (mindenki sosztlya) is egyben. A vltoz tpust teht gy kell meghatroznunk, hogy az a trolni kvnt objektumok kzs se legyen. Ha ez csak az Object osztly, akkor nincs md korltozsra, a klubnak mindenki tagja lehet. Az albbi vltozba pldul csak s kizrlag DirectoryInfo objektumot tehetnk:
PS C:\> [System.IO.DirectoryInfo]$mappa = Get-Item c:\windows PS C:\> $mappa Mode ---d---LastWriteTime ------------2007.07.25. 8:06 Length Name ------ ---windows

Ha pldul FileInfo-val prblkozunk (aki pedig elg kzeli rokon), csak hibazenetet kaphatunk:
PS C:\> [System.IO.DirectoryInfo]$mappa = Get-Item c:\windows\notepad.exe Cannot convert "C:\windows\notepad.exe" to "System.IO.DirectoryInfo". At line:1 char:32 + [System.IO.DirectoryInfo]$mappa <<<< = Get-Item c:\windows\notepad.exe

Ha mindkt tpust trolni szeretnnk (de semmi mst!), akkor kzs stpus vltozt kell ltrehoznunk:
PS C:\> [System.IO.FileSystemInfo]$mappa = Get-Item c:\windows PS C:\> [System.IO.FileSystemInfo]$mappa = Get-Item c:\windows\notepad.exe

Honnan tudhatjuk meg, hogy egy adott osztlynak mi az se? Termszetesen a .NET SDK dokumentcijbl brmikor, de szerencsre nem kell felttlenl ilyen messzire mennnk. Az sosztly egyszeren a PowerShellbl is lekrdezhet a kvetkez mdon (BaseType oszlop):

67

Tpusok
PS C:\> [System.IO.FileInfo] IsPublic IsSerial Name -------- -------- ---True True FileInfo BaseType -------System.IO.FileSystemInfo

1.5.2 Szmtpusok
Nzzk akkor rszletesebben a tpusokat, azok kzl is a leggyakoribb szmtpusokat s azok jellst: Plda (rtktartomny) 12 (2147483648) 3.12 (1.79769313486232e308) 12345678901 (9223372036854775807) 15d (79228162514264337593543950335) .NET teljes tpusnv System.Int32 System.Double System.Int64 System.Decimal PowerShell rvid nv [int] [double] [long] [decimal]

Az informatikban mg gyakran alkalmazunk hexadecimlis szmokat. Erre kln nincs PowerShellben tpus, viszont hasznlhatunk egy nagyon egyszer jellst:
[20] PS C:\> 0x1000 4096 [21] PS C:\> 0xbaba 47802 [22] PS C:\> 0xfababa 16431802

1.5.3 Tmbk
A programnyelvek egyik legalapvetbb adattpusa a tmb, ami ugye egy olyan vltoz, amely rtkek egy halmazt tartalmazza. Nzzk meg az egyszer tmbktl kezdve a tbbdimenzis tmbkig a lehetsgeket!

1.5.3.1 Egyszer tmbk


A PowerShell nagyon rugalmasan, akr a parancssorban gyorsan begpelhet mdon kezeli a tmbket:

68

Elmlet
[17] PS C:\> $egsztmb = 1,2,11,22,100 [18] PS C:\> $egsztmb 1 2 11 22 100 [19] PS C:\> $egsztmb.gettype() IsPublic IsSerial Name -------- -------- ---True True Object[] BaseType -------System.Array

Ltszik, hogy a tmbk ltrehozshoz s adatainak megadshoz legegyszerbben a vessz (,) karakter hasznlatos. A PowerShellben a tmbk nem csak egyforma tpus elemeket tartalmazhatnak:
[21] PS C:\> $vegyestmb = "szveg", 123, 666d, 3.1415 [22] PS C:\> $vegyestmb szveg 123 666 3,1415

Hogyan lehet egyelem tmbt ltrehozni?


[23] PS C:\> $nemegyelem = "elem" [24] PS C:\> $nemegyelem elem [25] PS C:\> $nemegyelem.GetType() IsPublic IsSerial Name -------- -------- ---True True String [26] PS C:\> $egyelem = ,"elem" [27] PS C:\> $egyelem elem [28] PS C:\> $egyelem.gettype() IsPublic IsSerial Name -------- -------- ---True True Object[] BaseType -------System.Array BaseType -------System.Object

A fenti pldban a *23+-as promptnl ltszik, hogy egyszeren egy tagot megadva termszetesen ahogy korbban is lttuk nem jn ltre egyelem tmb. Ennek legegyszerbb megadshoz a *26+-os promptban alkalmazott trkkt rdemes hasznlni, azaz az elem el egy vesszt kell rakni. Mi van akkor, ha res tmbt akarunk ltrehozni, mert majd ksbb, egy ciklussal akarjuk feltlteni elemekkel? Ehhez ezt a formtumot lehet hasznlni:

69

Tpusok
[29] PS C:\> $restmb = @() [30] PS C:\> $restmb.GetType() IsPublic IsSerial Name -------- -------- ---True True Object[] BaseType -------System.Array

Ezt a @() jellst termszetesen egy- s tbbelem tmbk ltrehozsra is felhasznlhatjuk:


[31] PS C:\> $eet = @(1) [32] PS C:\> $eet 1 [33] PS C:\> $eet.GetType() IsPublic IsSerial Name -------- -------- ---True True Object[] [34] PS C:\> $tet = @(1,2,3,4) [35] PS C:\> $tet 1 2 3 4 [36] PS C:\> $tet.GetType() IsPublic IsSerial Name -------- -------- ---True True Object[] BaseType -------System.Array BaseType -------System.Array

Ha mr ennyit foglalkoztunk tmbkkel, nzzk meg, hogy milyen tulajdonsgaik s metdusaik vannak:
[37] PS C:\> $tet | Get-Member TypeName: System.Int32 Name ---CompareTo Equals GetHashCode GetType GetTypeCode ToString MemberType ---------Method Method Method Method Method Method Definition ---------System.Int32 CompareTo(Object value), System.Int3... System.Boolean Equals(Object obj), System.Boolean... System.Int32 GetHashCode() System.Type GetType() System.TypeCode GetTypeCode() System.String ToString(), System.String ToString(...

Hopp! Ez valahogy nem j! A ngy szmot tartalmaz tmbnk esetben a GetMember nem magnak a tmbnek, hanem a tmb egyes elemeinek adta meg a tagjellemzit. Hogyan lehetne rbrni, hogy magnak a tmbnek a tagjellemzit adja vissza? Segteni kell az elbb ltott, egyelem tmbre vonatkoz (,) trkkel:

70

Elmlet
[38] PS C:\> ,$tet | Get-Member TypeName: System.Object[] Name ---Count Address Clone CopyTo Equals Get GetEnumerator GetHashCode GetLength GetLongLength GetLowerBound GetType GetUpperBound GetValue get_IsFixedSize get_IsReadOnly get_IsSynchronized get_Length get_LongLength get_Rank get_SyncRoot Initialize Set SetValue ToString IsFixedSize IsReadOnly IsSynchronized Length LongLength Rank SyncRoot MemberType ---------AliasProperty Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Property Property Property Property Property Property Property Definition ---------Count = Length System.Object& Address(Int32 ) System.Object Clone() System.Void CopyTo(Array array, Int32 i... System.Boolean Equals(Object obj) System.Object Get(Int32 ) System.Collections.IEnumerator GetEnume... System.Int32 GetHashCode() System.Int32 GetLength(Int32 dimension) System.Int64 GetLongLength(Int32 dimens... System.Int32 GetLowerBound(Int32 dimens... System.Type GetType() System.Int32 GetUpperBound(Int32 dimens... System.Object GetValue(Params Int32[] i... System.Boolean get_IsFixedSize() System.Boolean get_IsReadOnly() System.Boolean get_IsSynchronized() System.Int32 get_Length() System.Int64 get_LongLength() System.Int32 get_Rank() System.Object get_SyncRoot() System.Void Initialize() System.Void Set(Int32 , Object ) System.Void SetValue(Object value, Int3... System.String ToString() System.Boolean IsFixedSize {get;} System.Boolean IsReadOnly {get;} System.Boolean IsSynchronized {get;} System.Int32 Length {get;} System.Int64 LongLength {get;} System.Int32 Rank {get;} System.Object SyncRoot {get;}

Vajon mirt nem ez az alaprtelmezett mkdse a Get-Member-nek? A PowerShell alkoti prbltak mindig olyan megoldsokat kitallni, ami a gyakoribb felhasznlsi esetekre ad j megoldst, mrpedig inkbb az a gyakoribb, hogy egy tmb elemeinek keressk a tagjellemzit, nem pedig magnak a tmbnek. A fenti tagjellemzkbl nzzk meg a fontosabbakat:
[46] 4 [47] 4 [48] 1 [49] True PS C:\> $tet.count # elemszm PS C:\> $tet.length # elemszm PS C:\> $tet.rank # dimenzi PS C:\> $tet.isfixedsize # fix mret?

71

Tpusok
A fenti listban ltjuk, hogy ktfle szintaxissal is lekrhetjk a tmb elemszmt, lekrhetjk, hogy hny dimenzis a tmb s hogy bvthetjk-e a tmbnk elemszmt. Ez utbbi szomor eredmnyt ad, hiszen azt mondja, hogy ez fixmret tmb, nem lehet elemeket hozzadni. Vajon tnyleg?
[54] PS C:\> $tet 1 2 3 4 [55] PS C:\> $tet += 11 [56] PS C:\> $tet 1 2 3 4 11

Azt lthatjuk, hogy az eredetileg ngyelem tmbt minden nehzsg nlkl tudtuk telemre bvteni a += opertorral. Ez azonban valjban nem ilyen egyszeren ment vgbe a felszn alatt, hanem a PowerShell ltrehozott egy j, res tmbt s szpen tmsolta az eredeti tmbnk elemeit, majd hozzbiggyesztette az j tagot. Termszetesen ezt az j tmbt tovbbra is a rgi nv alatt rjk el, de ez mr valjban nem ugyanaz a tmb. Ez akkor rdekes, ha nagyon nagymret tmbkkel dolgozunk, hiszen akkor az j tmb felptse sorn a mvelet vgrehajtsnak vgig ideiglenesen ktszer is troldik a tmb, ami jelents memria-felhasznlst ignyelhet. A .NET Frameworkben van ennl okosabb tmb is, azt is hasznlhatjuk PowerShellben, ez pedig a System.Collections.ArrayList tpus. Nzzk meg ennek a tagjellemzit:
[60] PS C:\> $scal = New-Object system.collections.arraylist [61] PS C:\> ,$scal | Get-Member TypeName: System.Collections.ArrayList Name ---Add AddRange BinarySearch Clear Clone Contains CopyTo Equals GetEnumerator GetHashCode GetRange GetType get_Capacity MemberType ---------Method Method Method Method Method Method Method Method Method Method Method Method Method Definition ---------System.Int32 Add(Object value) System.Void AddRange(ICollectio... System.Int32 BinarySearch(Int32... System.Void Clear() System.Object Clone() System.Boolean Contains(Object ... System.Void CopyTo(Array array)... System.Boolean Equals(Object obj) System.Collections.IEnumerator ... System.Int32 GetHashCode() System.Collections.ArrayList Ge... System.Type GetType() System.Int32 get_Capacity()

72

Elmlet
get_Count get_IsFixedSize get_IsReadOnly get_IsSynchronized get_Item get_SyncRoot IndexOf Insert InsertRange LastIndexOf Remove RemoveAt RemoveRange Reverse SetRange set_Capacity set_Item Sort ToArray ToString TrimToSize Item Capacity Count IsFixedSize IsReadOnly IsSynchronized SyncRoot Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method ParameterizedProperty Property Property Property Property Property Property System.Int32 get_Count() System.Boolean get_IsFixedSize() System.Boolean get_IsReadOnly() System.Boolean get_IsSynchroniz... System.Object get_Item(Int32 in... System.Object get_SyncRoot() System.Int32 IndexOf(Object val... System.Void Insert(Int32 index,... System.Void InsertRange(Int32 i... System.Int32 LastIndexOf(Object... System.Void Remove(Object obj) System.Void RemoveAt(Int32 index) System.Void RemoveRange(Int32 i... System.Void Reverse(), System.V... System.Void SetRange(Int32 inde... System.Void set_Capacity(Int32 ... System.Void set_Item(Int32 inde... System.Void Sort(), System.Void... System.Object[] ToArray(), Syst... System.String ToString() System.Void TrimToSize() System.Object Item(Int32 index)... System.Int32 Capacity {get;set;} System.Int32 Count {get;} System.Boolean IsFixedSize {get;} System.Boolean IsReadOnly {get;} System.Boolean IsSynchronized {... System.Object SyncRoot {get;}

A [60]-as promptban ltrehozok egy j objektumot a new-object cmdlettel, melynek tpusa a System.Collections.ArrayList, majd ennek kilistzom a tagjellemit. Itt mr egsz fejlett lehetsgeket tallunk. Van itt Add metdus, amivel lehet elemet hozzadni, meg van Contains, amivel lehet megvizsglni, hogy egy adott rtk benne van-e a tmbben, az Insert metdussal be lehet szrni elemeket, a Remove-val el lehet tvoltani, a Reverse-zel meg lehet fordtani az elemek sorrendjt, a Sort-tal sorba lehet rendezni:
[67] [68] 1 2 3 4 5 [69] True [70] 5 [71] 1 2 3 4 5 PS C:\> $scal = [system.collections.arraylist] (1,2,3,4,5) PS C:\> $scal

PS C:\> $scal.Contains(4) PS C:\> $scal.add(1000) PS C:\> $scal

73

Tpusok
1000 [72] [73] 1 2 3 200 4 5 1000 [74] [75] 1000 5 4 200 3 2 1 [76] [77] 1 2 3 4 5 200 1000

PS C:\> $scal.insert(3, 200) PS C:\> $scal

PS C:\> $scal.reverse() PS C:\> $scal

PS C:\> $scal.sort() PS C:\> $scal

Az Add-nl vigyzni kell, hogy kimenetet ad, mghozz azt a szmot, amelyik elemknt tette hozz az ppen hozzadott elemet. Ha ez nem kell, akkor el lehet fojtani a kimenetet az albbi kt mdszer valamelyikvel:
[78] PS C:\> [void] $scal.add(1234) [79] PS C:\> $scal.add(2345) > $null

A [78]-es promptban tkonvertljuk a kimenetet [void] tpuss, azaz semmiv. A [79]-as sorban pedig tirnytjuk a semmibe a kimenetet. Most mr csak egy dolgot nem mutattam meg, hogy hogyan lehet hivatkozni a tmbelemekre:
[91] PS C:\> $scal[0] # els elem 1 [92] PS C:\> $scal[2..5] # harmadiktl hatodik elemig 3 4 5 200 [93] PS C:\> $scal[5..2] # hatodiktl harmadik elemig 200 5 4

74

Elmlet
3

A fenti pldkban lthat, hogy a tmbk els elemre a 0-s indexszel lehet hivatkozni. Egyszerre tbb egyms utni elemre a (..) range, azaz tartomny opertorral. Ugyan opertorokkal ksbb foglalkozom, de ez a range opertor annyira ktdik a tmbkhz, hogy rdemes itt trgyalni. Az albbi plda mutatja az alapvet mkdst:
[94] PS C:\> 1..10 1 2 3 4 5 6 7 8 9 10

A range segtsgvel egy msik, rdekes mdon is lehet hivatkozni a tmbelemekre, de az csak a hagyomnyos array-re mkdik:
[95] PS C:\> $a=1,2,3,4,10,8 [96] PS C:\> $a 1 2 3 4 10 8 [97] PS C:\> $a[-1..-3] 8 10 4

A [97]-es prompt azt mutatja, hogy rtelmezett a negatv index, amit a PowerShell a tmb utols elemtl visszafele szmol. A -1. elem az utols elem, -2. az utols eltti s gy tovbb. Ha tbb elem kellene egyszerre? Adjunk meg btran tbb indexet egyszerre! Ebben az esetben termszetesen a visszakapott rtk is egy tmb lesz.
PS C:\> $b = 1..100 PS C:\> $b[5,7,56] 6 8 57

Az mr csak hab a tortn, hogy nemcsak konkrt indexet, hanem intervallumot (st akr tbb intervallumot) adhatunk meg ebben az esetben is.

75

Tpusok
PS C:\> $b = 1..100 PS C:\> $b[2..4 + 56..58] 3 4 5 57 58 59

1.5.3.2 Tbbdimenzis tmbk


Termszetesen egy tmbnek nem csak egyirny kiterjedse lehet, tudunk tbbdimenzis tmbket is ltrehozni. Az albbi pldban gy rem el a ktirny kiterjedst, hogy a $tbla tmb elemeiknt szintn tmbket teszek:
[1] [2] 1 2 3 4 a b c d [3] 1 [4] 2 [5] a PS C:\> $tbla = (1,2,3,4),("a","b","c","d") PS C:\> $tbla

PS C:\> $tbla[0][0] PS C:\> $tbla[0][1] PS C:\> $tbla[1][0]

Ltszik, hogy ilyenkor kt indexszel hivatkozhatunk a dimenzikra. St! Nem csak egyforma hossz sorokbl llhat egy kvzi ktdimenzis tmb:
[7] PS C:\> $vegyes = (1,2,3),("a","b"),("egy","kett","hrom","ngy") [8] PS C:\> $vegyes[0][0] 1 [9] PS C:\> $vegyes[0][2] 3 [10] PS C:\> $vegyes[0][3] [11] PS C:\> $vegyes[1][1] b [12] PS C:\> $vegyes[1][2] [13] PS C:\> $vegyes[2][3] ngy

Az igazi tbbdimenzis tmbt az albbi szintaxissal lehet hivatalosan ltrehozni, s ilyenkor msknt kell hivatkozni a tmbelemekre:
[20] PS C:\> $igazi = new-object 'object[,]' 3,2 [21] PS C:\> $igazi[2,1]="kakukk"

76

Elmlet
Termszetesen nem csak kett, hanem akrhny dimenzis lehet egy tmb, de ilyet valszn csak a robottechnikban hasznlnak. Plda egy tzdimenzis tmbre:
[23] PS C:\> $igazi = new-object 'object[,,,,,,,,,]' 8,3,7,5,6,7,8,9,10,3

1.5.3.3 Tpusos tmbk


Tudunk ltrehozni tpusos tmbket, amelyek csak az adott tpus elemeket tartalmazhatnak:
[1] PS C:\> $t = New-Object int[] 20 [2] PS C:\> $t[1]="szveg" Array assignment to [1] failed: Cannot convert value "szveg" to type "Syst em.Int32". Error: "Input string was not in a correct format.". At line:1 char:4 + $t[1 <<<< ]="szveg"

A fenti pldban ltszik, hogy ltrehozunk elre egy 20 elem int tpus tmbt, amibe ha szveget akarunk betlteni, akkor hibt kapunk. Azonban ha j elemet biggyesztnk hozz, akkor az mr lehet akrmilyen tpus.

1.5.4 Sztrak (hashtblk) s sztrtmbk


A strukturlt adatszerkezetek esetben nagyon praktikusan hasznlhat adattpus a hashtable, vagy magyarul taln sztrnak vagy asszociatv tmbnek lehetne hvni.
[9] PS C:\> $hash = @{ Nv = "Sos Tibor"; Cm = "Budapest"; "e-mail"="soost ibor@citromail.hu"} [10] PS C:\> $hash Name ---Nv e-mail Cm Value ----Sos Tibor soostibor@citromail.hu Budapest

A hashtbla jellse teht egy kukac-kapcsos zrjel pr (@{) jellel s egy lezr kapcsos zrjellel (}) jellel trtnik. Bell kulcs=rtk prokat kell elhelyezni. A kulcs nevt csak akkor kell idzjelezni, ha az valami specilis karaktert (pl. szkz, ktjel, stb.) tartalmaz. Az rtk megadsnl az eddig megszokott formkat kell alkalmazni. Hogyan tudok vajon egy jabb szemlyt felvenni ebbe a hashtblba? Nzzk meg ehhez a hashtbla tagjellemzit:
[12] PS C:\> $hash | Get-Member | ft -wrap TypeName: System.Collections.Hashtable

77

Tpusok
Name ---Add Definition ---------System.Void Add(Object key, Object value) Clear Method System.Void Clear() Clone Method System.Object Clone() Contains Method System.Boolean Contains(Object key ) ContainsKey Method System.Boolean ContainsKey(Object key) ContainsValue Method System.Boolean ContainsValue(Objec t value) CopyTo Method System.Void CopyTo(Array array, In t32 arrayIndex) Equals Method System.Boolean Equals(Object obj) GetEnumerator Method System.Collections.IDictionaryEnum erator GetEnumerator() GetHashCode Method System.Int32 GetHashCode() GetObjectData Method System.Void GetObjectData(Serializ ationInfo info, StreamingContext c ontext) GetType Method System.Type GetType() get_Count Method System.Int32 get_Count() get_IsFixedSize Method System.Boolean get_IsFixedSize() get_IsReadOnly Method System.Boolean get_IsReadOnly() get_IsSynchronized Method System.Boolean get_IsSynchronized( ) get_Item Method System.Object get_Item(Object key) get_Keys Method System.Collections.ICollection get _Keys() get_SyncRoot Method System.Object get_SyncRoot() get_Values Method System.Collections.ICollection get _Values() OnDeserialization Method System.Void OnDeserialization(Obje ct sender) Remove Method System.Void Remove(Object key) set_Item Method System.Void set_Item(Object key, O bject value) ToString Method System.String ToString() Item ParameterizedProperty System.Object Item(Object key) {ge t;set;} Count Property System.Int32 Count {get;} IsFixedSize Property System.Boolean IsFixedSize {get;} IsReadOnly Property System.Boolean IsReadOnly {get;} IsSynchronized Property System.Boolean IsSynchronized {get ;} Keys Property System.Collections.ICollection Key s {get;} SyncRoot Property System.Object SyncRoot {get;} Values Property System.Collections.ICollection Val ues {get;} MemberType ---------Method

Lthatjuk, az Add metdust, gy nzzk meg, azzal mit kapunk:

78

Elmlet
[13] PS C:\> $hash.Add("Nv","Fjdalom Csilla") Exception calling "Add" with "2" argument(s): "Item has already been added. Key in dictionary: 'Nv' Key being added: 'Nv'" At line:1 char:10 + $hash.Add( <<<< "Nv","Fjdalom Csilla")

Ht erre bizony hibajelzst kaptam, mert nem szereti ez az adatszerkezet, ha ugyanolyan kulccsal mg egy rtket akarok felvenni. Csak megvltoztatni tudom az adott kulcshoz tartoz rtket:
[17] PS C:\> $hash.set_Item("Nv","Fjdalom Csilla") [18] PS C:\> $hash Name ---e-mail Cm Nv Value ----soostibor@citromail.hu Budapest Fjdalom Csilla

[19] PS C:\> $hash["Nv"]="Beld Mrton" [20] PS C:\> $hash Name ---e-mail Cm Nv Value ----soostibor@citromail.hu Budapest Beld Mrton

[21] PS C:\> $hash.Nv = "Pandacski Boborjn" [22] PS C:\> $hash Name ---e-mail Cm Nv Value ----soostibor@citromail.hu Budapest Pandacski Boborjn

A fenti pldban ltszik, hogy hrom klnbz szintaxissal is lehet mdostani rtkeket (*17+, *19+ s *21+-es sorok). Lekrdezni az rtkeket is a fenti lehetsgekhez hasonlan lehet:
[27] PS C:\> $hash.Nv Pandacski Boborjn [28] PS C:\> $hash["Nv"] Pandacski Boborjn [29] PS C:\> $hash.get_item("Nv") Pandacski Boborjn

Szval lehetsgek elg szles trhza ll rendelkezsre. Kln lekrhetjk a hashtbla kulcsait s rtkeit is:

79

Tpusok
[32] PS C:\> $hash.keys e-mail adat Cm Nv [33] PS C:\> $hash.values soostibor@citromail.hu 12345 Budapest Pandacski Boborjn

De visszatrve a problmmhoz, hogyan lehet mg egy ember adatait berakni ebbe a hashtblba? Nagyon egyszeren, hashtbla-tmbt kell ltrehozni, mghozz abbl a System.Collections.ArrayList fajtbl, amit tudunk bvteni:
[37] PS C:\> $nvjegyek = New-Object system.collections.arraylist [38] PS C:\> $nvjegyek.Add(@{Nv="Sos Tibor"; "e-mail"="soostibor@citromail.hu";Cm="Budapest"}) 0 [39] PS C:\> $nvjegyek.Add(@{Nv="Fjdalom Csilla"; "e-mail"="fcs@citromail.hu";Cm="Zamrdi"}) 1 [40] PS C:\> $nvjegyek Name ---e-mail Cm Nv e-mail Cm Nv [41] PS C:\> $nvjegyek.count 2 [42] PS C:\> $nvjegyek[0] Name ---e-mail Cm Nv [43] PS C:\> $nvjegyek[1] Name ---e-mail Cm Nv [44] PS C:\> $nvjegyek[1].Nv Value ----fcs@citromail.hu Zamrdi Fjdalom Csilla Value ----soostibor@citromail.hu Budapest Sos Tibor Value ----soostibor@citromail.hu Budapest Sos Tibor fcs@citromail.hu Zamrdi Fjdalom Csilla

80

Elmlet
Fjdalom Csilla [45] PS C:\> $nvjegyek[1]."e-mail" fcs@citromail.hu

gy ezzel a hashtbla-tmbbel adatbzis-szer alkalmazsi terletek adatlekpezsi ignyeit is nagyon jl ki lehet elgteni.

1.5.5 Dtumok ([datetime], Get-Date, Set-Date)


A dtumok kezelsvel kapcsolatban egy alapszablyt mindenkppen be kell tartanunk: soha ne kezdjnk el kzihajtny mdszerrel dtumokat faragni, a beptett metdusok s tulajdonsgok hasznlata nem csak egyszerbb megoldshoz vezet, de a szmtalan hibalehetsg elkerlsnek rdekben egyenesen ktelez. Mit tud a PowerShell a dtumokkal kapcsolatban? Igazsg szerint nem tl sokat, mindssze kt egyszer cmdletet kapunk: A Get-Date segtsgvel az aktulis rendszerdtumot s idt krdezhetjk le, a Set-Date cmdlet pedig ezek belltst kpes elvgezni. A httrben azonban mindig ott van a .NET DateTime osztlya; ennek segtsgvel mr brmit megtehetnk.

Feladat: Ksztsnk dtumot a kvetkez karakterlncbl: 2007. mjus 12., s alaktsuk t 2007.05.12 alakra (termszetesen gy, hogy brmilyen dtumra mkdjn)!

Dtumot ler karakterlncok beolvassra a DateTime osztly statikus Parse() metdusa szolgl. A Parse() egy mindenev metdus, ismeri s beolvassa az sszes szoksos dtumformtumot:
PS C:\> PS C:\> [DateTime]::Parse("2007. mjus 12.") 2007. mjus 12. 0:00:00

A fenti kifejezs egy DateTime objektumot ad vissza (aki nem hiszi, annak Get-Member segt), ennek egy metdust kell meghvnunk, hogy az egyszerbb alakot ellltsuk (az eredmny mr nem dtum, hanem karakterlnc!):
PS C:\> PS C:\> ([DateTime]::Parse("2007. mjus 12.")).ToShortDateString() 2007.05.12.

Megjegyzs A [datetime] konstruktora is kpes nmi dtumrtelmezsre, azonban nem olyan okos, mint a Parse metdus:
[11] PS C:\> $d = [datetime] "2007.05.12." [12] PS C:\> $d

81

Tpusok
2007. mjus 12. 0:00:00 [13] PS C:\> $d = [datetime] "2007. mjus 12." Cannot convert value "2007. mjus 12." to type "System.DateTime". Error: "T he string was not recognized as a valid DateTime. There is a unknown word s tarting at index 6." At line:1 char:16 + $d = [datetime] <<<< "2007. mjus 12."

A [11]-es sorban ltrehozott [datetime] tpus vltozban az ottani formban szvegknt megadott dtumot kpes volt rtelmezni, de a *13+-as sor szvegt mr nem.

Feladat: llaptsuk meg, hogy milyen napra esik az aktulis dtum 13 v mlva!

A 13 vnyi idutazs a PowerShellben nem lehet problma: egy Get-Date eredmnyre meg kell hvnunk az AddYears() metdust. A ht napjnak nevt pedig meglep mdon a DayOfWeek tulajdonsg adja vissza.
PS C:\> (get-date).AddYears(13).DayOfWeek Saturday

A Get-Date kicsit hasznlhat [datetime] objektumok konstruktoraknt is:


[14] PS C:\> $d = Get-Date -year 2007 -month 5 -day 12 [15] PS C:\> $d 2007. mjus 12. 14:02:26

A fenti pldban a Get-Date cmdlettel majdnem ugyanazt rtem el, mint a megjegyzs *11+-es sorban. Egy fontos klnbsg van: mg a korbbi pldban a nem megadott ra, perc, msodperc rtk nulla lett, addig a Get-Date hasznlatval az aktulis ra, perc, msodperc rtk helyettestdik be, ami esetleg nem kvnatos a programunk mkdse szempontjbl.

Feladat: Listzzuk ki azokat a folyamatokat, amelyek az elmlt 1 rn bell indultak el a szmtgpen!

Elszr is le kell gyrtanunk az egy rval ezeltti idt, a vltozatossg kedvrt hasznljuk most a DateTime osztly statikus Now tulajdonsgt. (Statikus tagokkal rszletesebben majd a 1.5.8 .NET tpusok, statikus tagok fejezetben lesz sz.) A msodik sor azokat a Process objektumokat vlogatja le, amelyeknek StartTime tulajdonsgban ennl ksbbi idpont szerepel.
PS C:\> $ora = [DateTime]::Now.AddHours(-1) PS C:\> Get-Process | Where-Object {$_.StartTime -ge $ora} Handles ------NPM(K) -----PM(K) ----WS(K) VM(M) ----- ----CPU(s) -----Id ProcessName -- -----------

82

Elmlet
37 780 172 38 78 2 20 8 2 3 2016 67944 10012 1004 1428 40 6456 2280 848 2668 30 198 52 30 33 0,09 19,06 0,91 0,25 3,25 3144 2496 2884 3128 1256 cmd iexplore mstsc notepad taskmgr

A msodik sorban az $ora vltoz helyre termszetesen berhattuk volna magt a kifejezst is, a kt parancs csak a jobb ttekinthetsg miatt kerlt kln sorba.

Feladat: lltsuk vissza a szmtgp rjt 10 perccel!

A rendszeridt a Set-Date cmdlet segtsgvel tologathatjuk, paramterknt TimeSpan objektumot (lsd ksbb), vagy az adott terleti belltsok mellett idintervallumknt rtelmezhet karakterlncot is megadhatunk. A megolds teht:
PS C:\> Set-Date -adjust -0:10:0 2007. jlius 11. 21:10:16

1.5.5.1 Idtartam szmts (New-TimeSpan)


A New-TimeSpan cmdlet segtsgvel dtum, illetve idintervallumokat adhatunk meg. A albbi parancs pldul a 2006. december 31-e ta eltelt idt adja vissza:
PS C:\> New-TimeSpan (Get-Date) (Get-Date -month 12 -day 31 -year 2006) Days Hours Minutes Seconds Milliseconds Ticks TotalDays TotalHours TotalMinutes TotalSeconds TotalMilliseconds : : : : : : : : : : : -192 -23 -59 -59 -984 -166751999843750 -192,999999819155 -4631,99999565972 -277919,999739583 -16675199,984375 -16675199984,375

A cmdletnek kt DateTime objektumot kell paramterknt adnunk, a visszaadott rtk pedig egy TimeSpan objektum, amely a kt dtum kztti klnbsget tartalmazza. A TimeSpan objektumtl termszetesen egyesvel is elkrhetjk a fenti rtkek brmelyikt a megfelel tulajdonsg nevre val hivatkozssal:
PS C:\> $d=New-TimeSpan (Get-Date) (Get-Date -month 12 -day 31 -year 2006) PS C:\> $d.Ticks -166752000000000

83

Tpusok
A Ticks ignyel taln egy kis magyarzatot, ez az 1600. janur 1. 0:00 ta eltelt 100 ms-okban jelzi az eltelt idt. (1600. eltti esemnyeket nem nagyon tudunk egyszeren se a PowerShellel, se a .NET keretrendszerrel kezelni.)

1.5.6 Automatikus tpuskonverzi


Korbban mr lttuk, hogy a PowerShell megprblja automatikusan megvltoztatni az objektumok tpust, ha szksges, a minl knyelmesebb, egyszerbb parancsbevitel rdekben:
[1] PS I:\>1+2.0+"3" 6 [2] PS I:\>(1+2.0+"3").GetType().FullName System.Double

Az [1]-es promptban ltszik, hogy ssze tudok adni egy egsz szmot, egy lebegpontos szmot egy szveg formtum szmmal anlkl, hogy nekem kellene tpuskonverzit vgezni. A PowerShell ezt helyettem elvgzi. Megnzi, hogy a mvelet tagjait vajon t lehet-e alaktani olyan tpusra, amellyel egyrszt a mvelet elvgezhet, msrszt nem trtnik adatveszts. Erre a clra ebben az esetben a System.Double tpus alkalmas, gy a PowerShell minden tagot erre konvertl, illetve a vgeredmnyt is ilyen formban adja meg. Ez nem csak a matematikai mveletekre igaz, hanem az sszehasonltsokra is:
[12] PS I:\>15 -eq 15d True [13] PS I:\>15.0 -eq 15d True [14] PS I:\>15 -eq "15" True [15] PS I:\>(15).GetType().FullName System.Int32 [16] PS I:\>(15d).GetType().FullName System.Decimal [17] PS I:\>(15.0).GetType().FullName System.Double [18] PS I:\>("15").GetType().FullName System.String

Azaz az egyenlsgvizsglat (-eq) nem alkalmas arra, hogy a nem egyforma tpus objektumokat kiszrhessk segtsgvel, hiszen a PowerShell tpuskonverzit vgezhet. Rszletesebben az sszehasonltsi lehetsgekkel az 1.6.3 sszehasonlt opertorok fejezetben foglalkozom. Az automatikus tpuskonverzinl fontos szben tartani, hogy a kifejezsek szigoran balrl jobbra rtkeldnek ki, gy nem mindegy, hogy milyen sorrendben adjuk meg a mveleteink paramtereit:

84

Elmlet
[20] PS C:\> 1+"2" 3 [21] PS C:\> "2"+1 21

A [20]-as sorban elszr egy int tpus szmmal tallkozik a parancselemz, ehhez prblja hozzigaztani a szveges formtumban megadott 2-t s gy vgzi el a mveletet, amelynek eredmnye 3 lett. A [21]-es sorban a szveges 2-hz igaztja az 1-et, amit szintn szvegg alakt, s a kt szveg sszeadsnak, azaz sszeillesztsnek eredmnyt adja meg, ami 21 lett. Lthatjuk, hogy ennek eredmnye tnyleg sztring tpus:
[22] PS C:\> ("2"+1).gettype().fullname System.String

1.5.7 Tpuskonverzi
Elzekben mutattam, hogy a PowerShell a kifejezsekben megprblja a trivilis tpuskonverzikat elvgezni, olyan tpusv prblja konvertlni a tagokat, amely nem jr informcivesztesggel. Ha mi magunk akarunk tpuskonverzit elvgezni s nem a PowerShell automatizmusra bzni a krdst, akkor erre is van lehetsg:
[1] PS C:\> $a = "1234" [2] PS C:\> $b = [int] $a [3] PS C:\> $b.GetType() IsPublic IsSerial Name -------- -------- ---True True Int32 [4] PS C:\> $c = 4321 [5] PS C:\> $d = [string] $c [6] PS C:\> $d.gettype() IsPublic IsSerial Name -------- -------- ---True True String BaseType -------System.Object BaseType -------System.ValueType

Ennl trkksebb dolgokat is lehet tpuskonverzi segtsgvel elvgezni: Pldul az Exchange Server 2007-ben van egy rejtlyes karaktersorozat az Administrative Group objektumnl. Prbljuk ezt megfejteni tpuskonverzi segtsgvel. Elsknt alaktsuk t a sztringet karaktertmbb:
[10] PS C:\> $s = "FYDIBOHF23SPDLT" [11] PS C:\> [char[]] $s F

85

Tpusok
Y D I B O H F 2 3 S P D L T

Majd ebbl csinljunk egy egsztmbt, amely a karakterkdokat tartalmazza:


[12] PS C:\> [int[]][char[]] $s 70 89 68 73 66 79 72 70 50 51 83 80 68 76 84

Majd ezt a szmsort tltsk bele egy csvezetkbe s vonjunk ki minden elembl egyet:
[13] PS C:\> [int[]][char[]] $s | ForEach-Object{$_ -1} 69 88 67 72 65 78 71 69 49 50 82 79 67 75 83

86

Elmlet
Az gy megkapott szmsort alaktsuk vissza karaktersorozatt:
[14] PS C:\> [char[]]([int[]][char[]] $s | ForEach-Object{$_ -1}) E X C H A N G E 1 2 R O C K S

Itt mr az les szemek felismerik a megoldst, a tbbieknek segtsnk azzal, hogy a karaktersorozatbl sztringet gyrunk ssze:
[15] PS C:\> [string][char[]]([int[]][char[]] $s | ForEach-Object{$_ -1}) E X C H A N G E 1 2 R O C K S

Ez majdnem tkletes, azzal a klnbsggel, hogy felesleges a sok szkz. Megjegyzs Alaphelyzetben a PowerShell, amikor egy karaktertmbbl sztringet rak ssze, akkor az sszefztt elemek kz egy szkzt tesz elvlaszt karakterknt. De szerencsre ez testre szabhat a gyri $ofs vltozval, ami az Output Field Separator. Ha ennek a vltoznak adunk egy res sztring rtket (), akkor ez pont clra vezet:
[16] PS C:\> $ofs="" [17] PS C:\> [string][char[]]([int[]][char[]] $s | ForEach-Object{$_-1}) EXCHANGE12ROCKS

Az $ofs vltoz ellenttben a tbbi, igazi automatikus vltozval alaphelyzetben nem ltezik. Ha ltrehozzuk, akkor a benne trolt sztring lesz az elvlaszt karakter. Mg a dtum tpussal kapcsolatban szoktunk gyakran tpuskonverzit vgezni. Pldul szeretnk kszteni egy olyan fggvnyt, ami kiszmolja, hogy hny nap van mg a szletsnapomig:
[9] PS I:\>function szlinap ([string] $mikor) >> { >> ([datetime] ([string]((get-date).Year) + "-$mikor") - (get-date)).Days >> } >> [10] PS I:\>szlinap "10-14"

87

Tpusok
178

A fggvny mkdse: sztring formtumban berom a szletsi h, nap rtkt ktjelesen (10-14), ehhez az aktulis dtum (Get-Date) sztringg alaktott vszm rszt hozztoldom, ebbl az j, teljes dtumot kiad sztringbl csinlok egy dtumot [datetime], ebbl a dtumbl kivonom az aktulis dtumot, majd ennek az egsznek veszem a napokban kifejezett rtkt (.Days).

1.5.8 .NET tpusok, statikus tagok


A kvetkez tblzatban sszefoglaltam a PowerShell ltal rvid nvvel is hivatkozott tpusokat s azok .NET Frameworkbeli tpusmegnevezst: PowerShell rvid nv [int] [long] [string] [char] [bool] [byte] [double] [decimal] [float] [single] [regex] [array] [xml] [scriptblock] [switch] [hashtable] [psobject] [type] [datetime] [void] .NET tpusnv System.Int32 System.Int64 System.String System.Char System.Boolean System.Byte System.Double System.Decimal System.Single System.Single System.Text.RegularExpressions.Regex System.Array System.Xml.XmlDocument System.Management.Automation.ScriptBlock System.Management.Automation.SwitchParameter System.Collections.Hashtable System.Management.Automation.PSObject System.Type System.DateTime System.Void

Ezen kvl termszetesen hasznlhat ms tpus is a .NET Frameworkbl, de akkor a tpus hivatkozsnl a teljes nvvel kell hivatkozni, mint ahogy ezt tettk korbban a System.Collections.ArrayList tpusnl. Az adott tpus (vagy ms szval osztlyba tartoz) objektumot, azaz annak a tpusnak egy pldnyt a new-object cmdlettel tudjuk ltrehozni.

88

Elmlet
Ezen kvl nagyon sok olyan tpus van a .NET Frameworkben, amelyek estben nem csak akkor profitlhatunk az osztly metdusaibl, ha azok egy pldnyt, objektumt hozzuk ltre, hanem maga az osztly (tpus) is rendelkezik metdusokkal, tagjellemzkkel. Pldul ilyen a [math] osztly. Ebbl nem csinlunk tnyleges objektumot, hanem magnak a [math] tpusnak hvjuk meg a metdusait, tulajdonsgait. Ehhez specilis szintaxist kell alkalmazni:
[1] PS C:\> [math]::pi 3,14159265358979

A fenti pldban a [math] osztly PI tulajdonsgt olvasom ki. Ehhez a (::) u.n. static member hivatkozst kell alkalmazni. Nzzk meg, hogy hogyan lehet egy statikus metdust meghvni:
[2] PS C:\> [math]::Pow(3,2) 9

Itt a hatvnyozs statikus metdust hvtam meg: 3 = 9.

1.5.9 A .NET osztlyok feldertse


Az osztlyok (tpusok) feldertshez, a hasznlatuk magyarzathoz nagyon jl hasznlhatjuk a 1.3.3 fejezetben emltett Reflector programot:

26. bra A Reflector kzvetlenl megnyitja a .NET osztly magyarzatt

Lthat, hogy a helyi menben rgtn meg tudja hvni neknk az adott osztly vagy metdus magyarzatt az MSDN weboldalrl.

89

Tpusok
Termszetesen a get-member cmdlettel is kilistzhatk a statikus tagjellemzk a -static kapcsolval. Albb pldul a [system.convert] osztly ToInt32 metdusa ltszik:
[19] PS C:\> [system.convert] | get-member ToInt32 -MemberType methods -stat ic | ft -wrap TypeName: System.Convert Name MemberType Definition ------------- ---------ToInt32 Method static System.Int32 ToInt32(String value, Int32 fromBase ), static System.Int32 ToInt32(Object value), static Sys tem.Int32 ToInt32(Object value, IFormatProvider provider ), static System.Int32 ToInt32(Boolean value), static Sy stem.Int32 ToInt32(Char value), static System.Int32 ToIn t32(SByte value), static System.Int32 ToInt32(Byte value ), static System.Int32 ToInt32(Int16 value), static Syst em.Int32 ToInt32(UInt16 value), static System.Int32 ToIn t32(UInt32 value), static System.Int32 ToInt32(Int32 val ue), static System.Int32 ToInt32(Int64 value), static Sy stem.Int32 ToInt32(UInt64 value), static System.Int32 To Int32(Single value), static System.Int32 ToInt32(Double value), static System.Int32 ToInt32(Decimal value), stat ic System.Int32 ToInt32(String value), static System.Int 32 ToInt32(String value, IFormatProvider provider), stat ic System.Int32 ToInt32(DateTime value)

Ezzel a metdussal tetszleges szmrendszer szmait lehet egssz konvertlni:


[14] PS C:\> [system.convert]::ToInt32("F", 16) 15 [15] PS C:\> [system.convert]::ToInt32("111111", 2) 63 [16] PS C:\> [system.convert]::ToInt32(111111, 2) 63

Vagy mg egy praktikus .NET osztly a vletlen szm genertor. rdekes mdon itt nem statikus metdusokkal jtszhatunk, hanem tnylegesen ltre kell hozni az adott osztly egy pldnyt s annak kell meghvni a szmgenerl metdust:
[30] PS C:\> $rnd = new-object random [31] PS C:\> $rnd.Next(100) 9 [32] PS C:\> $rnd.NextDouble() 0,780635437825991

A fenti pldban lthat, hogy vagy egy adott egszig terjed egsz vletlen szmot generltatunk a Next metdussal, vagy egy 0 s 1 kztti lebegpontos szmot a NextDouble segtsgvel.

90

Elmlet

Megjegyzs A legtbb esetben nem is kell kirni a .NET osztly teljes nevt. Ha a rvid nv alapjn is egyrtelm, hogy melyik osztlyra is gondoltunk, akkor az is elg. Nzzk kicsit jobban meg a Reflectorral a klnbz .NET osztlyokat! Keressk pldul meg a PowerShell osztlyait, amelyeket a System.Management.Automation nvtrben keresendk:

27. bra Hol a System.Management.Automation nvtr?

A .NET osztlyok j rsze gyorsttrba tltdik, prbljuk meg ezt kihasznlni, s a Reflector File menjnek Open Cache... parancst hvjuk meg:

28. bra Open Cache...

91

Tpusok
Ez sem elg, br van System.Management nvtr, de abban a dll-ben nincs Automation, teht az sem j. Hol van akkor a neknk megfelel dll? Hiba keresem a PowerShell telept knyvtrban:
[1] PS C:\> $pshome C:\WINDOWS\system32\WindowsPowerShell\v1.0

Ott sincsen ilyen dll. Akkor hol van? Gonosz mdon a .NET ptelemek (assembly) trolsi helyt a Windows kicsit elrejti a kvncsi szemek ell.

29. bra Az Assembly-tr

Itt r is lelnk a keresett System.Management.Automation nvtrre, de vajon hogyan lehet ezt megnyitni a Reflectorral? Mert az ottani File/Open menvel mindenkppen .exe, .dll vagy .mcl kiterjeszts fjlt akarna megnyitni. Mrpedig ha a C:\WINDOWS\assembly tra bngsznk, akkor ott nem ltunk dll-eket! Na ez a rejtegets! Mrpedig a dll ott van, csak pp a Windows Explorer rejtegeti ellnk, de a PowerShell ablakban mr clhoz tudunk jutni:
[16] PS C:\> cd C:\WINDOWS\assembly\GAC_MSIL C:\WINDOWS\assembly\GAC_MSIL [17] PS C:\WINDOWS\assembly\GAC_MSIL> dir Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\assembly\GA C_MSIL Mode ---... d---d---d---d---LastWriteTime ------------2008.01.28. 2008.02.22. 2008.02.22. 2008.01.28. 16:53 22:56 22:56 16:53 Length Name ------ ---<DIR> System.Management <DIR> System.Management.Automation <DIR> System.Management.Automation.reso urces <DIR> System.Messaging

92

Elmlet
d---... 2008.01.28. 16:53 <DIR> System.Runtime.Remoting

Belpve a System.Management.Automation knyvtrba s egy kicsit mg belesva a mappastruktrba megtalljuk a keresett dll-t:
[21] PS C:\WINDOWS\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__3 1bf3856ad364e35> dir Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\assembly\GA C_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35 Mode ----a--LastWriteTime ------------2008.02.22. 22:56 Length Name ------ ---1564672 System.Management.Automation.dll

Ezt az elrsi utat kell beadni a Reflectornak, s akkor mr feltrulnak a PowerShell .NET osztlyai:

30. bra A Reflector, immr a PowerShell nvtereivel bvtve

Vajon mire j ez a sok trkkzs? Igazbl nem gyakran kell ide jrklni, nhny tpus bels vilgrl azonban gyjthetnk hasznos informcikat:

93

Tpusok

...

31. bra A ReadKeyOption feldertse

A fenti pldban pldul meg tudjuk nzni, hogy a ReadKey metdusnak milyen opcii vannak. (A ReadKey metdussal a 2.1.3 Lpjnk kapcsolatba a konzolablakkal ($host) fejezetben lesz rszletesen sz.) Vagy a fggvnyek paramtereinek ellenrzst lehetv tev osztlyokat derthetjk fel:

32. bra Validlsi osztlyok feldertse

94

Elmlet
Ezekrl rszletesen a 1.8.2.8 Paramterek, vltozk ellenrzse (validls) fejezetben lesz sz.

1.5.10 Objektumok testre szabsa, kiegsztse


Elljrban annyit meg kell jegyezni, hogy termszetesen a PowerShell parancssori rtelmezjtl nem vrhatjuk el, hogy magt a .NET osztlyokat mdostsa. A PowerShell csak a sajt generic osztlyt, a PSObject osztlyt s annak pldnyait kpes mdostani. Vegynk egy ltalnos objektumot, hvjuk t Base Object-nek. A PowerShell elkpzelhet, hogy nem minden metdust s tulajdonsgot tesz elrhetv, ezeket egy adapter rteggel elfedi. Ha brmilyen mdostst, kiegsztst tesznk ehhez az objektumhoz, pldul definilunk mi magunk valamilyen tulajdonsgot vagy metdust hozz, akkor azt egy jabb, Extended Types rtegben tesszk meg. gy alakul ki a vgleges tulajdonsgs metduslistnk, amit az albbi bra illusztrl:

33. bra PowerShell adaptlt objektummodellje (forrs: http://msdn2.microsoft.com/en-us/library/cc136098(VS.85).aspx)

Az gy elrhet objektum ketts jelleggel br: egyrszt hordozza magban az eredeti Base Object jellegt, de valjban ez mr egy j, PSObject tpus objektum lesz. Ennek megrtshez nzzk meg az albbi pldt, melyben az Add-Member cmdlettel bvtek ki egy objektumot jabb tulajdonsggal, vagy egyb tagjellemzvel. Ilyen tagjellemzk lehetnek:

95

Tpusok
Tagjellemz tpus AliasProperty All CodeMethod CodeProperty MemberSet Method Methods NoteProperty ParameterizedProperty Properties Property PropertySet ScriptMethod ScriptProperty Lers lnv egy mr meglev tulajdonsgra. Minden lehetsges taglehetsg tpus. Olyan metdus, amellyel hivatkozunk egy .NET osztly statikus metdusra. Olyan tulajdonsg, amellyel hivatkozunk egy .NET osztly statikus tulajdonsgra. Tulajdonsgok s metdusok halmaza egy kzs nven. A PSObject alapjaknt szolgl objektumosztly egyik metdusa. Minden metdus. Tulajdonsgnv s tulajdonsgrtk pros, nem szmtott, hanem fix tag. Olyan tulajdonsg, ami paramterezhet. Minden tulajdonsg. A PSObject alapjaknt szolgl objektumosztly egyik tulajdonsga. Tulajdonsghalmaz. Szkripttel megfogalmazott metdus. Szkripttel megfogalmazott tulajdonsg.

Ezek kzl leggyakrabban NoteProperty, ScriptProperty, ScriptMethod testre szabsi lehetsget alkalmazzuk. Akkor nzzk a pldt:
[30] PS C:\> [31] PS C:\> System.Int32 [32] PS C:\> False [33] PS C:\> {$this*2} [34] PS C:\> [35] PS C:\> True [36] PS C:\> [37] PS C:\> 23 [38] PS C:\> [39] PS C:\> $a = 23 $a.GetType().FullName $a -is [PSObject] $a | add-member -memberType Scriptproperty -Name Dupla -value $a.dupla $a -is [PSObject] $a| Get-Member -MemberType scriptproperty $a $a.dupla

Nzzk mi trtnt: a *30+-ban van egy egyszer Int32 vltozm, *32+-ben rkrdezek, hogy vajon nem PSObject-e a szegny? Vlasz az, hogy nem. [33]-ban hozzadok egy szkript alapjn kiszmold tulajdonsgot Dupla nven. Az rtk (value) gy generldik, hogy az adott objektum rtkt ($this vltoz tartalmazza a szkript szmra majd ezt futsi idben) megszorzom 2-vel.

96

Elmlet
Ezutn ki is prblom, lekrem a *34+-ben a dupla tulajdonsgot, de nem kapok vissza semmit. A [35]-ben meg is vizsglom, s hiba lett a $a vltozm mr PSObject, az add-member a csvezetk vgn nem hat vissza az $a vltozra. Szegny PowerShell annyit csinlt csak, hogy rzkelte, hogy itt az $a tulajdonsgainak bvtse trtnik, ezrt az automatikus tpuskonverzi miatt [PSObject]-t tette, de tnylegesen az j tulajdonsgot nem integrltuk bele az $a-ba. Ezrt *36+-ban hiba krdezem le, hogy mi az $a scriptproperty-je, nem kapok vlaszt. s efauldis termszetesen ugyanilyen nmasg a vlasz a nem ltez tulajdonsg lekrdezsre is a [38]-ban. Nzzk akkor meg, hogy hogyan lesz j:
[40] Name [41] 46 [42] PS C:\> $a = add-member -inputobject $a -memberType Scriptproperty Dupla -value {$this*2} -PassThru PS C:\> $a.dupla PS C:\> $a| Get-Member -MemberType scriptproperty

TypeName: System.Int32 Name MemberType Definition ---- ------------------Dupla ScriptProperty System.Object Dupla {get=$this*2;} [43] PS C:\> $a -is [PSObject] True

[40]-ben mr helyesen alkalmazom az add-member cmdletet. rtkadssal kombinlom, $a vegye fel az add-member kimenetn kijv rtket. De baj van! Az add-member-nek alaphelyzetben nincs kimenete! Ezrt talltk ki a PassThru kapcsolt, hogy mgis legyen. Az esetek zmben ugyanis nem az alap .NET osztlyok objektumait szoktuk testre szabni, hanem [PSObject] osztly objektumait, ott meg nem kell semmit visszaadnia az add-member-nek, hiszen helyben hozz tudja adni a tulajdonsgot, metdust. Itt viszont az j, kibvtett PSObject objektumot vissza kell tlteni az eredeti objektumba. [41]-ben mr jl mkdik a Dupla tulajdonsg, a *42]-ben meg azt ltjuk, hogy ott a ScriptProperty-nk, s annak ellenre, hogy ltjuk $a egy TypeName: System.Int32, emellett a [42]-ben azt is ltjuk mg [PSObject] is! Nzznk egy olyan pldt is, ahol nincs szksg ennyi trkkzsre, hanem egy mr eleve PSObject objektumot mdostok. Elszr teht rdemes mindig megvizsglni, hogy egy adott objektum mr eleve PSObject-e vagy sem, hiszen ha nem az, akkor msknt kell eljrni, mintha igen. Vegynk egy fjlt:

97

Tpusok
[2] PS C:\> $f = Get-Item C:\filemembers.txt [3] PS C:\> $f Directory: Microsoft.PowerShell.Core\FileSystem::C:\ Mode ----a--LastWriteTime ------------2008.03.01. 21:09 Length Name ------ ---10 filemembers.txt

[4] PS C:\> $f -is [PSObject] True [5] PS C:\> $f.gettype().FullName System.IO.FileInfo

Ltszik, hogy amellett, hogy ez egy PSObject, mellette System.IO.FileInfo tpus objektum. gy erre mr kzvetlenl alkalmazhatjuk az add-member cmdletet:

mg

[6] PS C:\> $f | Add-Member -MemberType scriptproperty -Name Tpus -Value {if($this -is "System.IO.FileInfo"){"File"} else{"Directory"}} [7] PS C:\> $f.Tpus File

A hinyossga az add-member-rel kibvtett objektumoknak, hogy a bvtmnyket elfelejtik mihelyst j rtket adunk nekik:
[11] PS C:\> $f = get-item c:\old [12] PS C:\> $f.Tpus [13] PS C:\> $f | Add-Member -MemberType scriptproperty -Name Tpus -Value {if($this -is "System.IO.FileInfo"){"File"} else{"Directory"}} [14] PS C:\> $f.Tpus Directory

A [12]-es promptban hiba krem le jra a Tpus tulajdonsgot, nem kapok vlaszt, csak ha jra hozzadom ezt a tagjellemzt. Erre megoldst jelent magnak az osztlynak (tpusnak) a testre szabsa, amit a kvetkez fejezetben mutatok be.

1.5.11 Osztlyok (tpusok) testre szabsa


Az elz fejezetben lttuk, hogy egy osztly egy konkrt objektumpldnynak hogyan adhatunk jabb tagjellemzket. Ez nagyon j lehetsg, csak az a baja mint ahogy lttuk is hogy minden jabb objektum pldnynl jra ltre kell hozni sajt tagjellemzinket. Milyen j lenne, ha magt az osztlyt (tpust) tudnnk mdostani s akkor az adott osztly minden objektuma mr eleve rendelkezne az ltalunk definilt tagjellemzvel. Szerencsre ezt is lehetv teszi a PowerShell!

98

Elmlet
Az objektumtpusok a PowerShell szmra egy types.ps1xml fjlban vannak definilva a C:\WINDOWS\system32\windowspowershell\v1.0 knyvtrban. Azt senki sem ajnlja, hogy ezt tszerkesszk, de hasonl fjlokat mi is kszthetnk, amelyekkel mindenfle dolgot tehetnk az objektumtpusokhoz: j tulajdonsgokat, metdusokat s mg azt is, hogy mely tulajdonsgait mutassa meg magrl az objektum alapban. Ez utbbi is nagyon fontos, mert engem zavart, hogy pldul a get-services cmdlet alapban mirt pont a Status, Name s DisplayName tulajdonsgokat adja ki? Hiszen van neki j nhny egyb tulajdonsga is:
PS C:\Documents and Settings\SoosTibi> Get-Service Status -----Stopped Running Running Stopped ... Name ---Alerter ALG AppMgmt aspnet_state DisplayName ----------Alerter Application Layer Gateway Service Application Management ASP.NET State Service

Erre vlasz ez az elbb emltett types.ps1xml file. Keressk meg benne a szolgltatsok System.ServiceProcess.ServiceController adattpust:
... <Type> <Name>System.ServiceProcess.ServiceController</Name> <Members> <MemberSet> <Name>PSStandardMembers</Name> <Members> <PropertySet> <Name>DefaultDisplayPropertySet</Name> <ReferencedProperties> <Name>Status</Name> <Name>Name</Name> <Name>DisplayName</Name> </ReferencedProperties> </PropertySet> </Members> </MemberSet> <AliasProperty> <Name>Name</Name> <ReferencedMemberName>ServiceName</ReferencedMemberName> </AliasProperty> </Members> </Type> ...

A kiemelsben ltszik, hogy azrt ezeket a tulajdonsgokat mutatja meg alapban a get-service, mert ezek vannak DefaultDisplayPropertySet-knt definilva. Na, de minket most nem ez rdekel, hanem hogy hogyan tudok tpust mdostani. Ltrehoztam egy typemember.ps1xml fjlt:

99

Tpusok
<Types> <Type> <Name>System.IO.FileInfo</Name> <Members> <NoteProperty> <Name>Tipus</Name> <Value> File </Value> </NoteProperty> </Members> </Type> <Type> <Name>System.IO.DirectoryInfo</Name> <Members> <NoteProperty> <Name>Tipus</Name> <Value> Directory </Value> </NoteProperty> </Members> </Type> </Types>

A szerkezet magrt beszl. Definiltam kt klnbz tpusban is egy-egy NoteProperty tulajdonsgot, hiszen itt magbl a tpusbl kvetkezik, hogy fjlrl vagy knyvtrrl van sz, gy nem kell futsi idben kiszmolni semmit sem. Most mr csak be kell etetni a rendszerbe az n tpusmdostsomat s mr nzhetjk is az eredmnyt:
[1] PS C:\> [2] PS C:\> [3] PS C:\> File [4] PS C:\> [5] PS C:\> Directory Update-TypeData C:\powershell2\Tananyag\typemember.ps1xml $f = Get-Item C:\filemembers.txt $f.tipus $f = Get-Item C:\old $f.tipus

Megjegyzs: Sajnos ebben az XML fjlban nem hasznlhatunk kezetes karaktereket, gy a definilt tulajdonsg nem Tpus, hanem Tipus lett. Termszetesen ez csak egy kis zelt volt az osztlyok, tpusok testre szabsbl, a gyakorlati rszben visszatrek majd erre gyakorlatiasabb pldkkal.

1.5.11.1 PSBase, PSAdapted, PSExtended


Mint ahogy az 1.5.10 Objektumok testre szabsa, kiegsztse fejezet elejn bemutattam, a PowerShell igazbl a .NET osztlyokat nem kzvetlenl kezeli, hanem nha kicsit

100

Elmlet
talaktja annak rdekben, hogy mg egysgesebb, egyszerbb, bizonyos esetekben biztonsgosabb legyen ezen objektumok kezelse. Klnbz nzetek segtsgvel mi is lthatjuk azt, hogy milyen csalafintasgokat kvetett el ezeken az osztlyokon a PowerShell: Nzet neve PSBASE PSADAPTED PSEXTENDED PSOBJECT Nzet tartalma A .NET-es osztly eredeti llapotban A PowerShell ltal adaptlt nzet (ezt ltjuk alaphelyzetben) Csak a kibvtett tagok Magnak az adapternek a nzete

Nzznk ezekre nhny pldt. Elsknt az XML adattpust mutatom, mert ott elg jl lthatak ezen nzetek kzti klnbsgek. Nzzk meg egy XML adat tagjellemzit:
[20] PS C:\> $x = [xml] "<elem>rtk<szint1><szint2>mlyadat</szint2></szint 1></elem>" [21] PS C:\> $x | Get-Member TypeName: System.Xml.XmlDocument Name ---ToString add_NodeChanged add_NodeChanging ... Validate WriteContentTo WriteTo Item elem MemberType ---------CodeMethod Method Method Method Method Method ParameterizedProperty Property Definition ---------static System.String X... System.Void add_NodeCh... System.Void add_NodeCh... System.Void Validate(V... System.Void WriteConte... System.Void WriteTo(Xm... System.Xml.XmlElement ... System.Xml.XmlElement ...

Nagyon sok jellemzje van, az egyszerbb ttekinthetsg miatt kicsit megvgtam a kzepn. A legutols jellemz egy Property tpus, elem nev tag. Ht ilyet biztos nem tettek bele a .NET keretrendszerbe. Errl meg is gyzdhetnk:
[22] PS C:\> $x.psbase | Get-Member TypeName: System.Management.Automation.PSMemberSet Name ---add_NodeChanged add_NodeChanging ... ChildNodes DocumentElement DocumentType FirstChild MemberType ---------Method Method Property Property Property Property Definition ---------System.Void add_NodeCh... System.Void add_NodeCh... System.Xml.XmlNodeList... System.Xml.XmlElement ... System.Xml.XmlDocument... System.Xml.XmlNode Fir...

101

Tpusok
HasChildNodes ... Value XmlResolver Property Property Property System.Boolean HasChil... System.String Value {g... System.Xml.XmlResolver...

A fenti listban tnyleg nincs elem nev tulajdonsg. Mirt tettk bele ezt az elem tulajdonsgot vajon a PowerShell alkoti? Azrt, hogy egyszeren lehessen hivatkozni az XML adathalmaz klnbz elemeire, hiszen az XML egy hierarchikus felpts adattpus, gy knnyen addik az tlet az ilyen jelleg hivatkozsi lehetsgre:
[23] PS C:\> $x.elem #text ----rtk [24] PS C:\> $x.elem.szint1 szint2 -----mlyadat [25] PS C:\> $x.elem.szint1.szint2 mlyadat szint1 -----szint1

Nzzk, hogy a PS1XML fjlban trtnt-e tpusbvts az XML tpus esetben?


[53] PS C:\> $x.psextended | Get-Member TypeName: System.Management.Automation.PSMemberSet Name MemberType Definition ------------- ---------ToString CodeMethod static System.String XmlNode(PSObject instance)

Egyetlen egy CodeMethod lett csak definilva, amellyel sztringg alakthatjuk az XML adatot. Nzzk meg az ltalam ltrehozott Tipus tulajdonsgot a fjl s knyvtr objektumoknl:
[27] PS C:\> $fo = Get-Item C:\powershell2\demo\demo1.ps1 [28] PS C:\> $fo.Tipus File [29] PS C:\> $fo.psextended | Get-Member TypeName: System.Management.Automation.PSMemberSet Name MemberType Definition

102

Elmlet
---PSChildName PSDrive PSIsContainer PSParentPath PSPath PSProvider Tipus BaseName Mode ReparsePoint ---------NoteProperty NoteProperty NoteProperty NoteProperty NoteProperty NoteProperty NoteProperty ScriptProperty ScriptProperty ScriptProperty ---------System.String PSChildName=demo1.ps1 System.Management.Automation.PSDriveInfo PS... System.Boolean PSIsContainer=False System.String PSParentPath=Microsoft.PowerS... System.String PSPath=Microsoft.PowerShell.C... System.Management.Automation.ProviderInfo P... System.String Tipus=File System.Object BaseName {get=[System.IO.Path... System.Object Mode {get=$catr = "";... System.Object ReparsePoint {get=if($this.At...

Ott lthat a listban az ltalam, a PS1XML fjlon keresztl trtnt tpusbvtsnek a nyoma. Nzznk mg egy pldt a PSBase nzet hasznlatra:
[30] PS C:\> $user = [ADSI] "WinNT://asus/administrator" [31] PS C:\> $user.name Administrator [32] PS C:\> $user | Get-Member TypeName: System.DirectoryServices.DirectoryEntry Name ---AutoUnlockInterval BadPasswordAttempts Description FullName HomeDirDrive HomeDirectory LastLogin LockoutObservationInterval LoginHours LoginScript MaxBadPasswordsAllowed MaxPasswordAge MaxStorage MinPasswordAge MinPasswordLength Name objectSid Parameters PasswordAge PasswordExpired PasswordHistoryLength PrimaryGroupID Profile UserFlags MemberType ---------Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Definition ---------System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV... System.DirectoryServices.PropertyV...

Egy helyi felhasznlt betltttem a $user nev vltozmba, szpen le is tudtam krdezni a nevt. Majd amikor kilistzom a felhasznlm tagjellemzit, meglepdve lt-

103

Tpusok
hatjuk, hogy nincs kztk egy metdus sem! Mrpedig nehezen hihet el, hogy tnyleg semmit nem tud egy felhasznli fik magval kezdeni. Nzznk az objektumunk mg:
[34] PS C:\> $user.psbase | Get-Member TypeName: System.Management.Automation.PSMemberSet Name ---add_Disposed ... get_Parent get_Path get_Properties ... Rename set_AuthenticationType set_ObjectSecurity set_Password set_Path set_Site set_UsePropertyCache set_Username ToString AuthenticationType Children Container Guid Name NativeGuid NativeObject ObjectSecurity Options Parent Password Path Properties SchemaClassName SchemaEntry Site UsePropertyCache Username MemberType Definition ---------- ---------Method System.Void add_Disposed(EventHandl... Method Method Method Method Method Method Method Method Method Method Method Method Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property System.DirectoryServices.DirectoryE... System.String get_Path() System.DirectoryServices.PropertyCo... System.Void Rename(String newName) System.Void set_AuthenticationType(... System.Void set_ObjectSecurity(Acti... System.Void set_Password(String value) System.Void set_Path(String value) System.Void set_Site(ISite value) System.Void set_UsePropertyCache(Bo... System.Void set_Username(String value) System.String ToString() System.DirectoryServices.Authentica... System.DirectoryServices.DirectoryE... System.ComponentModel.IContainer Co... System.Guid Guid {get;} System.String Name {get;} System.String NativeGuid {get;} System.Object NativeObject {get;} System.DirectoryServices.ActiveDire... System.DirectoryServices.DirectoryE... System.DirectoryServices.DirectoryE... System.String Password {set;} System.String Path {get;set;} System.DirectoryServices.PropertyCo... System.String SchemaClassName {get;} System.DirectoryServices.DirectoryE... System.ComponentModel.ISite Site {g... System.Boolean UsePropertyCache {ge... System.String Username {get;set;}

Hopp! Mindjrt ms a helyzet. A metdusok zme termszetesen tartomnyi krnyezetben hasznlhat, de pldul a rename() vagy a set_password() metdus helyi gpen is praktikus szolgltats. Vajon ezek a metdusok mirt nincsenek alaphelyzetben adaptlva a PowerShell krnyezetre? Erre az igazi vlaszt nem tudom, valszn ez egy biztonsgi megfontols volt, hogy a szkriptelk ne rogassanak feleltlenl olyan szkripteket, amelyekkel a felhasznli objektumokat mdostanak. Vagy az is lehet a magyarzat, hogy egy msik interfszt sznt volna igazbl a Microsoft a felhasznl menedzsment cljaira, amin keresztl mdostani lehetett volna, de ez az 1.0-s PowerShell verziba mr nem frt bele.

104

Elmlet

1.5.12 Objektumok mentse, visszatltse


A PowerShell lehetsget biztost objektumok elmentsre s visszatltsre. Ez nagyon praktikus, hiszen ha pp a konzolon a vltozim jl fel vannak tltve mindenfle objektummal s nekem valami miatt be kell csuknom a PowerShell ablakot, akkor a vltozim trldnek s legkzelebb jra el kellene lltanom ket. Az Export-CliXML cmdlettel ki tudom ezeket menteni egy fjlba, bezrhatom a PowerShell ablakot, majd ksbb vissza tudom importlni a vltozim rtkt az Import-CliXML cmdlettel. Nzznk erre egy pldt:
[13] PS C:\> $p = Get-Process w* [14] PS C:\> $p Handles ------123 655 700 215 161 30 NPM(K) -----7 159 49 12 7 3 PM(K) ----2836 10748 40684 4708 2704 1020 WS(K) VM(M) ----- ----7924 74 2976 97 78780 280 8584 79 7728 39 3088 50 CPU(s) -----0,09 11,77 50,63 0,11 0,19 0,02 Id -2464 440 2316 2196 1812 504 ProcessName ----------WindowsSearch winlogon WINWORD WLLoginProxy wmiprvse wscntfy

[15] PS C:\> $p | get-member TypeName: System.Diagnostics.Process Name ---Handles Name NPM PM VM WS add_Disposed add_Disposed(Event... ... [16] [17] [18] [19] [20] PS PS PS PS PS C:\> C:\> C:\> C:\> C:\> MemberType ---------AliasProperty AliasProperty AliasProperty AliasProperty AliasProperty AliasProperty Method Definition ---------Handles = Handlecount Name = ProcessName NPM = NonpagedSystemMemorySize PM = PagedMemorySize VM = VirtualMemorySize WS = WorkingSet System.Void

$p | Export-Clixml c:\export.xml Clear-Variable p $p $p = Import-Clixml C:\export.xml $p PM(K) ----2836 10748 40684 4708 2704 WS(K) VM(M) ----- ----7924 74 2976 97 78780 280 8584 79 7728 39 CPU(s) -----0,09 11,77 50,63 0,11 0,19 Id -2464 440 2316 2196 1812 ProcessName ----------WindowsSearch winlogon WINWORD WLLoginProxy wmiprvse

Handles ------123 655 700 215 161

NPM(K) -----7 159 49 12 7

105

Tpusok
30 3 1020 3088 50 0,02 504 wscntfy

[21] PS C:\> $p | get-member TypeName: Deserialized.System.Diagnostics.Process Name ---Handles Name NPM PM VM WS __NounName BasePriority Container EnableRaisingEvents ... MemberType ---------AliasProperty AliasProperty AliasProperty AliasProperty AliasProperty AliasProperty NoteProperty Property Property Property Definition ---------Handles = Handlecount Name = ProcessName NPM = NonpagedSystemMemorySize PM = PagedMemorySize VM = VirtualMemorySize WS = WorkingSet System.String __NounName=Process System.Int32 {get;set;} {get;set;} System.Boolean {get;set;}

A fenti pldban a $p vltoz megkapta a W-vel kezdd processz-objektumok tmbjt. A [15]-ben ltszik, hogy ez tnyleg jl nevelt System.Diagnostics.Process objektumokat tartalmaz, a rjuk jellemz tulajdonsgokkal s metdusokkal egytt. Ezutn kiexportltam $p-t, trltem majd visszaimportltam. *20]-ban megnzem, mi van $p-ben, szemre teljesen ugyanaz, mint korbban. Azonban a *21+ get-member-je felfedi, hogy azrt ez mgsem 100%-osan ugyanaz az objektum, hiszen elvesztette a metdusait s tpusa is ms lett: Deserialized.System.Diagnostics.Process. Mindenesetre, ha a statikus adataival szeretnnk csak foglalkozni ez bven elg, les, real time adatokkal meg gysem biztos, hogy tudnnk dolgozni, hiszen az export ta lehet, hogy megszntek mr a korbban fut processzek.

106

Elmlet

1.6 Opertorok
Minden programnyelv alapvet elemei az opertorok. A PowerShell alkoti az opertorok esetben is arra trekedtek, hogy minl hatsosabbak legyenek, azaz a lehet legtmrebb kifejezsekkel lehessen a legtbb eredmnyt elrni. Ebben a fejezetben a PowerShell opertorait mutatom be.

1.6.1 Aritmetikai opertorok


A legtrivilisabb opertorok a kifejezs eredeti jelentse alapjn vals szmokon vgezhet mveletekhez ktdik. A PowerShell ezen jval tlmutat, a matematikai tanulmnyainkban megszokott mveletek ki vannak terjesztve egyb objektumokra: tbbek kztt a tmbkre, sztringekre, fjlokra.

1.6.1.1 sszeads
Rgtn nzznk is pldkat az sszeadsra:
[1] PS C:\> 5+4 9 [2] PS C:\> "ab" + "lak" ablak [3] PS C:\> "egy", "kett", "hrom" + "ngy", "t" egy kett hrom ngy t

Ltszik, hogy akr az egszekre, sztringekre vagy a tmbkre is rtelmezett az sszeads. Ebben jelents szerepe van a .NET Framework osztlydefinciinak, hiszen valjban az rdemk, az megfelel sszeadst vgz metdusuk, hogy mi is trtnik tnylegesen az sszeads hatsra. A PowerShell csak abban ludas, hogy megtallja az adott metdust s talaktsa a kifejezst, esetlegesen tpuskonverzit vgezzen az operandusok kztt. A Reflector programmal ezeket meg is tudjuk nzni, a szmoknl az op_Addition metdust kell keresni:

107

Opertorok

34. bra Az sszeads metdusainak feldertse a Reflectorral

A sztringeknl taln az Append metdust, de ezzel neknk nem kell trdni, ezt a PowerShell helyettnk elvgzi. Ezen kvl mg dtumokat s esetlegesen hashtblkat szoktunk mg sszeadni:
[4] PS I:\>$hash1 = @{Els = 1; Msodik = 2} [5] PS I:\>$hash2 = @{Harmadik = 3; Negyedik = 4} [6] PS I:\>$hash1 + $hash2 Name ---Msodik Harmadik Negyedik Els Value ----2 3 4 1

Dtumoknl kicsit zrsebb a helyzet:


[12] PS I:\>get-date 2008. mrcius 11. 9:53:26 [13] PS I:\>(get-date) + 5000000000000 2008. mrcius 17. 4:47:00

J nagy szmot kellett a dtumhoz adnom, hogy valami lthat legyen az eredmnyen, mert valjban a dtum u.n. tick-ekben, ketyegsekben szmoldik, ami 100 ms-os felbonts idtrolst tesz lehetv. pp ezrt a dtumoknl mr eleve van mindenfle praktikusabb Add metdus:

108

Elmlet
[18] PS I:\>get-date | Get-Member TypeName: System.DateTime Name ---Add AddDays AddHours AddMilliseconds v... AddMinutes AddMonths AddSeconds AddTicks AddYears ... [19] PS I:\>get-date 2008. mrcius 11. 9:57:55 [20] PS I:\>(get-date).AddDays(5) 2008. mrcius 16. 9:58:10 MemberType ---------Method Method Method Method Method Method Method Method Method Definition ---------System.DateTime System.DateTime System.DateTime System.DateTime System.DateTime System.DateTime System.DateTime System.DateTime System.DateTime

Add(TimeSpan value) AddDays(Double value) AddHours(Double value) AddMilliseconds(Double AddMinutes(Double value) AddMonths(Int32 months) AddSeconds(Double value) AddTicks(Int64 value) AddYears(Int32 value)

A fenti pldban elszr kilistztam a get-date ltal visszaadott [DateTime] tpus metdusait, majd a *20+-as sorban 5 napot adtam az aktulis dtumhoz.

1.6.1.2 Tbbszrzs
Az sszeadshoz hasonlan a szorzs is jelents ltalnostson esett t:
[10] 42 [11] wwww [12] BO CI BO CI BO CI [13] BO CI BO CI BO CI [14] PS C:\> 6*7 PS C:\> "w"*4 PS C:\> ("BO","CI")*3

PS C:\> "BO","CI"*3

PS I:\>("BO","CI"*3).length

109

Opertorok
6

Lthatjuk, hogy a szveget is lehet szorozni, ez annyiszor teszi ssze a szveget, ahny a szorzsjel utn ll. Tmbnl is hasonlan tbbszrzi a tagokat. A *13+-as promptnl ltszik, hogy nem is kell zrjelet hasznlni! Ez a PowerShell alkotinak az rdeme. Megjegyzs rdekes mdon a *14+-es promptban ltszik, hogy a kttag tmb hromszorozsa utn nem hromelem lett (3 darab ktelem), hanem hatelem! Nzzk meg, hogy mi trtnik, ha felcserljk a szorzs operandusit:
[15] PS C:\> 3*"BO","CI" Cannot convert "System.Object[]" to "System.Int32". At line:1 char:3 + 3*" <<<< BO","CI" [16] PS C:\> 3*("BO","CI") Cannot convert "System.Object[]" to "System.Int32". At line:1 char:3 + 3*( <<<< "BO","CI")

Azt lthatjuk, hogy nem mindegy, hol van a szorz s a tnyez. A szorznak kell mindig jobb oldalon llnia, ha nem, akkor hibt kaphatunk, mint ahogy az a [15]-es s *16]-s sor utn is kaptunk, hiszen a PowerShell az automatikus tpuskonverzit balrl jobbra vgzi, azaz az *int+ tpust veszi alapnak, s ehhez prblja igaztani a szorzs kvetkez tnyezit, ami itt szvegek s ktelem tmb esetn - nem sikerlt.

1.6.1.3 Oszts, maradkos oszts


Termszetesen oszts is van a PowerShellben:
[32] PS I:\>15/5 3 [33] PS I:\>(15/5).GetType() IsPublic IsSerial Name -------- -------- ---True True Int32 [34] PS I:\>15/6 2,5 [35] PS I:\>(15/6).GetType() IsPublic IsSerial Name -------- -------- ---True True Double BaseType -------System.ValueType BaseType -------System.ValueType

110

Elmlet

[36] PS I:\>2,4/1,2 Method invocation failed because [System.Object[]] doesn't contain a method nam ed 'op_Division'. At line:1 char:5 + 2,4/1 <<<< ,2 [37] PS I:\>(15/6)/(125/100) 2

A [32]-es prompt egyrtelm, 15-t elosztunk 5-tel, 3-at kapunk, nem is akrmilyen 3at: Int32 tpust! Szemben a 15/6-tal, aminek eredmnye termszetesen *35+-ben Double. Egy kicsit idzznk el itt! Hogyan is nz ki a *34+ eredmnyeknt kapott 2,5? A tizedes elvlasztsra vesszt hasznlt a PowerShell! Viszont a *36+-ban nem szerette ezt, mert a (,) ltalban tmb jelzsre szolgl opertor. Akkor vajon fog tudni dolgozni ezzel az ltala kiadott 2,5-gyel? A [37]-ben azt ltjuk, hogy termszetesen igen! s itt jn ki a PowerShell objektumalapsgnak nagy elnye! Annak ellenre, hogy a megjelentsnl hasznlja az aktulis gp terleti belltsait, s ennek megfelelen jelenti meg a szmokat, amikor szmol tovbb egy objektummal, akkor terleti bellts-mentesen kezeli ezt. Ha sztring alap lenne a PowerShell, hasonlan a Linuxos/Unixos shellekhez, akkor vagy a kimenet nem venn figyelembe a terleti belltsokat, vagy egy csom sztring-hkuszpkuszt kellene elvgezni ahhoz, hogy ilyen egyszer mveletek mkdhessenek. Ha mi adunk be szmokat a parancssor szmra, akkor mindig ponttal jelezzk a tizedesjelet, nem a terleti bellts alapjn kell berni a szmokat. Ebbe a fejezetbe tartozik mg a maradkos oszts mvelete, a %:
[41] PS I:\>21%5 1 [42] PS I:\>1.4%1.1 0,3

Ezzel nincs sok trkk, hiszen ez az opertor csak szmokra van rtelmezve, viszont nem csak egszekre, ahogy ez a *42+-ben ltszik.

1.6.2 rtkads
rtket mr szmtalanszor adtam, gy az alapeset nem fog senkinek meglepetst okozni:
[49] PS I:\>$a=5 [50] PS I:\>$a 5

Azonban nem csak ilyen mdon lehet rtket adni.

111

Opertorok
[51] [52] 13 [53] [54] 9 PS I:\>$a+=8 PS I:\>$a PS I:\>$a-=4 PS I:\>$a

Az [51]-tl kezdden ltszik, hogy ha ugyanannak a vltoznak az aktulis rtkvel szeretnnk mveletet vgezni s utna ezt visszatlteni a vltoznkba, akkor ennek tmr formjt is alkalmazhatjuk az adott mveleti jel s az egyenlsgjel kombincijval. Nzzk a trkksebb formkat! Ha ugyanolyan rtket szeretnk adni tbb vltoznak is, akkor ezt tmren is megtehetem:
[59] [60] 81 [61] 81 [62] 81 PS I:\>$x=$y=$z=81 PS I:\>$x PS I:\>$y PS I:\>$z

Vigyzzunk a vesszvel!
[63] [64] 1 [65] 2 [66] 3 [67] [68] PS I:\>$x, $y, $z, $w = 1,2,3 PS I:\>$x PS I:\>$y PS I:\>$z PS I:\>$w PS I:\>

A [63]-as sorban vesszvel soroltam fel a vltozimat, amelyeknek szintn vesszvel elvlasztott rtkeket adok. Ahelyett, hogy mind a ngy vltozm felvenn a hromelem tmbt rtkknt, az els vltozm megkapta az els tagot, a msodik a msodikat s gy tovbb. Szegny $w-nek nem jutott rtk, gy res maradt. Ha fordtott a helyzet, azaz a vltozk vannak kevesebben, mint az rtkek, akkor az utols megkapja a maradkot egy tmbknt:
[69] PS I:\>$x, $y = 1,2,3 [70] PS I:\>$y 2 3

Ez a vltozk felsorolsnak lehetsge jl jhet szvegek feldolgozsakor.


[71] PS I:\>$sor = "Sos Tibor Budapest" [72] PS I:\>$vezetknv, $keresztnv, $vros = $sor.Split() [73] PS I:\>$vezetknv Sos

112

Elmlet
[74] PS I:\>$keresztnv Tibor [75] PS I:\>$vros Budapest

A [72]-ben lthat Split() metdus a sztringek gyakran felhasznlt metdusa, ami a paramtereknt tadott karakter mentn feldarabolja a sztringet. Ha resen hagyjuk a paramtert (mint most), akkor a norml szelvlaszt karakterek mentn trdel. Kimeneteknt az gy szttrdelt sztringekbl ll tmbt adja vissza, amit szpen betltk a vltozimba.

1.6.3 sszehasonlt opertorok


Az sszehasonlts mvelett vgz sszehasonlt opertorok jelzsre a PowerShell alkoti nem a hagyomnyos jeleket (=, <, >, <>, !=, stb.) vlasztottk, hanem kln jellst vezettek be, rgtn kt klnbz szrit a kis-nagybet rzketlen s rzkeny vltozatra: Opertor -eq -ne -gt -ge -lt -le Lers egyenl nem egyenl nagyobb nagyobb egyenl kisebb kisebb egyenl Kis-nagybet rzkeny opertor -ceq -cne -cgt -cge -clt -cle Lers egyenl nem egyenl nagyobb nagyobb egyenl kisebb kisebb egyenl

Megjegyzs rzketlen vltozatknt hasznlhatjuk az opertorok i bets megfelelit is: -ieq, -ine, -igt, stb., de ezek az alap vltozattal teljesen ekvivalensen mkdnek. rtelemszeren az rzkeny vltozatot elsdlegesen szvegek sszehasonltsakor hasznljuk, de a szmoknl se ad hibt alkalmazsuk. Nzznk akkor nhny pldt mindezek alkalmazsra:
[79] PS True [80] PS False [81] PS True [82] PS True [83] PS I:\>1 -ceq 1 I:\>1 -eq 2 I:\>1 -eq 1 I:\>1 -ceq 1 I:\>"ablak" -eq "ABLAK"

113

Opertorok
True [84] PS I:\>"ablak" -ceq "ABLAK" False [85] PS I:\>5 -gt 2 True

Sokat azt hiszem nem is kell magyarzni. Megjegyzs A kis-nagybet rzkenysgnek van egy specilis esete, amikor nem sztringeket, hanem karaktereket hasonltunk ssze:
[36] PS C:\> "a" -eq "A" True [37] PS C:\> [char] "a" -eq "A" False [38] PS C:\> [char] "a" -like "A" True

A [36] az alapeset sztringgel, a [37]-ben karaktereket hasonltok ssze, ott mr szmt a kis-nagybet. Ha ezt nem tekintjk klnbznek, akkor hasznlhatjuk a like opertort is (lsd ksbb). Taln azt rdemes megnzni, hogy a szvegeket hogyan tudom nagysg szempontjbl sszehasonltani:
[86] PS False [87] PS True [88] PS True [89] PS False [90] PS False [91] PS False I:\>"ablak" -gt "ajt" I:\>"baba" -gt "ablak" I:\>"ablak" -lt "llat" I:\>"asztal" -lt "llat" I:\>"" -lt "a" I:\>"ab" -cgt "Ab"

Ltszik, hogy itt a terleti belltsoknak megfelel sztr-sorrend alapjn dl el, hogy melyik sztring nagyobb a msiknl. Megjegyzs Nmi bug van a dologban:
[92] PS I:\>"b" -gt "ab" True [93] PS I:\>"c" -gt "ab" True [94] PS I:\>"b" -gt "ac"

114

Elmlet
False

Itt a [94]-es sorban helytelenl mondja, hogy nem nagyobb az b az ac-tl. Ez a Windows XP-m magyar nyelvi belltsnak sorba rendezsi alapbelltsnak ksznhet. Ha ezt tvltjuk technical-ra, akkor helyes, sztr szerinti sszehasonltst s sorrendet fogunk kapni. Vigyzat! A PowerShell sszehasonlts sorn is vgez automatikus tpuskonverzit:
[1] PS I:\>"1234" -eq 1234 True [2] PS I:\>1234 -eq "1234" True

Persze nem mindenkor tud okos lenni, ha nagyon akarjuk, akkor tverhetjk:
[3] PS I:\>"0123" -eq 123 False

Ugye itt a 0-val kezdd, idzjelek kz tett szm esetn azt tartja valsznbbnek, hogy ez szveg, s akkor a jobb oldalon lev rszt is szvegg konvertlja magban, mrpedig a 0123 nem egyenl 123-mal. Nzzk meg, hogy vajon tmbk esetben hogyan mkdnek ezek az sszehasonlt opertorok?
[10] 1 1 1 [11] 2 2 2 [12] 1 2 1 2 1 [13] 4 [14] PS I:\>1,2,3,4,1,2,3,1,2 -eq 1

PS I:\>1,2,3,4,1,2,3,1,2 -eq 2

PS I:\>1,2,3,4,1,2,3,1,2 -lt 3

PS I:\>1,2,3,4,1,2,3,1,2 -eq 4 PS I:\>1,2,3,4,1,2,3,1,2 -eq 5

Hopp! Az els, amit lthatunk tmbk esetben, hogy nem True vagy False rtket kapunk, hanem azokat az elemeket, amelyekre igaz az adott sszehasonlt mvelet. St! Ahogy a *14+-es promptban is lthat, ha nincs egyezs, akkor sem kapunk False-t, hanem semmi a vlasz. Ha a jobb oldalon van tmb, akkor nem igazn kapunk egyenlsget semmilyen esetben sem:

115

Opertorok
[19] PS I:\>(1,2),3 -eq 1,2 [20] PS I:\>1,2 -eq 1,2 [21] PS I:\>1 -eq 1,2 False

1.6.4 Tartalmaz (-contains, -notcontains)


Az elz fejezetben azt lthattuk, hogy az sszehasonlt eq elg furcsa mdon mkdik tmbk esetben. Ezrt, hogy ha csak arra vagyunk kvncsiak, hogy egy tmb tartalmaz-e valamilyen elemet, akkor erre a contains opertor hasznlhat, illetve ennek negltja, a notcontains:
[24] PS I:\>1,2,3,4,1,2,3,1,2 -contains 3 True [25] PS I:\>1,2,3,4,1,2,3,1,2 -notcontains 5 True

Sajnos itt is vigyzni kell, ha a jobb oldalon tmb ll, mert nem ad tallatot:
[26] PS I:\>(1,2),3 -contains (1,2) False

1.6.5 Dzsker-mintk (-like)


Ha valaki a szmtgpekkel kezd el foglalkozni, azon bell a fjlokkal, akkor viszonylag hamar tallkozik a (*) karakterrel, mint dzsoli-dzskerrel. A PowerShellben nagyon kiterjedt lehetsgeket adnak az ilyen jelleg dzsoli-dzskerek, akr a hagyomnyosnak tn DOS parancsokkal is:
[2] PS C:\scripts> dir Directory: Microsoft.PowerShell.Core\FileSystem::C:\scripts Mode ---d----a---a---a---a---a---a---a---a---a---a---a--LastWriteTime ------------2008.02.22. 22:47 2008.01.15. 20:21 2008.01.11. 11:36 2008.02.12. 11:07 2008.02.12. 11:07 2008.02.12. 11:06 2008.02.08. 20:47 2008.02.08. 20:55 2008.02.11. 8:36 2008.01.14. 8:16 2008.02.09. 21:15 2008.02.12. 11:34 Length -----<DIR> 709 235 382 253 823 32 22 42496 229376 726 1760 Name ---EntryForm alice.txt coffee.txt DebugMe.pl DebugMe.ps1 DebugMe.vbs lettercase.txt numbers.txt Password_Checklist.doc pool.mdb presidents.txt readme.txt

116

Elmlet
-a---a---a---a---a---a--2008.02.05. 2007.01.03. 2008.02.08. 2008.02.08. 2007.01.03. 2007.01.03. 13:52 8:00 20:48 20:46 8:00 8:00 3366 2139 80 46 60358 328620 skaters.txt songlist.csv symbols.txt vertical.txt votes.txt wordlist.txt

[3] PS C:\scripts> dir *.txt Directory: Microsoft.PowerShell.Core\FileSystem::C:\scripts Mode ----a---a---a---a---a---a---a---a---a---a---a--LastWriteTime ------------2008.01.15. 20:21 2008.01.11. 11:36 2008.02.08. 20:47 2008.02.08. 20:55 2008.02.09. 21:15 2008.02.12. 11:34 2008.02.05. 13:52 2008.02.08. 20:48 2008.02.08. 20:46 2007.01.03. 8:00 2007.01.03. 8:00 Length -----709 235 32 22 726 1760 3366 80 46 60358 328620 Name ---alice.txt coffee.txt lettercase.txt numbers.txt presidents.txt readme.txt skaters.txt symbols.txt vertical.txt votes.txt wordlist.txt

[4] PS C:\scripts> dir s*.txt Directory: Microsoft.PowerShell.Core\FileSystem::C:\scripts Mode ----a---a--LastWriteTime ------------2008.02.05. 13:52 2008.02.08. 20:48 Length -----3366 80 Name ---skaters.txt symbols.txt

[5] PS C:\scripts> dir [ad]*.txt Directory: Microsoft.PowerShell.Core\FileSystem::C:\scripts Mode ----a--LastWriteTime ------------2008.01.15. 20:21 Length Name ------ ---709 alice.txt

[6] PS C:\scripts> dir [a-r]*.txt Directory: Microsoft.PowerShell.Core\FileSystem::C:\scripts

117

Opertorok

Mode ----a---a---a---a---a---a---

LastWriteTime ------------2008.01.15. 20:21 2008.01.11. 11:36 2008.02.08. 20:47 2008.02.08. 20:55 2008.02.09. 21:15 2008.02.12. 11:34

Length -----709 235 32 22 726 1760

Name ---alice.txt coffee.txt lettercase.txt numbers.txt presidents.txt readme.txt

[7] PS C:\scripts> dir ?o*.txt Directory: Microsoft.PowerShell.Core\FileSystem::C:\scripts Mode ----a---a---a--LastWriteTime ------------2008.01.11. 11:36 2007.01.03. 8:00 2007.01.03. 8:00 Length -----235 60358 328620 Name ---coffee.txt votes.txt wordlist.txt

Azt hiszem, a fenti pldk magukrt beszlnek. Kiemelnm az *a-r+ formult, teht ez az a s r kzti sszes bett helyettesti. Ilyen jelleg dzskeres kifejezseket lehet hasznlni a like, -notlike vizsglatokkal, s a kis-nagybet rzkeny vltozataikkal: -clike, -cnotlike:
[11] PS False [12] PS True [13] PS False [14] PS False [15] PS False C:\scripts> "ablak" -like "[a-f]lak" C:\scripts> "ablak" -like "[a-f]blak" C:\scripts> "ablak" -clike "[A-F]blak" C:\scripts> "blak" -clike "[A-F]blak" C:\scripts> "blak" -like "[a-f]blak"

Hasonlan bnik el a tmbkkel is a like s a tbbi dzskeres opertorunk, mint ahogyan az eq is:
[17] PS C:\scripts> "ablak", "abrosz", "alabstrom", "baba" -like "ab[l-r]*" ablak abrosz

Termszetesen dzskeres kifejezs csak az opertor jobb oldaln llhat.

118

Elmlet

1.6.6 Regex (-match, -replace)


A dzskerek nagyon praktikusak, de egy csom mindenre nem jk. Pldul szeretnnk megvizsglni, hogy egy szveg e-mail cm formtum-e? Vagy van-e a szvegben valahol egy webcm, vagy telefonszm? Mivel ilyen jelleg vizsglatok nagyon gyakoriak a szmtstechnikban, ezrt erre kln tudomnyg alakult, matematikai alapjt pedig a formlis nyelvek kpezik. Az ilyen jelleg szvegminta vizsglatok kifejezseit hvjk Regular Expression-nek, vagy rviden Regex-nek. Miutn ez tnylegesen kln tudomny, Regular Expression kifejezsekrl szmtalan knyv ltott napvilgot, ezrt itt most nem vllalkozom arra, hogy mg csak kzelt rszletessggel trgyaljam ezt a tmt, de azrt a fbb elveket s jellseket megprblom bemutatni.

1.6.6.1 Van-e benne vagy nincs?


Elsknt nzznk a legegyszerbb esetet, amikor egy szvegrl el akarjuk dnteni, hogy van-e benne ltalunk keresett mintra hasonlt szvegrsz:
[12] PS C:\> "Benne van a NAP sz" -match "nap" True [13] PS C:\> "Benne van a NAPfny sz" -match "nap" True

A fenti kt plda mg nem igazn mutatja meg a regex erejt, akr a like opertor is hasznlhat lett volna:
[14] PS C:\> "Benne van a NAP sz" -like "*nap*" True

De vajon mit tennnk, ha a napfny-t nem tekintennk a mintnkkal egyeznek, csak az nll nap-ot? Az nllsgot persze sokfajta karakter jellheti: szkz, pont, zrjel, stb. A regex-szel ez nagyon egyszer, hasznlni kell a szvg jell \b karakterosztly szimblumot a mintban:
[15] PS C:\> "Benne van a NAPfny sz" -match "\bnap\b" False [16] PS C:\> "Benne van a NAP. Fny is" -match "\bnap\b" True [17] PS C:\> "Benne van a (NAP)" -match "\bnap\b" True

Azaz keresek egy olyan mintt, amely ll egy szelvlaszt karakterbl, a nap-bl, s megint egy szelvlaszt karakterbl.

119

Opertorok

Megjegyzs: Mint ahogy lttuk, egy regularris kifejezsben a \b szhatrt jell, de ha ezt szgletes zrjelek kztt [] alkalmazzuk (lsd ksbb a karakterosztlyokat), akkor a \b a visszatrls, azaz a backspace karaktert jelenti. A csernl (-replace, lsd szintn ksbb) a \b mindig visszatrls karakter jelent. Vagy keresem, hogy van-e a szvegben szm:
[26] PS C:\> "Ebben van 1 szm" -match "\d" True

A \d a szmjegy jellje. Ezen jellknek van negltjuk is, \B a nem szelvlaszt karakter, \D a nem szmjegy. Vagy keresem a Sos neveket, akik lehetnek Ss-ok is, de azrt Soos ne legyen:
[23] PS C:\> "Sos" -match "So?s" True [24] PS C:\> "Ss" -match "So?s" True [25] PS C:\> "Soos" -match "So?s" False

A ? 0 vagy 1 darabot jell az azt megelz regex kifejezsbl. A * brmennyi darabot jelent, akr 0-t is. A + legalbb 1 darabot jell. Tetszleges darabszmot jellhetnk {min,max- formban, ahol a maximum akr el is hagyhat. Kereshetem az s-sel kezdd, s-sel vgzd hromkarakteres szavakat:
[26] PS C:\> "Ez egy j tallat 'sas' nekem" -match "\bs.s\b" True [27] PS C:\> "Ez nem j tallat 'saras' nekem" -match "\bs.s\b" False

Alaphelyzetben a . minden karaktert helyettest, kivve a sortrst. Egyszeren vizsglhatom, hogy van-e a szvegben kezetes bet:
[28] PS C:\> "kezet van ebben tbb is" -match "[]" True [29] PS C:\> "Ekezetmentes" -match "[]" False

A *+ zrjelpr kzti betk vagylagosan kerlnek vizsglat al, ezt is gy hvjuk, hogy karakterosztly (meg a \d, \w, stb. kifejezseket is). Ezzel karakter tartomnyokat is meg lehet jellni:
[30] PS C:\> "A" -match "[a-f]" True [31] PS C:\> "G" -match "[a-f]"

120

Elmlet
False

Termszetesen ezeket az alapelemeket kombinlni is lehet. Keresem a legfeljebb ngyjegy hexadecimlis szmot:
[32] PS C:\> "Ebben van ngyjegy hexa: 12AB" -match "\b[0-9a-f]{1,4}\b" True [33] PS C:\> "Ebben nincs: 12kicsiindin" -match "\b[0-9a-f]{1,4}\b" False [34] PS C:\> "Ebben sincs: 12baba" -match "\b[0-9a-f]{1,4}\b" False

A fenti karakterosztlyokban hasznlhatunk neglt vltozatot is. Pldul tartalmaz olyan karaktert, ami nem szkz jelleg karakter:
[35] PS C:\> "Van nem szkz is benne" -match "[^\s]" True [36] PS C:\> " " -match "[^\s]" False

A nem szkz-nek van egyszerbb jellse is:


[37] PS C:\> "Van nem szkz is benne" -match "[\S]" True [38] PS C:\> " " -match "[\S]" False

Ennek analgijra van nem szkarakter - \W, nem szmjegy - \D. A szgletes zrjelek kztt csak karaktereket hasznlhatok vagylagos rtelemben. Ha azt akarom vizsglni, hogy a szvegben vagy PowerShell vagy PS tallhat, azt gy vizsglhatom:
[39] PS C:\> "Ebben PowerShell van" -match "(PowerShell|PS)" True [40] PS C:\> "Ebben PS van" -match "(PowerShell|PS)" True [41] PS C:\> "Ebben egyik sem" -match "(PowerShell|PS)" False

Hogy egy kicsit trkksebb legyen, nzzk az albbi kt pldt:


[42] PS C:\> "ab" -match "[^ab]" False [43] PS C:\> "ab" -match "[^a]|[^b]" True

A [42]-es sorban azrt kaptunk hamis eredmnyt, mert kerestnk egy nem a, de nem is b karaktert, de az ab-ben csak ilyen van, gy hamis eredmnyt kaptam. A [43]as sorban kerestem egy vagy nem a, vagy nem b karaktert, mrpedig az ab els ajra igaz, hogy az nem b, teht van tallat!

121

Opertorok

1.6.6.2 Van benne, de mi?


Az eddigiekben a match opertorral arra kaptunk vlaszt egy $true vagy $false formjban, hogy a keresett minta megtallhat-e a szvegnkben vagy sem. De egy bonyolultabb mintnl, ahol vagy felttelek vagy karakterosztlyok is vannak, egy $true vlasz esetben nem is tudjuk, hogy most mit is talltunk meg. Nzzk meg ezt, az utols plda kapcsn:
[43] PS C:\> "ab" -match "[^a]|[^b]" True [44] PS C:\> $matches Name ---0 Value ----a

Mint lthat, a PowerShell automatikusan generl egy $matches vltozt, amely tartalmazza, hogy mit is talltunk a match opertor alkalmazsa sorn. Jelen esetben megtallhattuk volna a b-t is, hiszen arra is igaz, hogy nem a, de a match opertor szigoran balrl jobbra halad, gy elszr az a karakterre vizsglja a mintt. Ha ott sikert r el, akkor nem is halad tovbb, megelgszik az eredmnnyel s abbahagyja a keresglst. A $matches igazbl nem is egy tmbt, hanem egy hashtblt tartalmaz, amelynek 0-s kulccsal hivatkozhat eleme a megtallt sztring. Nzznk erre nhny pldt:
[22] PS C:\> "Ez itt egy plda: szveg" -match ":.*" True [23] PS C:\> $matches[0] : szveg [24] PS C:\> $matches.gettype() IsPublic IsSerial Name -------- -------- ---True True Hashtable BaseType -------System.Object

Kerestk a kettspontot s utna tetszleges szm karaktert, illetve lthat, hogy a $matches tnyleg hashtbla.

1.6.6.3 A moh regex


A match mgtt meghzd regex motor moh, azaz ha r bzzuk a mennyisgeket, akkor alapesetben annyit vesz belle, amennyit csak tud a match kielgtse mellett. Ez nem biztos, hogy neknk mindig j:
[26] PS C:\> "Keresem ezt: xTallatx, az x-ek kzti szveget" -match "x.*x" True [27] PS C:\> $matches[0] xTallatx, az x

122

Elmlet
Mi trtnt itt? Ugye xTallatx-re szmtottunk, de mohsg miatt az els x megtallsa utn a .* minta a szvegem vgig kielgti a felttelt. Csak az utols karakter elrse utn dbben r a regex motor, hogy lemaradt az utols felttel, a msodik x teljestse, s ekkor kezd visszafele lpkedni, hogy htha mg ezt is tudja teljesteni valahol. A visszafele lpkeds sorn eljut a harmadik x-ig, s ott ll meg. Mit lehetett volna tenni, hogy a kvnt tallatot kapjuk meg? A regex mohsgt ki is lehet kapcsolni, ehhez egy ?-et kell tenni az ilyen meghatrozatlan szm tbbszrzk utn. Ekkor csak a minimlis darabszmot veszi a mintbl, s ha az nem elg, akkor nveli azt:
[32] PS C:\> "Keresem ezt: xTallatx, az x-ek kzti szveget" -match "x.*?x" True [33] PS C:\> $matches[0] xTallatx

Vagy pontosthatjuk a .* mintt, hiszen ha pldul a kt x kztt szkarakterek lehetnek csak, akkor pontosabb ez a minta:
[41] PS C:\> "Keresem ezt: xTallatx, az x-ek kzti szveget" -match "x\w*x" True [42] PS C:\> $matches[0] xTallatx

Vagy ez is lehet megolds:


[43] PS C:\> "Keresem: xTallatx, az x-ek kzti szveget" -match "x[^x]+x" True [44] PS C:\> $matches[0] xTallatx

Itt azzal tettem a regexet szernyebb, hogy az x utni nem x karaktereket keresem x-ig. Ez azrt is j, mert jval hatkonyabb ennek az ellenrzse, nincs felesleges ide-oda jrkls a mintban. Nagytmeg feldolgozsnl sokkal gyorsabban eredmnyre jutunk.

1.6.6.4 Escape a Regex-ben


Ezen utbbi pldknl gondot jelenthet, ha az x-nl valami sszerbb szepartor szerepel a keresett szvegrsznk hatraknt. Ilyen elvlaszt karakter szokott lenni mindenfajta zrjel, perjel, stb. Ezek a regexben is legtbbszr funkcival brnak, gy ha rjuk keresnk, akkor escape karakterrel kell megelzni ezeket. A regexben az escape karakter a visszafele-perjel (\), nem pedig a PowerShellben megszokott visszafele aposztrf (`)! A fenti x-es pldt cserljk () zrjel-prra:
[45] PS C:\> "A zrjelek kzti (szveget) keresem" -match "\([^)]*\)" True [46] PS C:\> $matches[0] (szveget)

123

Opertorok

Megjegyzs: Ne csak a $matches vltoz tartalmra hagyatkozzunk egy match vizsglat sorn, mert ha nincs tallatunk, attl mg a $matches tartalmazza egy korbbi match eredmnyt:
[62] PS True [63] PS b [64] PS False [65] PS b C:\> "baba" -match "b" C:\> $matches[0] C:\> "baba" -match "c" C:\> $matches[0]

1.6.6.5 Tudjuk, hogy mi, de hol van?


Most mr tudjuk, hogy van-e a mintnknak megfelel szvegrsznk, azt is tudjuk, hogy mi az, csak azt nem tudjuk, hogy hol tallta a match. Ez fleg akkor rdekes, ha tbb tallatunk is lehet. Az alapmkdst mr megbeszltk, a regex balrl jobbra elemez:
[3] PS C:\> "Minta az elejn, vgn is minta" -match "minta" True [4] PS C:\> $matches[0] Minta

Errl meg is gyzdhetnk, hiszen a fenti tallat nagy M-mel kezddik, az pedig a szvegnk legeleje. A regex lehetsget biztost, hogy a szvegnk vgn keressk a mintt:
[7] PS C:\> "Minta az elejn, vgn is minta" -match "minta$" True [8] PS C:\> $matches[0] minta

Itt a tallat kis m bets lett, gy ez tnyleg a szvegem vge. Teht a szveg vgt egy $ jel szimbolizlja a mintban. Ez azonban nem jelent fordtott mkdst, azaz itt is balrl jobbra trtnik a kirtkels. A $ jelet gy lehet felfogni, mintha az az eredeti szvegemben is ott lenne rejtett mdon, s gy a minta tnyleg csak a sor vgn illeszkedik a szvegre. Pldul a szveg utols szava:
[10] PS C:\> "Utols szt keresem" -match "\b\w+$" True [11] PS C:\> $matches[0] keresem

124

Elmlet
A szveg elejre is lehet hivatkozni a kalap (^) jellel. Teht az a kalap jel ms funkcij a szgletes *+ zrjelek kztt (negls), mint a sima regex mintban, ahol szveg elejt jelenti:
[15] PS C:\> "1234 Elejn van-e szm?" -match "^\d+" True [16] PS C:\> $matches[0] 1234 [17] PS C:\> "Elejn van-e 4321 szm?" -match "^\d+" False

Az elz pldban csak a szveg elejn tallhat szmot tekintjk a mintval egyeznek. Most mr tudjuk, hogy az elejn vagy a vgn talltuk-e a mintnak megfelel szveget, de vajon egy kztes szveget, pldul szkzk kzti szveget hogyan tudunk gy megtallni, hogy magt a szkzket ne tartalmazza a tallat? Erre - egyik megoldsknt alkalmazhatjuk a csoportostst a mintban:
[25] PS C:\> "Ez szkzk kztti" -match "\s(.+?)\s" True [26] PS C:\> $matches Name ---1 0 Value ----szkzk szkzk

Itt a mintban tallhat (\.+?) rsz a gmbly zrjelek kztt egy lusta tbbszrztt (a ? lusttja el a + hatst) szkarakter al-minta a teljes minta rszeknt, ms szval csoport. A $matches[0] tovbbra is a teljes tallatot tartalmazza, de most mr van egy $matches[1] is, ami az els tallati csoport eredmnyt tartalmazza. Termszetesen tbb csoportot is elklnthetnk, pldul szmjegyek csoportjait:
[28] PS C:\> "T.: (+36-1) 123-4567" -match "\(\+(\d+)-(\d+)\)\s(\d{3}\d{4})" True [29] PS C:\> $matches Name ---3 2 1 0 Value ----123-4567 1 36 (+36-1) 123-4567

A fenti pldban egy telefonszmbl vlasztom ki kln az orszgkdot, a krzetszmot s a helyi szmot. Termszetesen egy ilyen mintt sszerakni nem egyszer segdeszkz nlkl. Erre hasznlhatunk olyan eszkzket, mint pldul a 1.3 Segdprogramok fejezetben emltett RegexBuddy:

125

Opertorok

35. bra Bartunk megint segt: rtelmez s tesztel

Ez a segdprogram a mintnk klnbz rszeit sznkdokkal jelzi, s a Create fln rszletes magyarzatot is kapunk az ltalunk bert mintrl, szre tudjuk venni, hogy esetleg kifelejtettnk egy escape karaktert. A Test fln meg ellenrizni tudjuk, hogy megkapjuk-e tallatknt a helyes szveget, illetve azt is, hogy a nem j szveg tnyleg nem tallat-e. Ezeket a csoportokat nevesthetjk is a jobb azonosthatsg rdekben:
[47] PS C:\> "Telefon: (+36-1) 123-4567" -match "\(\+(?<orszg>\d+)-(?<krze t>\d+)\)\s(?<helyi>\d{3}-\d{4})" True [31] PS C:\> $matches Name ---krzet helyi orszg 0 Value ----1 123-4567 36 (+36-1) 123-4567

Teht a csoportot jelz nyit zrjel mg tett ? s <> kacsacsrk kztti cmkvel tudjuk nevesteni a csoportot. Itt nyer rtelmet, hogy a $matches mirt hashtbla, s mirt nem egyszer tmb. Mi van akkor, ha egy csoportra nincs szksgnk? Erre hasznlhatjuk a (?:), u.n. nem rgzl csoportot:
[36] PS C:\> "123-4567" -match "(?<eleje>\d+)(?:-)(?<vge>\d+)" True [37] PS C:\> $matches Name ---eleje Value ----123

126

Elmlet
vge 0 4567 123-4567

A fenti pldban a ktjelet nem rgzl csoportba helyeztem, gy az nem is szerepel kln tallatknt, de termszetesen a teljes tallatban ($matches[0]) benne van. Termszetesen a csoportokra is alkalmazhatjuk a ? tbbszrzs-jellt, ami jelenti ugye a 0 vagy 1 darabot, azaz kezelhetjk azokat a telefonszmokat is, ahol nincs orszgkd s krzetszm:
[42] PS C:\> "Telefon: (+36-1) 123-4567" -match "(\(\+(?<orszg>\d+)(?<krzet>\d+)\)\s)?(?<helyi>\d{3}-\d{4})" True [43] PS C:\> $matches Name ---krzet helyi orszg 1 0 Value ----1 123-4567 36 (+36-1) (+36-1) 123-4567

Ilyenkor a [42]-es pldban lthat mdon az egymsba gyazott csoportok kln tallatot adnak a listban, jelen esetben 1-es szmmal. Nzzk mi van akkor, ha nincs orszgkd s krzetszm:
[44] PS C:\> "Telefon: 123-4567" -match "(\(\+(?<orszg>\d+)(?<krzet>\d+)\)\s)?(?<helyi>\d{3}-\d{4})" True [45] PS C:\> $matches Name ---helyi 0 Value ----123-4567 123-4567

Most trjnk t a match egy nagy korltjhoz: csak az els tallatig keres. Br az elz pldban hasznltuk a ?-et, ms tbbszrzsek nem gy mkdnek, ahogy szeretnnk. Vegynk egy olyan mintt, amellyel el szeretnnk klnteni a szavakat, kezdjnk egyszersg kedvrt hrom szval:
[76] PS C:\> "egy kett hrom" -match "(\w+)\s(\w+)\s(\w+)" True [77] PS C:\> $matches Name ---3 2 1 0 Value ----hrom kett egy egy kett hrom

127

Opertorok
Meg is kaptuk a vrt csoportokat. Vajon egyszersthetjk-e ezt a kifejezst, egyszersmind felkszthetjk-e a mintnkat vltoz szm szra?
[84] PS C:\> "egy kett hrom" -match "((?<sz>\w+)\W){3}" True [85] PS C:\> $matches Name ---sz 1 0 Value ----hrom hrom egy kett hrom

Mr a fix szm vizsglatot se tudtam elrni, a $matches nem jegyzi meg egy adott pozcij csoport korbbi rtkeit. Itt csak a legutols sz, a hrom kerlt bele a hashtblba. Azaz hiba igaz az, hogy csak hrom sz egyidej jelenlte teljesti a felttelt, a vgeredmnybe csak az utols sz kerl bele. Ezt a problmt kicsit ksbb oldom meg.

1.6.6.6 Tekintsnk elre s htra a mintban


Egyelre kanyarodjunk oda vissza, hogy a minta helyt valamilyen elvlaszt karakter szabja meg. Ha magt a mintt nem akarjuk a tallatban viszontltni, akkor egyik megoldsknt alkalmazhatjuk a csoportokat. Egy msik lehetsg a mintban az elretekints s visszatekints lehetsge. Pldul nzzk csak azokat a szmokat, amelyek zrjelek kztt vannak:
[86] PS C:\> "sima: 12, nem j: 11), ez sem: (22, ez j: (46)" -match >> "(?<=\()\d+(?=\))" >> True [87] PS I:\>$matches Name ---0 Value ----46

Na, ez megint kezd kicsit hasonltani az egyiptomi hieroglifkhoz. Nzzk meg, hogy hogyan vizualizlja ezt a RegexBuddy:

128

Elmlet

36. bra RegexBuddy rtelmezi a mintt

A (?<=xxx) szerkezet visszatekint, azaz megvizsglja, hogy az aktulis vizsglati pozci eltt az xxx minta megtallhat-e. Ha nem, akkor mr meg is bukott a vizsglat. A minta vgn tallhat (?=xxx) elretekint, azaz megvizsglja, hogy az aktulis vizsglati pozci utn az xxx minta megtallhat-e. Br mindkt kitekint minta zrjeles, de ahogy [87]-ben lthatjuk, nem adnak vissza tallatot. Ezen kitekint mintknak is van negatv vltozatuk, azaz pont azt keressk, hogy a mintnk eltt vagy utn ne legyen valamilyen minta:
[22] PS I:\>"rak: Bann:207 Alma:88" -match "(?<!Bann:)\d+" True [23] PS I:\>$matches[0] 07

Hopp! Ez nem is j. Mit is szerettem volna? A nem bann gymlcs rt szerettem volna kiszedni. Azonban a mintm teljesl mr a bann rnl is a 2-es utn, hiszen a 2 az nem Bann:. Azaz ebbl az a tanulsg, hogy igen gyakran, a negatv kitekints mell pozitvat is kell rakni, mert a nem egyezs az nagyon sokflekppen teljeslhet. A mi esetnkben teht a j megolds:
[24] PS I:\>"rak: Bann:207 Alma:88" -match "(?<!Bann:)(?<=:)\d+" True [25] PS I:\>$matches[0] 88

Azaz itt most a pozitv rsz a : kettspont meglte. Ez a kt felttel egyttesen mr kielgti a keressi feladatot.

129

Opertorok

Megjegyzs: Felmerlhet a tisztelt olvasban, hogy van-e rtelme egykarakteres esetben a negatv krltekintsnek, hiszen hasznlhatnnk negatv karakterosztlyt is. Nzzk, hogy mi a klnbsg a kett kztt. Keresem a nem szmjeggyel folytatd a bett:
[26] PS True [27] PS AS [28] PS True [29] PS A [30] PS False [31] PS True [32] PS A C:\> "CAS" -match "a[^\d]" C:\> $matches[0] C:\> "CAS" -match "a(?!\d)" C:\> $matches[0] C:\> "CA" -match "a[^\d]" C:\> "CA" -match "a(?!\d)" C:\> $matches[0]

A [27]-es s *29+-es sorokban lthat a klnbsg az eredmnyben, de ennl slyosabb a helyzet akkor, ha nincs az a bet utn nem szmjegy, hiszen ekkor a negatv karakterosztly fals eredmnyt ad, mert a minta azon helyre mindenkppen akar valamit passztani, mg a negatv elretekints esetben a mintnak nincs hinyrzete, ha nincs ott semmi mr.

1.6.6.7 A mintm visszakszn


Trjnk vissza a csoportokhoz! Hogyan lehetne felismerni azokat a szavakat, amelyek ugyanolyan elvlaszt karakterek kztt vannak:
[16] PS C:\> "-valami-" -match "(\W)\w+\1" True [17] PS C:\> "/valami/" -match "(\W)\w+\1" True

Azaz egy csoport eredmnyt mr magban a mintban is felhasznlhatom. A csoportra trtn hivatkozs formtuma \1, \2, stb. Fontos! Ha egy csoportot ilyen visszahivatkozsban akarjuk szerepeltetni, akkor az a csoport nem lehet nem rgzl csoport, azaz a ?: jellst nem hasznlhatjuk. Termszetesen nevestett csoportokra is lehet hivatkozni, ennek formja: \k<nv>:
[28] PS C:\> "A ktszer ktszer rossz" -match "(?<sz>\b\w+\b).+\k<sz>" True

130

Elmlet
[29] PS C:\> $matches.sz ktszer

1.6.6.8 Vltozatok a keressre


Az eddigi pldkban azt lthattuk, hogy a match opertor, hasonlan a tbbi szveges opertorhoz nem kis-nagybet rzkeny. De mint ahogy a tbbinl is ennek is van kis-nagybet rzkeny vltozata is, a -cmatch:
[1] PS I:\>"Ebben Kis Nagy van" -cmatch "kis" False

Ha pont a nem egyezsget akarjuk vizsglni, arra a notmatch vagy a kis-nagybet rzketlen cnotmatch hasznlhat:
[2] PS I:\>"Nem szeretem a kacsamajmot!" -notmatch "kacsamajom" True [3] PS I:\>$matches [4] PS I:\>

Termszetesen a $true vlasz ellenre itt a $matches nem ad tallatot. A match mg ezt is lehetv teszi, hogy egy keressi mintn bell vltogassuk a klnbz opcikat. Erre a specilis zemmd jell ad lehetsget: (?imnsx-imnsx) (?imnsx-imnsx: ) i m n s x Jelentse (a mintra), (vagy az adott csoportra vonatkozan) kis-nagybet rzketlen tbbsoros zemmd, a ^ s $ metakarakterek a sorvgekre is illeszkednek explicit capture, azaz csak a nevestett csoportok rgzlnek, a nvnlkli csoportok nem egysoros zemmd, a . metakarakter illeszkedik a sorvgkarakterre szkzt figyelmen kvl hagyja a mintban, ilyenkor csak a \s-sel hivatkozhatunk a szkzre

A fenti tblzat fejlcben tallhat jelzs egy kis magyarzatra szorul. A (?imnsximnsx) jelzs, a vgn kettspont nlkl jelzi, hogy ez az egsz mintra vonatkozik. Termszetesen nem hasznljuk egyszerre az ssze opcit bekapcsolt s kikapcsolt mdon. Pldul:
"szveg" -match "(?im-sx)minta"

131

Opertorok
Ebben a pldban az i s m opci be van kapcsolva, az s s az x meg ki van kapcsolva. Ha egy mintn bell tbbfajta zemmdot szeretnnk, akkor jn a kettpontos vltozata ezen kapcsolk hasznlatnak:
"szveg" -match "minta(?-i:M)"

A fenti pldban csak az M betre, mint rszmintra vonatkozik a kis-nagybet rzketlensg kikapcsolsa. Nzznk ezek hasznlatra gyakorlati pldkat!
Tegyk kis-nagybet rzkenny a vizsglatot: [1] PS C:\> "a NAGY betst keresem" -match "(?-i)NAGY" True [2] PS C:\> "a NAGY betst keresem" -match "(?-i)nagy" False

Kikapcsoltam az rzketlensget, azaz kis-nagybet rzkenny tettem a vizsglatot, s csak a nagybets minta esetben kaptam tallatot. Nzzk a tbbsoros szveg vizsglatnak opciit:
[5] PS C:\> $szveg="els sor1 >> msodik sor2" >> [6] PS C:\> $szveg -match "sor\d$" True [7] PS C:\> $matches[0] sor2 [8] PS C:\> $szveg -match "(?m)sor\d$" True [9] PS C:\> $matches[0] sor1

Ltrehoztam egy ktsoros szveget, keresem a sorvgi sor szt s egy szmjegyet. A kt sorvgnl a szmmal teszek klnbsget, hogy a tallatbl kiderljn, hogy melyiket is talltuk meg. A [6]-os sorban nem szltam a -match-nek, hogy lelkileg kszljn fel a tbbsoros szvegek vizsglatra, gy a sztringvg karakter csak a szveg vgre illeszkedik, gy a tallatunk a sor2 lett. Ha szlok neki, hogy a szvegem tbb soros, akkor az els sor vge is tallatot ad. A szls a (?m) tbbsoros zemmd-kapcsolval trtnt. Nzznk egy pldt a nem nevestett csoportok eldobsra:
[10] PS I:\>"Eleje vge" -match "(?n)(\w+)\s(?<ketto>\w+)" True [11] PS I:\>$matches Name ---ketto 0 Value ----vge Eleje vge

132

Elmlet

[12] PS I:\>"Eleje vge" -match "(?-n)(\w+)\s(?<ketto>\w+)" True [13] PS I:\>$matches Name ---ketto 1 0 Value ----vge Eleje Eleje vge

A fenti pldban lthat, hogy amikor a [10]-es sorban bekapcsoltam az n kapcsolt, akkor kln csoportknt nem szerepel az els, nv nlkli csoport (de termszetesen a teljes tallat rszt kpezi), mg a kikapcsolt, alaphelyzet szerinti mkds mellett (12]es sor) az els, nevestetlen csoport is ltrejtt. Nzzk az egysoros kapcsolt. Kicsit zavar a tbbsoros, egysoros elnevezs, hiszen ezek egyms mellett is megfrnek, mert ms metakarakter mkdst szablyozzk. Szval nzznk egy pldt az egysoros zemmdra:
[14] PS C:\> $szveg="Eleje kzepe >> jsor vge" >> [15] PS C:\> $szveg -match "eleje.+vge" False [16] PS C:\> $szveg -match "(?s)eleje.+vge" True

A [14]-es sorban vizsglom, hogy illeszkedik-e a ktsoros szvegem olyan mintra, amely egy eleje karaktersorozattal kezddik, s egy vge karaktersorozattal vgzdik. Alapesetben nem kaptam tallatot, hiszen a .+ felakad a sor vgn. Mg ha kierltetem az egysoros rtelmezst, ahogy az a [16]-os sorban tettem, akkor a .+ keresztlgzol a sorvgkarakteren is s megkapom a tallatomat. Szkz mintaknt val alkalmazsa:
[17] PS C:\> "Valami ms" -match "(?x)i m"; $matches[0] False [18] PS C:\> "Valami ms" -match "(?-x)i m"; $matches[0] True i m

Ebben a pldban azt lthatjuk, hogy ha lustk vagyunk a szkz \s-knt val mintban val hivatkozshoz, akkor hasznlhatjuk az igazi szkz karaktert is, ha ezt az zemmdot bekapcsoljuk. Lehetsg szerint ennek hasznlatt azrt kerljk, mert sok regex vltozat nem ismeri ezt a lehetsget, meg a mintk olvashatsga sem biztos, hogy a legjobb lesz.

133

Opertorok

1.6.6.9 Tudjuk, hogy mi, de hnyszor?


Az eddigi pldkban azt tapasztaltuk, hogy a mintnkat az els tallatig keresi a -match s vltozatai. Mg a csoportok hasznlatval is csak akkor tudjuk megkeresni a tbbszrs tallatot, ha mi azt a mintt erre eleve felksztjk, mghozz meghatrozott darabszmmal. A PowerShell sajt kulcsszavaival nem is tudunk tbbszrs tallatot elcsiholni, de szerencsre mint ahogy mr tbbszr lttuk a .NET Framework ebben is segtsgnkre van:
[41] PS C:\> $minta = [regex] "\w+"

Itt most a [regex] tpusjellvel hozok ltre mintt. Nzzk meg ennek tagjellemzit:
[42] PS C:\> $minta | gm TypeName: System.Text.RegularExpressions.Regex Name ---Equals GetGroupNames GetGroupNumbers GetHashCode GetType get_Options get_RightToLeft GroupNameFromNumber GroupNumberFromName IsMatch Match Matches Replace Split ToString Options RightToLeft MemberType ---------Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Property Property Definition ---------System.Boolean Equals(Object obj) System.String[] GetGroupNames() System.Int32[] GetGroupNumbers() System.Int32 GetHashCode() System.Type GetType() System.Text.RegularExpressions.RegexOptio... System.Boolean get_RightToLeft() System.String GroupNameFromNumber(Int32 i) System.Int32 GroupNumberFromName(String n... System.Boolean IsMatch(String input), Sys... System.Text.RegularExpressions.Match Matc... System.Text.RegularExpressions.MatchColle... System.String Replace(String input, Strin... System.String[] Split(String input), Syst... System.String ToString() System.Text.RegularExpressions.RegexOptio... System.Boolean RightToLeft {get;}

A metdusokat nzve mindent tud, amit eddig lttunk, de van egy sokat gr Matches() metdusunk is, ami tbbes szmot sejtet (remljk nem egyes szm harmadik szemlyt! ):
[43] PS C:\> $eredmny = $minta.matches("Ez a szveg tbb szbl ll") [44] PS C:\> $eredmny Groups Success Captures Index : : : : {Ez} True {Ez} 0

134

Elmlet
Length Value Groups Success Captures Index Length Value Groups Success Captures Index Length Value Groups Success Captures Index Length Value Groups Success Captures Index Length Value Groups Success Captures Index Length Value : 2 : Ez : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : {a} True {a} 3 1 a {szveg} True {szveg} 5 6 szveg {tbb} True {tbb} 12 4 tbb {szbl} True {szbl} 17 6 szbl {ll} True {ll} 24 3 ll

Egszen rdekes s sokat sejtet eredmnyt kaptunk. Nzzk meg a get-member cmdlettel, hogy ez mi:
[45] PS C:\> Get-Member -InputObject $eredmny TypeName: System.Text.RegularExpressions.MatchCollection Name ---CopyTo Equals GetEnumerator GetHashCode GetType get_Count get_IsReadOnly get_IsSynchronized MemberType ---------Method Method Method Method Method Method Method Method Definition ---------System.Void CopyTo(Array array,... System.Boolean Equals(Object obj) System.Collections.IEnumerator ... System.Int32 GetHashCode() System.Type GetType() System.Int32 get_Count() System.Boolean get_IsReadOnly() System.Boolean get_IsSynchroniz...

135

Opertorok
get_Item get_SyncRoot ToString Item Count IsReadOnly IsSynchronized SyncRoot Method Method Method ParameterizedProperty Property Property Property Property System.Text.RegularExpressions.... System.Object get_SyncRoot() System.String ToString() System.Text.RegularExpressions.... System.Int32 Count {get;} System.Boolean IsReadOnly {get;} System.Boolean IsSynchronized {... System.Object SyncRoot {get;}

Ez pont az, amit szerettnk volna: egy tmb, ami tartalmazza az sszes tallatot! Hogyan lehet ezt az eredmnyt kezelni? Pldul egy ciklussal kirathatom az egyes tallati elemeket:
[46] PS C:\> foreach($elem in $eredmny){$elem.value} Ez a szveg tbb szbl ll

Megjegyzs: Vigyzzunk, hogy a *regex] tpusnak van egy match() metdusa is, de az szintn csak egy tallatod ad vissza, hasonlan a match opertorhoz. Ahogy a [43]-as sor kimenetben lttuk, a [regex] objektumok rendelkeznek replace() metdussal is, de van split() is, amellyel a minta tallati helyeinl lehet feltrdelni a szveget, amelyre alkalmazzuk. Nzznk erre egy gondolatbreszt pldt:
[49] PS C:\> $minta = [regex] '\W+' [50] PS C:\> $minta.split("Ebben {van}, minden-fle (elvlaszt) [jel]") Ebben van minden fle elvlaszt jel

Ebben a pldban feldaraboltam a szvegemet mindenfle szelvlaszt karakternl. Ugye ugyanezt az eredmnyt nem tudtam volna elrni a sztringek split() metdusval:
[51] PS C:\> ("Ebben {van}, minden-fle (elvlaszt) [jel]").split() Ebben {van}, minden-fle (elvlaszt) [jel]

136

Elmlet

1.6.6.10 Csere
Sok esetben azrt keresnk egy mintt, hogy az illeszked rszeket kicserljk valami msra. Ez a valami ms akr lehet egy tallati csoport is. Pldul cserljk ellenkez sorrendre egy IP cmben szerepl szmokat:
[64] PS C:\> "Ezt kellene megfordtani: 192.168.1.2 reverse znhoz" -replac e "(\d{1,3})\.(\d{1,3})\.(\d{1,3}).(\d{1,3})", '$4.$3.$2.$1' Ezt kellene megfordtani: 2.1.168.192 reverse znhoz

Fontos! A replace opertornl a minta s a csereszably kztt vessz van s a csereszably nem macskakrmk, hanem aposztrfok kztt kell hogy lljon, egybknt a csoporthivatkozsokat ($1, $2,...) a PowerShell vltozknt rtkeln, holott ezek nem vltozk, hanem a [regex] formai elemei! Ltjuk, hogy itt a mintacsoportok rsztallataira $1, $2,... formban tudunk hivatkozni, az indexek nem nulltl indulnak, hanem 1-tl. A replace-en kvl nem lehet hozzfrni a $1 s a tbbi vltozhoz, s a replace ltal vgrehajtott illeszkedsvizsglat eredmnye sem olvashat ki, nem keletkezik $matches vltoz sem. A replace szerencsre mr alaphelyzetben a mintnak megfelel sszes szvegrszt kicserli:
[65] PS C:\> "Szkz kicsrlse alhzsra" -replace "\s", '_' Szkz_kicsrlse_alhzsra

Azonban ez nem rekurzv, azaz ha a csere utn is marad cserlni val, akkor arra neknk kell jra meghvni a replace-t:
[66] PS C:\> "Felesleges szkzk Felesleges szkzk eltvoltsa eltvoltsa" -replace "\s\s", ' '

A fenti pldban ltszik, hogy a sok egyms melletti szkzt szeretnm egyre cserlni azltal, hogy kettbl csinlok egyet. A fenti mdszerrel ez nem mkdik, hiszen csak egyszer szalad vgig, a megoldsban mg bven marad tbb egyms melletti szkz. Erre egy jobb minta alkalmazsa a megolds:
[67] PS C:\> "Felesleges szkzk Felesleges szkzk eltvoltsa eltvoltsa" -replace "\s{2,}", ' '

Mint ahogy a match-nek is, a replace-nek is van kis-nagybet rzkeny vltozata, a creplace:
[11] PS C:\> "Csak a nagy 'A'-t cserlem" -creplace "A", 'a' Csak a nagy 'a'-t cserlem

137

Opertorok

1.6.7 Logikai s bitszint opertorok


Logikai opertorok segtsgvel (-and, -or, -xor) ssze tudunk fzni tbb logikai kifejezst, s a szoksos igazsg tblk alapjn kapjuk meg az sszetett kifejezsnk igaz vagy hamis rtkt:
[25] PS True [26] PS True [27] PS False [28] PS False I:\>$false -eq $false -and $true -eq $true I:\>"ablak" -ne "ajt" -or 5 -eq 6 I:\>1 -eq 1 -xor 2 -gt 1 I:\>-not $true

A [28]-ban lthat, hogy az egytag not opertor neglja az eredmnyt. Knyelmi szolgltatsknt nem kell $true vagy $false-ra reduklni a logikai opertorok operandusait, a trivilis lekpezseket elvgzi helyettnk a PowerShell. ltalban minden 0-tl, $null-tl, vagy res kifejezstl eltr rtkeket $true-nak kezel:
[29] PS True [30] PS True [31] PS False [32] PS False [33] PS False I:\>7 -and $true I:\>"valami" -and $true I:\>$null -and $true I:\>"" -and $true I:\>0 -and $true

Megjegyzs Az and, -or hasznlatakor vigyzni kell, mert nem rtkeldik ki a jobboldaluk, ha mr a baloldal alapjn el tudja dnteni a vgeredmnyt:
[35] PS False [36] PS [37] PS False [38] PS 25 [39] PS True [40] PS [41] PS True [42] PS valami I:\>$false -and ($a=25) I:\>$a I:\>($a=25) -and $false I:\>$a I:\>$true -or ($b="valami") I:\>$b I:\>($b="valami") -or $true I:\>$b

138

Elmlet
Teht nem rdemes egyb mveleteket vgeztetni a logikai opertorok operandusaiban, mert ha nem kell figyelemmel vlasztjuk ki az oldalakat, akkor esetleg nem gy mkdik a programunk, ahogy vrtuk. A fenti logikai opertorok teht vagy $false, vagy $true rtket adnak vissza. Ha igazi bit szint logikai mveleteket akarunk elvgezni, akkor ehhez kln logikai opertorok vannak: -band, -bor, -bxor, -bnot:
[44] 127 [45] 141 [46] 136 [47] 21 [48] -256 [49] -2 PS I:\>126 -bor 1 PS I:\>(128+8+4+1) -bor 132 PS I:\>(128+8+4+1) -band (128+16+8) PS I:\>(128+8+4+1) -bxor (128+16+8) PS I:\>-bnot 255 PS I:\>-bnot 1

Itt termszetesen mindig kirtkeldik a mvelet mindkt oldala.

1.6.8 Tpusvizsglat, tpuskonverzi (-is, -as)


Az 1.5.7 Tpuskonverzi fejezetben variltam a tpusokkal. Ebbe a tmakrbe tartozik a tpusok vizsglata is. Ha nem lekrni akarjuk egy objektum tpust, hanem rkrdezni, hogy valami valamilyen tpus-e, akkor az is opertort lehet hasznlni:
[52] PS True [53] PS True [54] PS False [55] PS False [56] PS True [57] PS False [58] PS False [59] PS True I:\>"szveg" -is [string] I:\>"szveg" -is [object] I:\>"szveg" -is [array] I:\>1 -is [double] I:\>1.1 -is [double] I:\>1.1 -is [float] I:\>$true -is [int] I:\>$true -is [bool]

Minden dolog a PowerShellben objektum, gy akr a szveg, vagy a szm is, de akr a tpusjell is objektum:
[64] PS I:\>[string] -is [object]

139

Opertorok
True

s egy majdnem rk igazsg:


[70] PS I:\>$a -is $a.GetType() True

A mr korbban ltott tpuskonverzis szintaxis mellett hasznlhatunk direkt tpuskonvertl opertort is, ami az -as:
[73] PS I:\>"01234" -as [int] 1234 [74] PS I:\>1.1234 -as [int] 1 [76] PS I:\>1.1234 -as [double] 1,1234 [77] PS I:\>112345678 -as [float] 1,123457E+08 [78] PS I:\>112345678 -as [double] 112345678 [79] PS I:\>"szveg" -as [int] [80] PS I:\>

A [79]-es sornl ltszik, hogy mi a klnbsg a korbbi tpuskonverzis szintaxis s az as opertor hasznlata kztt: ez utbbinl, ha nem tudja vgrehajtani a mveletet, akkor nem ad hibajelzst, hanem $null rtket ad vissza.

1.6.9 Egytag opertorok (+, -, ++, --, [tpus])


A + jel, ha csak mgtte van objektum, egyszeren szmm konvertl opertorknt is felfoghat, a jel ugyancsak szmm konvertl, de mg negl is:
[81] PS I:\>-"01234" -1234 [82] PS I:\>+"0123" 123

A duplzott ++ s jel meg inkrementlst s dekrementlst vgez, csakhogy kt lehetsgnk is van ezek elhelyezsre:
[88] [89] [90] 10 [91] 11 [92] PS I:\>$a = 10 PS I:\>$b = $a++ PS I:\>$b PS I:\>$a PS I:\>$c = 10

kivve az $a=$null esetet

140

Elmlet
[93] PS I:\>$d = --$c [94] PS I:\>$d 9 [95] PS I:\>$c 9

A [89]-es sorban elbb kapja meg $b az $a rtkt ahhoz kpest, hogy $a-t megnveltem, a [93]-ban pedig elbb cskkentettem $c-t, s mr ezt a cskkentett rtket vette t a $d. Az 1.5.7 Tpuskonverzi fejezetben mr lthattuk, hogy a [tpusnv] is egy egytag opertor, ez a tpuskonverzis opertor.

1.6.10 Csoportost opertorok


Sokfajta zrjelet hasznl a PowerShell, szedjk ezeket ssze most ide egy helyre.

1.6.10.1 Gmbly zrjel: ()


Elsknt nzzk a gmbly zrjelet: Zrjel () Hasznlat, magyarzat Egyszer kifejezsek szeparlsa. Egy csvezetk sszetorlasztsa, egy egysgknt kezelse. Elfojtott visszatrsi rtk kifejezsek visszatrsi rtknek megjelenttetse

Pldk:
[1] PS C:\>(1+2)*4 12 [2] PS C:\>(Get-Location).Drive Name ---C Provider -------FileSystem Root ---C:\ CurrentLocatio n --------------

[3] PS C:\>(get-childitem).count 42 [4] PS C:\>(1,2,3,-5,4,-6,0,-11 | where-object {$_ -lt 0}).count 3

Az [1]-es sor egyrtelm, meghatrozom, hogy mely mveletet vgezze elbb. A *2+es sorban elbb kell elvgeztetni a Get-Location parancsot, hogy az kimenetnek megnzhessem a Drive tulajdonsgt. A [3]-as sorban a Get-ChildItem cmdlettel elbb ltre kell hozni azt a gyjtemnyt, aminek aztn megnzhetjk a szmossgt. A

141

Opertorok
[4]-es sorban lthat, hogy a zrjelek kztt a csvezetkkel mindenfle mveletet is vgezhetnk, pldul beirnytani egy kvetkez cmdletbe. Van mg egy rdekes jelensg a PowerShellben, nzznk egy egyszer rtkadst:
[21] PS I:\>$a = 1111 [22] PS I:\>

Nem ad semmilyen visszatrsi rtket. A PowerShell alkoti gy vltk, hogy ez a gyakoribb igny, azaz nem akarjuk viszontltni az ppen most tadott rtket. Ezek az u.n. voidable kifejezsek, amelyek esetben el lehet rejteni a visszatrsi rtket. Ettl fggetlenl, ha akarjuk, akkor meg lehet jelenttetni a visszatrsi rtket:
[28] PS I:\>($a = 1111) 1111

1.6.10.2 Dollros gmbly zrjel: $()


Nzzk a kvetkez csoportostsi lehetsget! Zrjel $() Pldk:
[3] PS I:\>($a ="ab"; $b="lak"; $a+$b).length Missing closing ')' in expression. At line:1 char:10 + ($a ="ab"; <<<< $b="lak"; $a+$b).length

Hasznlat, magyarzat Tbb kifejezs szeparlsa. Idzjelek kzti kifejezs kifejtse.

Ha a sima zrjelbe tbb kifejezst akarnnk berni, akkor hibt kapunk, mint ahogy a [3]-as sor utn lthat. Ha ezt nem szeretnnk, akkor a $() vltozatot kell hasznlni:
[4] PS I:\>$($a ="ab"; $b="lak"; $a+$b).length 5

Megjegyzs: Itt, a [4]-es sorban egybknt pont jl jn neknk az, hogy az rtkads nem ad alaphelyzetben kimenetet, hiszen gy csak az $a+$b-re vonatkozan kapjuk meg a hosszt, ami pont kell neknk. Knyszertsk pldul az els rtkadst arra, hogy legyen kimenete:
[30] PS I:\>$(($a ="ab"); $b="lak"; $a+$b).length 2

142

Elmlet
Itt 2-t kaptunk kimenet gyannt, merthogy ez mr egy ktelem tmb, nem pedig egy valamekkora hosszsg sztring. Mr korbban is tapasztaltuk ennek a specilis zrjelezsnek a jtkony hatst az idzjeleknl:
[6] PS I:\>$g = "szveg" [7] PS I:\>"Ez a `$g hossza: ($g.length)" Ez a $g hossza: (szveg.length) [8] PS I:\>"Ez a `$g hossza: $($g.length)" Ez a $g hossza: 6

Ugye itt a [7]-ben nem tettem $ jelet, csak sima zrjelprt, az idzjel miatt csak a $g fejtdtt ki, ezzel szemben a *8+-ban az egsz kifejezs kirtkeldtt.

1.6.10.3 Kukacos gmbly zrjel: @()


Zrjel @() Hasznlat, magyarzat Tmbkimenetet garantl.

A harmadik zrjelezs tpus azt biztostja, hogy mindenkppen tmb legyen a zrjelek kzti mvelet eredmnye, ha csak egy elem amgy a kimenet, akkor ezzel egy egyelem tmbt fogunk kapni. Mirt j ez? Nzznk erre egy pldt:
[32] [33] 3 [34] [35] 2 [36] [37] 3 PS I:\>$tmb = "egy", "kett", "hrom" PS I:\>$tmb.length PS I:\>$tmb = "egy", "kett" PS I:\>$tmb.length PS I:\>$tmb = "egy" PS I:\>$tmb.length

Van egy $tmb vltoznk, amely vltoz szm elemet tartalmaz. Szksgnk van az elemszmra valamilyen mvelet elvgzshez, ezrt lekrjk a Length tulajdonsgt. A [33]-ban s a *35+-ben j eredmnyt kapunk, a *37+-ben, amikor mr csak egyelem a tmbm, akkor vratlanul nem 1-et, hanem 3-at kapok! Vajon mirt? Mert ekkor hirtelen a $tmb-m mr nem is tmb, hanem mr egy egyszer sztring. Mivel ennek is van Length tulajdonsga, ezrt nem kapunk hibt, viszont mr ms az egsznek a jelentse. Ha nem akarunk ilyen jelleg hibt, akkor rknyszerthetjk a kifejezsnket arra, hogy mindenkppen tmbt adjon vissza:
[38] [39] 3 [40] [41] 2 PS I:\>$tmb = "egy", "kett", "hrom" PS I:\>@($tmb).length PS I:\>$tmb = "egy", "kett" PS I:\>@($tmb).length

143

Opertorok
[42] PS I:\>$tmb = "egy" [43] PS I:\>@($tmb).length 1

gy mr teljesen konzisztens a megoldsunk.

1.6.10.4 Kapcsos zrjel: {} (bajusz)


A kvetkez zrjeltpus a kapcsos zrjel (vagy bajusz): Zrjel {} Hasznlat, magyarzat Szkriptblokk

Ezzel kapcsolatosan lesz egy kln fejezet, de elljrban annyit, hogy kdrszleteket tudunk ezzel csoportostani, illetve tnylegesen kdknt kezelni:
[46] PS C:\scripts> $script = {$dtum = get-date; $dtum} [47] PS C:\scripts> $script $dtum = get-date; $dtum [48] PS C:\scripts> $script | Get-Member TypeName: System.Management.Automation.ScriptBlock Name ---Equals GetHashCode GetType get_IsFilter Invoke InvokeReturnAsIs set_IsFilter ToString IsFilter MemberType ---------Method Method Method Method Method Method Method Method Property Definition ---------System.Boolean Equals(Object obj) System.Int32 GetHashCode() System.Type GetType() System.Boolean get_IsFilter() System.Collections.ObjectModel.Collection`1[... System.Object InvokeReturnAsIs(Params Object... System.Void set_IsFilter(Boolean value) System.String ToString() System.Boolean IsFilter {get;set;}

[49] PS C:\scripts> $script.invoke() 2008. prilis 22. 23:33:35

A [46]-ban gy nz ki, mintha a $()-t hasznltuk volna, de a *47+-ben kiderlt, hogy mgsem ugyanaz a helyzet, hiszen a $script-vltoznk nem a zrjeles kifejezs rtkt kapta meg, hanem magt a kifejezst. De mgsem sztringgel van dolgunk, hiszen a Get-Member-rel nem a sztringekre jellemz tagjellemzket kapjuk meg, hanem a tpusnl is ltjuk, hogy ez egy ScriptBlock. Ennek f jellemzje, hogy van neki egy invoke metdusa, amellyel vgre is lehet hajtatni, mint ahogy a *49+-ben ltjuk.

144

Elmlet

1.6.10.5 Szgletes zrjel: []


Az utols zrjeltpus ugyan nem csoportost, de ha mr itt vannak a zrjelek, akkor tegyk ezt is ide: Zrjel [] Pldk:
[5] 3 [6] 1 [7] 11 [8] PS I:\>(1,2,3,4,5)[2] PS I:\>(1,2,3,4,5)[0] PS I:\>[int] "00011" PS I:\>[datetime]::now

Hasznlat, magyarzat Tmbindex Tpusopertor

2008. mrcius 14. 10:28:39

Az [5]-s s *6+-os sorokban tmbindex szerepben ltjuk a szgletes zrjelet, a *7+-es s *8+-as sorban tpusjellshez hasznltam.

1.6.11 Tmbopertor: ,
Az elz rszben volt sz a @() csoportost opertorrl, amit klnsen akkor tudunk kihasznlni, ha az egyelem tmbket is tmbknt akarjuk kezelni. Erre a clra egy msik opertort, a tmbopertort (,) is felhasznlhatjuk:
[11] PS I:\>(,"szveg").GetType().Fullname System.Object[] [12] PS I:\>(,1).GetType().Fullname System.Object[] [13] PS I:\>(@(1)).GetType().Fullname System.Object[] [14] PS I:\>(,(1,2,3,4)).count 1 [15] PS I:\>(@(1,2,3,4)).count 4

A [12]-es s *13+-as sorokban ltszik, hogy egyelem tmbk esetben teljesen ugyangy mkdik a ktfajta opertor. Azonban, ha mr tbbelem tmbt kezelnk, akkor nagy klnbsget lthatunk. A tmbopertor (,) hasznlatval egy egyelem tmbt kapunk a *14+-es sorban, ahol ez az egy elem egy tmb. A *15+-s sorban pedig visszakapjuk az eredeti tmbnket.

145

Opertorok

1.6.12 Tartomny-opertor: ..
Viszonylag gyakran kell szmsorozatokkal dolgoznunk. Ennek megknnytsre van egy nagyon praktikus opertor:
[17] PS I:\>1..5 1 2 3 4 5 [18] PS I:\>$a=3 [19] PS I:\>1..$a 1 2 3

A [19]-es sorban lthat, hogy nem csak statikus lehet egy ilyen tartomny vge, hanem vltozk is lehetnek benne, gy mg szlesebb kr a felhasznlhatsga:
[20] PS I:\>$s = "htf", "kedd", "szerda", "cstrtk", "pntek", "szombat", "vasrnap" [21] PS I:\>$n1 = 2 [22] PS I:\>$n2 = 4 [23] PS I:\>$s[$n1..$n2] szerda cstrtk pntek

A fenti pldban pldul tmbk indexelsre hasznltam. Vagy lehet fordtott sorrendet is krni, illetve negatv tartomnyba is lehet menni:
[26] PS I:\>3..-2 3 2 1 0 -1 -2

Ez az opertor csak egsz szmokkal mkdik. Ha valami egyebet (trt szm, sztring formtumban szm) adunk be, akkor a PowerShell automatikusan egssz konvertlja.

1.6.13 Tulajdonsg, metdus s statikus metdus opertora: .


Ilyet is mr mutattam sokszor, a pontrl (.)-rl s a kettspontrl (::)-rl van sz:
[42] PS I:\>[string]::compareordinal("ac", "ab") 1

146

Elmlet
[43] PS I:\>$a = new-object random [44] PS I:\>$a.Next() 1418203324 [45] PS I:\>(get-date).Year 2008

A [42]-ben statikus metdusra hivatkoztam a (::)-tal, [44]-ben metdusra, *45+-ben tulajdonsgra hivatkoztam a (.) segtsgvel.

1.6.14 Vgrehajts
gy ltszik, szksen llunk rsjelekkel, mert a (.)-nak van egy msik jelentse. Amikor egytag opertorknt hasznljuk, akkor vgrehajtsi opertor a funkcija, azaz az operandust vgrehajtand kdknt tekinti s vgrehajtja azt:
[55] PS I:\>$a= {get-date} [56] PS I:\>.$a 2008. mrcius 14. 14:11:14 [57] PS C:\> $a= "get-date" [58] PS C:\> .$a 2008. mrcius 14. 14:12:21

A (.)-hoz hasonlan az (&) jel is vgrehajt:


[59] PS C:\scripts> &$a 2008. mrcius 14. 14:13:51

Termszetesen a (.) s a (&), mint vgrehajtsi opertor paramterknt valamilyen futtathat objektumot vrnak: cmdletet, fggvnyt, szkriptet vagy szkriptblokkot. Akrmilyen, szmunkra futtathatnak tn sztring nem j nekik:
[60] PS I:\>$a = "(1+2)" [61] PS I:\>.$a The term '(1+2)' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again. At line:1 char:2 + .$ <<<< a

Ha mgis ilyen sztringet akarunk vgrehajtatni, akkor van szerencsre erre egy PowerShell cmdletnk, az Invoke-Expression:
[62] PS I:\>Invoke-Expression "1+2" 3

147

Opertorok

1.6.15 Formz opertor


Lttuk az 1.4.16 Kimenet (Output) fejezetben, hogy a write-host cmdlet alkalmas arra, hogy sznesen rjunk a kpernyre, de hogyan lehet mondjuk egy szp tblzatot kiratni? Az albbi kis szkriptben felhasznlva a korbban mr bemutatott tartomnyopertort azt szeretnm, hogy a szmokat rja ki a PowerShell a nevkkel egytt szp, tblzatszer mdon. A *24+-es promptban ksztek egy tmbt, ami tartalmazza a szmokat egytl tzig, a *26+-os promptban pedig a korbban bemutatott tartomnyopertor segtsgvel kirom a szmokat s a nevket.
[24] PS C:\> $tomb= "egy", "ketto", "harom", "negy", "ot", "hat", "ht", "nyolc", "kilenc", "tz" [25] PS C:\> $tomb egy ketto harom negy ot hat ht nyolc kilenc tz [26] PS I:\>0..9 | foreach-object {($_+1), $tomb[$_]} 1 egy 2 ketto 3 harom 4 negy 5 ot 6 hat 7 ht 8 nyolc 9 kilenc 10 tz

Ltjuk, hogy ez nem tl szp kimenet, hiszen egyms alatt vannak a szmok s neveik, j lenne, ha ezek egyms mellett lennnek. Ugyan hasznlhatnnk a write-host cmdletet a -nonewline kapcsolval, vagy az $OFS vltozt, de ennl van egyszerbb megolds: a -f formz opertor:

148

Elmlet
[27] PS I:\>0..9 | foreach-object {'{0} {1}' -f ($_+1), $tomb[$_]} 1 egy 2 ketto 3 harom 4 negy 5 ot 6 hat 7 ht 8 nyolc 9 kilenc 10 tz

Ennek a mkdse a kvetkez: A f eltt kell a formtumot ler sztringet berni, a f utn meg a formzand kifejezst. Mivel ez utbbibl tbb is lehet (a pldmban a ($_+1) s a $tomb[$_]), ezrt a formz sztringben is mindkt elemre hivatkozni kell. A hivatkozs formja pedig ,0- az els formzand kifejezst szimbolizlja, a ,1- a msodikat s gy tovbb. De nem csak egyszeren hivatkozhatunk a formzand kifejezsekre, hanem sokkal bonyolultabb mveleteket is vgezhetnk velk:
[1] PS C:\> "Szveg ell {0,-15} s nem htul" -f "itt van" Szveg ell itt van s nem htul [2] PS C:\> "Szveg nem ell {0,15} hanem htul" -f "van" Szveg nem ell van hanem htul [3] PS C:\> "Ez most az ra: {0:hh}" -f (get-date) Ez most az ra: 10 [4] PS C:\> "Ez most a forint: {0:c}" -f 11 Ez most a forint: 11,00 Ft [5] PS C:\> "Ez most a szp szm: {0:n}" -f 1234568.9 Ez most a szp szm: 1 234 568,90 [6] PS C:\> "Ez most a szzalk: {0:p}" -f 0.561 Ez most a szzalk: 56,10 % [7] PS C:\> "Ez most a hexa szm: {0:x}" -f 3000 Ez most a hexa szm: bb8 [8] PS C:\> "Ez most a 8 szmjegy hexa szm: {0:x8}" -f 3000 Ez most a 8 szmjegy hexa szm: 00000bb8 [9] PS C:\> "Ez most a forint, fillr nlkl: {0:c0}" -f 11 Ez most a forint, fillr nlkl: 11 Ft [10] PS C:\> "Ez most rvid dtum: {0:yyyy. M. d}" -f (get-date) Ez most rvid dtum: 2008. 4. 18 [11] PS C:\> "Ez most hossz dtum: {0:f}" -f (get-date) Ez most hossz dtum: 2008. prilis 18. 23:10

Aztn szmokkal lehet akrmilyen mintzatot is kirakni:

149

Opertorok
[22] PS C:\> "Ez most a telefonszm: {0:(##) ###-####}" -f 303116867 Ez most a telefonszm: (30) 311-6867

Megjegyzs: A legtbb formzsi mvelet elvgezhet a ToString metdussal (ami nagyon sok tpusnl megtallhat):
[23] PS C:\> (303116867).ToString("(##) ###-####") (30) 311-6867

Fontos hangslyozni, hogy ezeknek a formzsi mveleteknek a kimenete mindig sztring, azaz a formzs utn elvesztik az eredeti tulajdonsgaikat. Azaz csak egy mveletsor legvgn rdemes formzni, amikor mr csak a megjelents van htra, egyb feldolgozsi mveleteken mr tljutottunk. Amgy mg sokkal tbb formzsi lehetsg van, javaslom az MSDN honlapjn utnanzni. Visszatrve a szmok s neveik kirshoz, mg szebben rendezve:
[24] PS C:\> 0..9 | foreach-object {'{1,-6} : {0,2}' -f ($_+1), $tomb[$_]} egy : 1 ketto : 2 harom : 3 negy : 4 ot : 5 hat : 6 ht : 7 nyolc : 8 kilenc : 9 tz : 10

Ugye ez mr ezek utn rthet, elre vettem a tmbelemet, hat karakter szlessgben, balra igaztva, utna a tmbindexet, kt karakter szlessgben, jobbra igaztva. Megjegyzs Vgezetl egy meglep kifejezs:
[26] PS I:\>Get-Date -f MMddyyHHmmss 052708131411

Vigyzat! Ez nem formtum opertor, hanem a get-date-nek a format paramtere rvidtve! Ennek hasznlatrl bvebben a http://msdn.microsoft.com/enus/library/system.globalization.datetimeformatinfo.aspx oldalon lehet olvasni.

1.6.16 tirnyts: >, >>


Az utols opertorhoz rkeztnk, ez pedig a kimenet tirnytsa a (>) s a (>>) jelekkel. Nzznk erre pldt az elz fejezet tzelem tmbjnek felhasznlsval:

150

Elmlet
[41] PS C:\> 0..3 | foreach-object {'{1,-6} : {0,2}' -f ($_+1), $tomb[$_]} > c:\szamok.txt [42] PS C:\> Get-Content C:\szamok.txt egy : 1 ketto : 2 harom : 3 negy : 4 [43] PS C:\> "mg egy sor" >> C:\szamok.txt [44] PS C:\> Get-Content C:\szamok.txt egy : 1 ketto : 2 harom : 3 negy : 4 mg egy sor

A [41]-es sorban tirnytottam a kimenetet egy szveges fjlba. A szimpla (>) jel j fjlt kezd. A fjl tartalmnak kirshoz a get-content cmdletet hasznltam. A [43]-as sor dupla (>>) jelvel hozzfztem egy jabb sort a fjlhoz.
[45] PS C:\> "j sor" > C:\szamok.txt [46] PS C:\> Get-Content C:\szamok.txt j sor

A [45]-s sorban, mivel megint szimpla (>) jelet hasznltam, ezrt elveszettem a fjl addigi tartalmt.

151

Vezrl utastsok

1.7 Vezrl utastsok


Br az eddigi pldkban s a csvezetk jelleg feldolgozs miatt sokszor bonyolultabb esetben sincs szksg a feldolgozsi sorrend megvltoztatsra, termszetesen egy komoly programnyelv nem nlklzheti a vezrl utastsokat sem.

1.7.1 IF/ELSEIF/ELSE
Az IF-ELSEIF-ELSE elgazs az egyik legegyszerbb lehetsg. Be lehet rni akr egysoros kifejezsekbe is, de akkor a kicsit nehezen rtelmezhet. Viszont szkriptekben praktikusan hasznlhat:
[47] PS C:\> $a = 25 [48] PS C:\> if($a -gt 10) >> { "nagyobb, mint 10" } >> elseif($a -lt 10) >> { "kisebb, mint 10" } >> else >> { "pont 10" } >> nagyobb, mint 10

Termszetesen nem ktelez az IF mellett ELSEIF s ELSE hasznlata, brmelyik, akr mindkett is elhagyhat.

1.7.2 WHILE, DO-WHILE


A WHILE segtsgvel ciklust szervezhetnk. Ktfajta vltozata is van, a WHILE ell tesztel s a DO-WHILE a htul tesztel. A htul tesztel mindenkppen lefut egyszer, az ell tesztel akr a belsejnek lefuttatsa nlkl is tovbblphet, ha az alkalmazott felttel rgtn hamis. Nzznk pr pldt:
[13] PS C:\> $i = 3 [14] PS C:\> while($i -lt 6) >> { >> "*" * $i >> $i++ >> } >> *** **** *****

Amg az $i kisebb, mint 6, addig $i darabszm csillagot rok ki, s nvelem az $i-t. A ciklus 5 csillagnl lp ki, mivel a 6.-nl mr nem igaz az, hogy kisebb, mint 5. s egy htul tesztel:

152

Elmlet
[16] PS C:\> $a=4 [17] PS C:\> do >> { >> $a++ >> $a >> } >> while ($a -lt 6) >> 5 6

Itt meg a ciklus 6-nl lpett ki, hiszen a felttel nem teljeslst csak akkor vette szre, amikor mr a ciklus magja lefutott.

1.7.3 FOR
Miutn az elz ciklusokban is lttuk, hogy viszonylag gyakori szerkezet az, hogy a ciklus elejn van egy rtkads (inicializls), aztn van a felttel, aztn van egy rtkvltoztats rsze, gy erre van egy tmrebb forma is, a FOR ciklus:
[18] PS C:\> for($a=0; $a -lt 3; $a++) >> { >> [char] (65+$a) >> } >> A B C

Az 1.6.10 Csoportost opertorok fejezetben ismertetett mdon a $() felhasznlsval egyszerre tbb kifejezst is tehetnk a FOR ciklus klnbz tevkenysget vgz pozciiba:
[24] PS C:\> for($($i=1; $j=10); $i -lt 4; $($i++; $j--)){"{0,2} {1,2}" -f $i, $j} 1 10 2 9 3 8

1.7.4 FOREACH
Mivel a PowerShellben nagyon sokszor gyjtemnyekkel (collection) dolgozunk, gy az alkotk praktikusnak talltk ezek elemein trtn mveletvgzst megknnyt ciklust is kszteni. Ksznet ezrt nekik! A FOREACH kulcssz segtsgvel olyan ciklust tudunk ltrehozni, ahol nem neknk kell nyilvntartani, szmllni s lptetni a ciklusvltozt, hanem a PowerShell ezt megteszi helyettnk:

153

Vezrl utastsok
[25] PS C:\> $egyveleg = 1,"szveg",(get-date),@{egy=2} [26] PS C:\> foreach($elem in $egyveleg){$elem.gettype()} IsPublic -------True True True True IsSerial -------True True True True Name ---Int32 String DateTime Hashtable BaseType -------System.ValueType System.Object System.ValueType System.Object

Ltszik a ciklus mkdsi elve: az $elem vltozba a PowerShell mindig betlti az aktulis tmbelemet az $egyveleg tmbbl egszen addig, amg van elem, s minden elem mellett a sor vgn lthat szkriptblokkot vgrehajtja. Ugyanezt FOR ciklussal is meg tudnnk csinlni, de mennyivel tbbet kell gpelni, s eggyel tbb vltozra is szksgnk van, plusz mg az olvashatsga is sokkal nehzkesebb:
[27] PS C:\> $egyveleg = 1,"szveg",(get-date),@{egy=2} [28] PS C:\> for($i=0;$i -lt $egyveleg.length;$i++){$egyveleg[$i].GetType()} ...

Lthattunk a 1.5.3.1 Egyszer tmbk fejezetben, hogy a PowerShell kpes automatikusan kifejteni a tmbket (gyjtemnyeket) pldul a get-member cmdletbe val becsvezskor. A FOREACH ennek ellenkezjt vgzi, azaz egy skalris (nem tmb) paramterbl kpes automatikusan egyelem tmbt kszteni, ha erre van szksg:
[29] PS I:\>$skalr = 1 [30] PS I:\>foreach($szm in $skalr){"Ez egy szm: $szm"} Ez egy szm: 1

A fenti pldban nem okozott a PowerShellnek problmt foreach ciklust futtatni egy nem tmb tpus vltozra, automatikusan egy elem tmbknt kezelte.

1.7.4.1 $foreach vltoz


A foreach ciklus belsejben a PowerShell automatikusan ltrehoz egy $foreach vltozt, aminek a $foreach.current tulajdonsga az ppen aktulis elemet tartalmazza, gy akr a *26+-os sorban lev pldt msknt is rhatnnk:
[53] PS C:\> foreach($elem in $egyveleg) {$foreach.current.gettype()} IsPublic -------True True True True IsSerial -------True True True True Name ---Int32 String DateTime Hashtable BaseType -------System.ValueType System.Object System.ValueType System.Object

Nzzk meg, hogy ennek a $foreach vltoznak milyen tagjellemzi vannak:

154

Elmlet
[50] PS C:\> foreach($elem in "a"){,$foreach | get-member} TypeName: System.Array+SZArrayEnumerator Name ---Clone Equals GetHashCode GetType get_Current MoveNext Reset ToString Current MemberType ---------Method Method Method Method Method Method Method Method Property Definition ---------System.Object Clone() System.Boolean Equals(Object obj) System.Int32 GetHashCode() System.Type GetType() System.Object get_Current() System.Boolean MoveNext() System.Void Reset() System.String ToString() System.Object Current {get;}

Az igazn izgalmas szmunkra a MoveNext() metdus, amellyel arra ksztethetjk a foreach ciklust, hogy egy elemet kihagyjon:
[54] PS C:\> $tmb = 1,2,3,4,5,6,7 [55] PS C:\> foreach($elem in $tmb){$elem; $foreach.MoveNext()} 1 True 3 True 5 True 7 False

A fenti pldban miutn minden elemnl rgtn mg egy elemet lptettnk, ezrt csak minden msodik szmot rtam ki. Ugyan a MoveNext() ad visszatrsi $true vagy $false rtket attl fggen, hogy van-e mg elem vagy nincs, de ezt elnyomhatjuk a [void] tpuskonverzival:
[56] PS C:\> foreach($elem in $tmb){$elem; [void] $foreach.MoveNext()} 1 3 5 7

A $foreach vltoz msik fontos metdusa a Reset(), ezzel vissza lehet ugrani a ciklus els elemre:
[60] PS C:\> $msodik = $false [61] PS C:\> foreach($elem in $tmb){$elem; if(-not ($msodik -or $foreach.MoveNext())){$foreach.Reset(); $msodik = $true}} 1 3 5 7 1

155

Vezrl utastsok
2 3 4 5 6 7

A fenti pldban egy ciklussal ktszer is vgigjrom a $tmb tagjait, els menetben minden msodikat rom ki, a msodik menetben pedig az sszes tagot. Itt is jl jtt, hogy az or felttel msodik operandusa csak akkor kerl kirtkelsre, ha az els tag $false, ezzel rtem el, hogy a msodik menetben mr ne legyen vgrehajtva a MoveNext().

1.7.5 ForEach-Object cmdlet


Az elzekben bemutatott FOREACH egy PowerShell kulcssz ciklus ltrehozsra. Azonban ltezik egy msik FOREACH is, ami a Foreach-Object cmdlet lneve:
[25] PS C:\> get-alias foreach CommandType ----------Alias Name ---foreach Definition ---------ForEach-Object

Honnan tudja a PowerShell hogy egy parancssorban most melyiket is akarom hasznlni: a kulcsszt vagy az cmdletet? Nagyon egyszeren: ha a foreach utn egy zrjel ( van, akkor kulcsszval van dolga, ha { bajusz, akkor alias. Msrszt a kulcsszavak mindig a kifejezsek elejn kell lljanak. A kifejezsek eleje vagy a parancssor eleje, vagy pontosvessz (;), vagy nyit zrjel (. A csjel (|) nem szmt kifejezs elejnek. Mire lehet hasznlni ezt a foreach-object cmdletet? Mg a foreach kulcssz tmbje, amin vgigmegy, rendelkezsre kell lljon teljes egszben kszen, mire a vezrls raddik, addig a ForEach-Object cmdlet csvezetkbl rkez elemeket dolgoz fel, azaz ha mr egy bemeneti elem elkszlt, akkor azt mr t is veszi s elvgzi a kijellt mveletet:
[1] PS C:\> 1,2,3 | ForEach-Object {$_ * 3} 3 6 9

A fenti pldban nem a $foreach vltozn keresztl rtem el az aktulis elemet, hanem a szoksos $_ vltozn.

156

Elmlet

Megjegyzs: Van egy rdekessge ennek a cmdletnek. Figyeljk meg a help-ben a szintaxist:
[2] PS C:\> get-help foreach-object NAME ForEach-Object SYNOPSIS Performs an operation against each of a set of input objects. SYNTAX ForEach-Object [-process] <ScriptBlock[]> [-inputObject <psobject>] [-b egin <scriptblock>] [-end <scriptblock>] [<CommonParameters>] ...

Hopp! Nem is egy, hanem hrom szkriptblokkot lehet tadni neki paramterknt, kicsit hasonlan, mint ahogy a FOR ciklusnl is hrom rsz vezrli a ciklust. Itt a hrom rsz szerepe: mit tegyen az els elem rkezse eltt, mit tegyen az ppen aktulis elemek rkezsekor, mit tegyen az utols elem rkezse utn. Nzznk erre egy pldt:
[13] PS C:\> "egy","kett","hrom" | foreach-object {"----eleje----"} {$_} {"----vge----"} ----eleje---egy kett hrom ----vge----

Ebben a pldban nem is rtam ki a paramterek neveit, azaz a pozci alapjn rendelte hozz az egyes szkriptblokkokat a PowerShell. Ha csak egy szkriptblokkot adunk meg az a Process szekcihoz soroldik.

1.7.6 Where-Object cmdlet


Gyakran fordul az el, hogy nem minden gyjtemny-elemmel szeretnnk foglalkozni, hanem csak bizonyos tulajdonsggal rendelkezkkel, s ezeket szeretnnk tovbbkldeni a csvezetknkben feldolgozsra, a szrfelttelnknek nem megfelel elemeket egyszeren el szeretnnk dobni. Ugyan ezt meg lehet tenni a ForEach-Object s az IF kombincijval, de van egy direkt erre kitallt cmdletnk is, a Where-Object:
[1] PS C:\> $tmb = 1,2,"szveg", 3 [2] PS C:\> $tmb | Where-Object {$_ -is [int]} | ForEach-Object {$_*2} 2 4 6

157

Vezrl utastsok
Ugyan a Where-Object nem vezrl utasts, a hagyomnyos programozsi rtelemben, de mivel a csvezetkek kezelse annyira tipikus a PowerShellben, ezrt minden csvezetket vezrl utastst is nyugodtan sorolhatunk ebbe a kategriba.

1.7.7 Cmkk, trs (Break), folytats (Continue)


Elfordulhat, hogy a ciklusunkat nem szeretnnk minden krlmnyek kztt vgigfuttatni minden elemre. Ha teljesen ki akarunk lpni, akkor a Break kulcsszt hasznljuk, ha csak az adott elemen akarunk tovbblpni, akkor a Continue kulcssz hasznlhat. Nzznk erre pldkat:
[4] PS C:\> $tmb= 1,2,"szveg",3 [5] PS C:\> for($i=0; $i -lt $tmb.length;$i++){if($tmb[$i] -is [int]){$tmb[$i]*2}else{continue};" ez most a $i. elem duplja volt"} 2 ez most a 0. elem duplja volt 4 ez most a 1. elem duplja volt 6 ez most a 3. elem duplja volt

A fenti pldban van egy vegyes elem $tmb-m. n az egsz szmokat tartalmaz elemekre szeretnk a szm dupljt kirni s kikerlni a nem egsz szmokat. Ltszik, hogy az IF-nek az ELSE gn a continue utn mr nem hajtdik vgre a szveg kirsa. Nzznk egy msik pldt, ahol nem tugrunk cikluselemet, hanem teljesen kiugrunk a ciklusbl mihelyst oda nem ill elemet tallunk:
[25] PS C:\> $tmb= 1,2,"szveg",3 [34] PS C:\> foreach($elem in $tmb){if($elem -isnot [int]){"Hiba!!!!: $elem"; break}; $elem} 1 2 Hiba!!!!: szveg

Mi van akkor, ha nem egy, hanem kt ciklusunk van egymsba gyazva, s ekkor akarok kiugrani a ciklusokbl? Honnan tudja a PowerShell, hogy melyik ciklusbl akartam kiugorni, csak a belsbl, vagy mindkt rtegbl? Ennek tisztzsra hasznlhatunk cmkket, amelyek megmondjk a break utastsnak, hogy hova ugorjon ki:
[38] PS C:\> for($i=0; $i -lt 3;$i++) >> { >> for($j=5; $j -lt 8;$j++) >> { >> "i:{0} j:{1}" -f $i, $j >> if($j -eq 6){break} >> } >> } >>

158

Elmlet
i:0 i:0 i:1 i:1 i:2 i:2 j:5 j:6 j:5 j:6 j:5 j:6

A fenti pldban ltszik, hogy amikor a $j elri a 6-os rtket s lefut a break, akkor csak a bels ciklusbl lptem ki, megjelenik az $i=1 s $i=2 rtk is, azaz a kls ciklusbl nem lpett ki. Hogyan tudok mindkt ciklusbl egyszerre kilpni? Hasznljunk cmkt:
[40] PS C:\> :kls for($i=0; $i -lt 3;$i++) >> { >> for($j=5; $j -lt 8;$j++) >> { >> "i:{0} j:{1}" -f $i, $j >> if($j -eq 6){break kls} >> } >> } >> i:0 j:5 i:0 j:6

Ltszik, hogy a $j=6 els elfordulsnl kilpett mindkt ciklusbl. Megjegyzs: Mg trkksebb lehetsg, hogy a break attribtuma nem csak statikus szveg lehet, hanem ez a cmke egy vltozbl is jhet. Azaz bizonyos helyzetekben, mondjuk, az egyik cmkhez ugrunk vissza, ms esetekben egy msik cmkhez, s ehhez csak a vltoznk tartalmt kell vltoztatni.

1.7.8 SWITCH
A SWITCH kulcsszval nagyon bonyolult IF/ELSEIF/ELSE felttelrendszerek tudunk nagyon tlthatan, egyszeren megvalstani. St! Mg akr bonyolultabb ForEach-Object vagy Where-Object cmdleteket is tudunk helyettesteni ezzel gy, hogy a szkriptnk sokkal tlthatbb s egyszerbb lesz. Nzznk erre egy pldt, elszr egy IF szerkezet kivltsra:
[46] PS C:\> $a = 1 [47] PS C:\> if($a -gt 10){"nagyobb mint 10"}elseif($a -gt 5) {"kisebbegyenl 10, nagyobb 5"} else{"kisebbegyenl 5"} kisebbegyenl 5

Ennek switch-et alkalmaz megfelelje:

159

Vezrl utastsok
[48] PS C:\> switch($a) >> { {$a -gt 10} {"nagyobb mint 10"} >> {$a -gt 5} {"kisebbegyenl 10, nagyobb 5"} >> default {"kisebbegyenl 5"} >> } >> kisebbegyenl 5

Vajon tnyleg ekvivalens egymssal? Nzzk meg, hogy mi van akkor, ha $a=15:
[49] PS C:\> $a = 15 [50] PS C:\> if($a -gt 10){"nagyobb mint 10"}elseif($a -gt 5){"kisebbegyenl 10, nagyobb 5"}else{"kisebbegyenl 5"} nagyobb mint 10

Switch-csel:
[52] PS C:\> switch($a) >> { {$a -gt 10} {"nagyobb mint 10"} >> {$a -gt 5} {"kisebbegyenl 10, nagyobb 5"} >> default {"kisebbegyenl 5"} >> } >> nagyobb mint 10 kisebbegyenl 10, nagyobb 5

Azt lthatjuk itt, hogy a switch klnbz sorai nem igazi ELSEIF mdon mkdnek, azaz nem csak akkor addik rjuk a vezrls, ha a megelz sorok nem adtak eredmnyt, hanem minden esetben. Ha ezt nem szeretnnk, akkor hasznljuk a BREAK kulcsszt:
[53] PS C:\> switch($a) >> { {$a -gt 10} {"nagyobb mint 10"; break} >> {$a -gt 5} {"kisebbegyenl 10, nagyobb 5"; break} >> default {"kisebbegyenl 5"} >> } >> nagyobb mint 10

Ez mr ugyanazt a kimenetet adta, mint az IF-es megolds. Tulajdonkppen a default g eltti break felesleges, mert oda a vezrls csak akkor kerl, ha egyik megelz felttel sem teljesl, de ha kirjuk, akkor sem okoz ez semmilyen problmt. A fenti pldk taln mg nem rzkeltetik elgg a switch elnyt, hiszen itt csak egy hromtag IF lncolatot helyettestettem. Tbbtag kifejezs esetn jobban ltszdna a switch tlthatsga, br gy is, a legbegyazottabb ELSE g helyett sokkal szebben nz ki egy default cmke. Mg jobban kivilglik a switch egyszersge, ha egyenlsgre vizsglunk, hiszen ekkor nem kell kln az egyenlsg opertort sem hasznlni:

160

Elmlet
[1] PS C:\> $a = 10 [2] PS C:\> switch($a){ 1 {"egy"} 2 {"kett"} 3 {"hrom"} 10 {"tz"} default {"egyb"}} tz

De itt nem is r vget a switch elnye, mert ellenttben az IF-fel a switch mg gyjtemnyeket is kpes kezelni, gy nagyon j alternatvja lehet a ForEachObject s a Where-Object cmdleteknek is. Pldul egy kezetlent szkript csak ennyibl ll:
[42] PS C:\> $a = "t j rrs az tvefrgpen" [43] PS C:\> $ofs="";"$(switch([char[]] $a){'' {'a'} '' {'e'} '' {'i'} '' {'o'} '' {'o'} '' {'o'} '' {'u'} '' {'u'} '' {'u'} default {$_}})" ot uj uriras az utvefurogepen

Itt a switch megkapja az $a sztringbl kpzett karaktertmbt ([char[]]), majd a sok karaktercsert megvalst switch tag utn visszakonvertlom a karaktersorozatot ad kimenetet (az egsz kifejezs $()-ben) sztringg (), de gy, hogy ne legyen elvlaszt szkz karakter a betk kztt ($ofs=). Megjegyzs Br nem hasznltam a fenti pldban explicit csvet, azaz a | csjelet, de mgis hivatkozhat a switch-ben a $_ vltoz.

1.7.8.1 wildcard
s mg itt sem r vget a switch lehetsg-tra. Gyakran foglakozunk szvegek vizsglatval, gy pldul ilyen jelleg kifejezsek is gyakran szksgess vlnak:
[44] PS C:\> $a = "szveg" [45] PS C:\> switch ($a) {{$a -like "s*"} {"s-sel kezddik"} {$a -like "z*"} {"z-vel kezddik"}} s-sel kezddik

Ha ezt prblnnk egyszerbben rni, s kihagyjuk a -like opertort, akkor nem kapunk j eredmnyt:
[46] PS C:\> switch($a){s* {"s-sel kezddik"} z* {"z-vel kezddik"}} [47] PS C:\>

Hiszen ekkor a switch egyenlsget vizsglt. Ha like felttel van mindentt, akkor a switch wildcard kapcsoljval tudjuk az alaphelyzet szerinti egyenlsgvizsglatot -like vizsglatt alaktani:

161

Vezrl utastsok
[48] PS C:\> switch -wildcard ($a) {s* {"s-sel kezddik"} z* {"z-vel kezddik"}} s-sel kezddik

1.7.8.2 regex
Szintn gyakori eset a szvegmintk vizsglata, mint ahogy erre mr lttunk pldt a 1.6.6 Regex (-match, -replace) fejezetben. A switch erre is fel van ksztve:
[3] PS C:\> $vizsgland="telefon: (30) 311-6867" [4] PS C:\> switch -regex ($vizsgland) >> {'\((\d{1,2})\)(-|\s)' {"Krzetszm: $($matches[1])"; break} >> default {"Nincs krzetszm"}} >> Krzetszm: 30 [5] PS C:\> $vizsgland = "Telefon: 123-4567" [6] PS C:\> switch -regex ($vizsgland) >> {'\((\d{1,2})\)(-|\s)' {"Krzetszm: $($matches[1])"; break} >> default {"Nincs krzetszm"}} >> Nincs krzetszm

A fenti pldban zrjelek kzti 1 vagy 2 szmjegybl ll mintt keresek a vizsgland szvegben, amely mintt vagy szkz, vagy ktjel kvet. Ha van ilyen, akkor a regex bels csoportkpzsvel kiadd zrjelek kzti szmot adom vissza krzetszm gyannt, egybknt kiratom, hogy nincs krzetszm.

1.7.8.3 $switch vltoz


Hasonlan a ForEach kulcsszhoz, a switch-nek is van bels vltozja, melynek $switch a neve, s amelyet felhasznlhatunk ciklus-jelleg mkds megvalstsra:
[8] PS C:\> $Hossz = "Vezetknv: Sos >> Keresztnv: Tibor >> e-mail: soostibor@citromail.hu >> Telefon: 30-3116867 >> Vros: Budapest" >> [9] PS C:\> $darabok = $Hossz.Split() [10] PS C:\> $darabok Vezetknv: Sos Keresztnv: Tibor e-mail: soostibor@citromail.hu Telefon: 30-3116867 Vros: Budapest [12] PS C:\> switch($darabok) {

162

Elmlet
>> "Vezetknv:" {[void] $switch.MoveNext(); $vez = $switch.Current} >> "Keresztnv:" {[void] $switch.MoveNext(); $ker = $switch.Current} >> "e-mail:" {[void] $switch.MoveNext(); $ema = $switch.Current} >> "Telefon:" {[void] $switch.MoveNext(); $tel = $switch.Current} >> "Vros:" {[void] $switch.MoveNext(); $var = $switch.Current} >> } >> [13] PS C:\> $ker Tibor [14] PS C:\> $vez Sos

Teht ez a vltoz akkor hasznlhat igazbl, ha egy gyjtemnyt adunk t a switch-nek. Ekkor a gyjtemny egyes tagjait a $switch vltoz az MoveNext() metdusval ciklus-szeren tudja kezelni. Maga a switch pedig meg tudja vizsglni az egyes elemeket s a vizsglat eredmnynek fggvnyben klnbz kdrszletek futhatnak le. A fenti pldban van egy hossz sztringem, amibl ki szeretnm szedni a nem cmke jelleg adatokat, s ezeket be akarom tlteni a megfelel vltozkba. Elsknt feldarabolom a sztringet a Split() metdussal. Az gy megszlet szavakbl ll $darabok tmbt tadom a switch-nek. Ha a switch cmkt tall (Vezetknv:, Keresztnv:, stb.), akkor tovbblp a kvetkez darabra s azt betlti a megfelel vltozba. gy minden adat pont a helyre kerlt.

163

Fggvnyek

1.8 Fggvnyek
Lttuk, hogy a PowerShell 129 darab cmdlettel rendelkezik, ami elg soknak tnik elsre, de amint elkezdnk dolgozni ebben a krnyezetben rjhetnk, hogy bizonyos mveletek elvgzshez jra s jra ugyanazt az utastssort hasznljuk. Ilyenkor rdemes lehet ezeket a mveleteket elmenteni, elments eltt esetleg a szlesebb kr felhasznlhatsg rdekben ltalnostani. Az elmentsnek kt lehetsge van: fggvny s szkript ksztse. Persze ez a ktfajta mentsi tpus nem klnl el ltalban egymstl, hiszen fggvnydefincit tehetnk szkriptbe, s szkriptet is meghvhatunk fggvnybl. A kzs bennk teht, hogy tartalmaznak egy olyan PowerShell utastssort, amely mr korbban definilt utastsokbl kulcsszavakbl, cmdletekbl, fggvnyekbl, szkriptekbl, stb. ll. A f klnbsg a kett kztt, hogy a fggvnyeknek minden esetben van sajt nevk s futs idben jnnek ltre, mg a szkriptek nem felttlenl van sajt nevk, viszont fjlokban troljuk ket, ezeknek a fjloknak viszont biztos van nevk, s a fjljuk betltsvel hajtdnak vgre. Elsknt nzzk a fggvnyeket!

1.8.1 Az els fggvnyem


Az els fggvnyem nem sok mindent fog csinlni, kirja zembiztosan, hogy els:
[1] PS C:\> function fggvny1 {"els"}

Ki is prblom:
[2] PS C:\> fggvny1 els

Amikor a fggvnyt meghvom, a PowerShell valjban az ltalam bert fggvnynv helyett a httrben vgrehajtja, amit n a fggvnydefinciban a kt kapcsos zrjel {} kz rtam.

1.8.2 Paramterek
Termszetesen a fggvny1-nek nem sok rtelme van, de pldul ksztsnk egy olyan fggvnyt, ami kiszmtja egy kr terlett. Nem egy konkrt krre gondolok, hanem olyan fggvnyt szeretnk, amibe paramterknt tadhatom az aktulis kr sugart, s ebbl szmtja a terletet:
[3] PS C:\> function krterlet ($sugr) >> { >> $sugr*$sugr*[math]::Pi >> }

164

Elmlet
>> [4] PS C:\> krterlet 12 452,38934211693 [5] PS C:\> krterlet 1 3,14159265358979

Ez a formtum hasonlatos a hagyomnyos programnyelvek fggvnydefinciihoz, de a fggvnyem meghvsnak mdja kicsit ms. Nem kell zrjelet hasznlni, s ha tbb paramterem lenne, azok kz nem kell vessz, mert ugye a PowerShellben a vessz a tmb elemeinek sztvlasztsra val!

1.8.2.1 Paramterinicializls
Nzznk egy jabb fggvnyt, egy ngyszg terlett akarom kiszmoltatni:
[12] PS C:\> function ngyszg ($x, $y) >> { $x*$y } >> [13] PS C:\> ngyszg 5 6 30

Mi van akkor, ha egy ngyzetnek a terlett akarom kiszmoltatni, aminek nincs kln x s y oldala, csak x:
[14] PS C:\> ngyszg 7 0

Ht ez nem sikerlt, hiszen a fggvnyem kt paramtert vrt, az $y nem kapott rtket, gy a szorzat rtke 0 lett. Lehetne persze a fggvnyen bell egy IF felttellel meg2 vizsglni, hogy vajon a $y kapott-e rtket, s ha nem, akkor x -et szmolni. Ennl egyszerbben is lehet ezt elrni a paramterek inicializlsval:
[15] PS C:\> function ngyszg ($x, $y = $x) >> { $x*$y } >> [16] PS C:\> ngyszg 7 49

Itt a [15]-s sorban az $y vltoznak tadom az $x rtkt. Ez az rtkads azonban csak akkor jut rvnyre, ha a fggvny meghvsakor n nem adok neki kln rtket, azaz tovbbra is mkdik a tglalap terletnek kiszmtsa is:
[17] PS C:\> ngyszg 8 9 72

165

Fggvnyek

Megjegyzs Mi lenne, ha a ngyszg fggvny meghvsra a hagyomnyos, zrjeles formtumot hasznlnm most:
[22] PS C:\> ngyszg(2,3) Cannot convert "System.Object[]" to "System.Int32". At line:2 char:6 + { $x*$ <<<< y }

Meg is kaptam a hibt, hiszen a fggvnyem nincs felkszlve egy ktelem tmb terletnek kiszmtsra. A paramtereknek nem csak msik vltoz adhat alaprtket, hanem tehetnk oda egy konstanst is:
[18] >> { >> [19] Szia [20] Szia PS C:\> function dvzlet ($nv = "Tibi") "Szia $nv!" } PS C:\> dvzlet Zsfi Zsfi! PS C:\> dvzlet Tibi!

1.8.2.2 Tpusos paramterek


Hasonlan, ahogy a vltozknl is definilhatunk tpust, a fggvnyek paramtereinl is jelezhetem, hogy milyen tpus adatot vrok. Ez a fggvny hibs mkdsnek lehetsgt cskkentheti. Nzzk a krterlet-szmol fggvnyemet, mit tesz, ha szvegknt adok be neki sugarat:
[33] PS C:\> krterlet "2" 222222

Elg rdekesen alakul ez a geometria a PowerShellben! De eddigi ismereteink alapjn rjhetnk, hogy mi trtnt. Ugye a fggvnynk belsejben ez tallhat:
$sugr*$sugr*[math]::Pi

Az els $sugr a PowerShell szablyai szerint lehet 2 (szvegknt). A msodik mr nem, viszont mkdik az automatikus tpuskonverzi, teht csinl belle 2-t (szm). Idig kapunk 22-t, azaz az els sztringemet (2) ktszer egyms mellett. Majd jn a PI, ugyan az nem egsz, de itt is jn a tpuskonverzi, lesz belle 3, azaz immr a 22-t rakja egyms mell hromszor, gy lesz belle 222222. Na, ezt nem szeretnnk, ezrt tegyk tpusoss a sugarat:

166

Elmlet
[42] PS C:\> function krterlet ([double] $sugr) >> { >> $sugr*$sugr*[math]::Pi >> } >> [43] PS C:\> krterlet "2" 12,5663706143592

Itt mr helyes irnyba tereltk a PowerShell tpuskonverzis automatizmust, rgtn a paramtertadsnl konvertlja a szveges 2-t szmm, innentl mr nincs flrerts. Megjegyzs Az is helyes eredmnyt adott volna, ha felcserltk volna a tnyezk sorrendjt:
[math]::Pi *$sugr*$sugr

De elegnssabb s hibatrbb ha inkbb tpusjelzkkel ltjuk el a paramtereket.

1.8.2.3 Hibajelzs
Az elz krterlet fggvnyemnl, ha a paramter nem konvertlhat [double] tpuss, akkor hibt kapunk, anlkl, hogy mi ezt leprogramoztuk volna:
[19] PS C:\>krterlet "nagy" krterlet : Cannot convert value "nagy" to type "System.Double". Error: "Input string was not in a correct format." At line:1 char:11 + krterlet <<<< "nagy"

Viszont elkpzelhet olyan paramterrtk is, ami br nem okoz problmt kzvetlenl se a tpusos paramternek, se a fggvny belsejnek, de mi mgis szeretnnk hibaknt kezelni. A krterlet pldmnl tekintsk hibnak, ha valaki negatv szmot ad meg sugrnak. A fentihez hasonl formtum (piros betk) hibazenetet rattathatunk ki a throw kulcssz segtsgvel:
[22] PS C:\>function krterlet ([double] $sugr) >> { >> if ($sugr -lt 0) >> { throw "Pozitv szmot krek!" } >> $sugr*$sugr*[math]::Pi >> } >> [23] PS C:\>krterlet -2 Pozitv szmot krek! At line:4 char:16 + { throw <<<< "Pozitv szmot krek!" }

De nem csak ilyen esetben lehet szksg hibakezelsre, hanem akkor is, ha valaki nem ad meg paramtert. Egy paramter ktelez vagy opcionlis voltt nem tudom a

167

Fggvnyek
fggvnydefinciban jelezni, gy ennek vizsglatt nekem kell elvgeznem s a megfelel vlaszrl gondoskodnom. De szerencsre ez sem tl bonyolult a throw segtsgvel:
[29] PS C:\>function krterlet ([double] $sugr = $(throw "ktelez paramt er")) >> { >> if ($sugr -lt 0) >> { throw "Pozitv szmot krek!" } >> $sugr*$sugr*[math]::Pi >> } >> [30] PS C:\>krterlet ktelez paramter At line:1 char:47 + function krterlet ([double] $sugr = $(throw <<<< "ktelez paramter" )) [31] PS C:\>krterlet 5 78,5398163397448

Ltszik, hogy mr az rtkadsnl hasznlhatjuk a hibajelzst, mint alaprtket. Ha nem ad a felhasznl paramterknt rtket, akkor vgrehajtdik a hibakezels, viszont ha ad rtket, akkor termszetesen erre nem kerl sor.

1.8.2.4 Vltoz szm paramter


Elfordulhat olyan is, hogy nem tudjuk elre, hogy hny paramternk lesz egy fggvnyben. Pldul szeretnnk kiszmolni tetszleges darabszm sztring hossznak az tlagt. Ilyenkor dilemmba kerlhetnk, hiszen hny paramtert soroljunk fel? Hogyan inicializljuk ezeket? Szerencsre nem kell ezen tprengennk, mert a PowerShell kszt automatikusan egy $args nev vltozt, amely tartalmazza a fggvnynek tadott valamennyi olyan paramtert, amelyet gy adunk t, hogy nem nvvel hivatkozunk rjuk:
[25] PS C:\> function tlaghossz >> { >> $hossz = 0 >> if($args) >> { >> foreach($arg in $args) >> {$hossz += $arg.length} >> $hossz = $hossz/$args.count >> } >> $hossz >> } >> [26] PS C:\> tlaghossz "Egy" "kett" "hrom" "ngy" 4,25

Az tlaghossz fggvnyemnek ezek alapjn nincs explicit paramtere, azaz nvvel nem is lehet hivatkozni a paramtereire, viszont implicit mdon az $args tmbn keresztl termszetesen megkapja mindazt a paramtert, amelyet tadunk neki. Ebben az

168

Elmlet
esetben azonban nehezebben tudjuk kzben tartani a paramterek tpust, gy ezzel csak a fggvny bels, defincis rszben tudunk foglalkozni. Mi van az $args vltozval, ha vannak explicit paramtereink is? Nzznk erre egy pldt:
[46] PS C:\> function mondatgenertor ($eleje, $vge) >> { >> write-host $eleje, $args, $vge >> } >> [47] PS C:\> mondatgenertor "Egy" "kett" "hrom" "ngy" Egy hrom ngy kett

Lthatjuk, hogy gy mkdik a PowerShell, ahogy vrtuk, a nevestett paramterek nem kerlnek bele az $args tmbbe, gy a fenti fggvnyemben egyetlen argumentum sem lett dupln kirva.

1.8.2.5 Hivatkozs paramterekre


Eddig az sszes fggvnypldmban a fggvnyek meghvsakor a paramtertads pozci alapjn trtnt. Ez egyszeren azt jelenti, hogy az els paramter taddik a fggvnydefinci paramterei kztt felsorolt els vltoznak, a msodik paramter a msodik vltoznak s gy tovbb. Ha tbb paramtert adunk t, mint amennyit a fggvny defincijban felsoroltunk, akkor ezek az extra paramterek az $args vltozba kerlnek bele. Mi van akkor, ha egy fggvnynek opcionlis paramtere is van, s nem akarok neki rtket adni? Ezt eggyel tbb szkz letsvel jelezzem? Alaktsuk t ennek szemlltetsre az elz mondatgenertor fggvnyemet:
[48] PS C:\> function mondatgenertor ($eleje, $kzepe, $vge) >> { >> write-host "Eleje: $eleje kzepe: $kzepe vge: $vge" >> } >> [49] PS C:\> mondatgenertor egy kett hrom Eleje: egy kzepe: kett vge: hrom [50] PS C:\> mondatgenertor egy hrom Eleje: egy kzepe: hrom vge:

Itt hrom explicit paramtert fogad a fggvny. Ha tnyleg hrom paramterrel hvom meg, akkor minden paramter a helye alapjn kerl a megfelel helyre. Ha a msodik paramtert ki szeretnm hagyni, akkor ezt hiba akarom jelezni eggyel tbb szkzzel ([50]-es sor), ez termszetesen a PowerShell parancsrtelmezjt nem hatja meg, gy ms mdszerhez kell folyamodnom, ez pedig a nv szerinti paramtertads:
[55] PS C:\> mondatgenertor -eleje egy -vge hrom Eleje: egy kzepe: vge: hrom

169

Fggvnyek
gy mr tnyleg minden a helyre kerlt. A nv szerinti paramtertadsnl is szmos gpelst segt lehetsget biztost szmunkra a PowerShell:
[56] PS C:\> mondatgenertor -e egy Eleje: egy kzepe: vge: hrom [57] PS C:\> mondatgenertor -e:egy Eleje: egy kzepe: vge: hrom -v hrom -v:hrom

Az [56]-os sorban lthat, hogy a nevekre olyan rviden elg hivatkozni, ami mg egyrtelmv teszi, hogy melyik paramterre is gondolunk. Az *57+-es sorban meg az lthat, hogy a PowerShell elfogadja a sok egyb parancssori krnyezetben megszokott paramtertadsi szintaxist is, azaz hogy kettspontot tesznk a paramternv utn. A hely szerinti s pozci szerinti paramterhivatkozst vegythetjk is:
[58] PS C:\> mondatgenertor -v: hrom egy -k: kett Eleje: egy kzepe: kett vge: hrom

Itt a szably az, hogy a PowerShell elszr kiveszi a fggvnyhvsbl a nevestett paramtereket, majd hely szerint feltlti a tbbi explicit paramtert, s ha mg mindig marad paramter, azt berakja az $args vltozba.

1.8.2.6 Kapcsol paramter ([switch])


Sok fggvnynl elfordul olyan paramter, amelynek csak kt llapota van: szerepeltetjk a paramtert vagy sem. Ez nagyon hasonlt a [bool] adattpushoz, de feleslegesen sokat kellene gpelni, ha tnyleg [bool]-t hasznlnnk:
fggvny -bekapcsolva $true

Sokkal egyszerbb lenne csak ennyit rni:


fggvny -bekapcsolva

Erre talltk ki a [switch] adattpust, amelyet elsdlegesen pont ilyen paramterek esetben hasznlunk.
[60] PS C:\> function lmpa ([switch] $bekapcsolva) >> { >> if($bekapcsolva) {"Vilgos van!"} >> else {"Stt van!"} >> } >> [61] PS C:\> lmpa Stt van! [62] PS C:\> lmpa -b Vilgos van!

170

Elmlet
A fenti lmpa fggvnyemet, ha kapcsol nlkl hasznlom, akkor sttet jelez (az IF ELSE ga), ha van kapcsol, akkor vilgos. Azaz, ha szerepel a paramterek kztt a kapcsol, akkor vltozjnak rtke $true lesz, ha nem szerepel a kapcsol, akkor vltozjnak rtke $false lesz. Megjegyzs Korbban volt arrl sz, hogy a paramterek nv szerinti hivatkozsa mellett akr lehet szkzzel, akr kettsponttal rtket adni. Ez a [switch] paramtertpusnl nem mindegy:
[63] PS C:\old> lmpa -b $false Vilgos van! [64] PS C:\old> lmpa -b:$false Stt van!

A [63]-as sorban szkzzel vlasztottam el a paramtertl az rtket, ezt a fggvnyem figyelmen kvl hagyta s a kapcsolnak $true rtket adott. A *64+-es sorban kettsponttal adtam a paramternek rtket, itt mr az elvrt mdon $false rtket vett fel a kapcsolm.

1.8.2.7 Paramter-definci a fggvnytrzsben (param)


Ha valaki olyan programozi httrrel rendelkezik, ahol megszokta, hogy a fggvnydefinciknl van egy kln deklarcis rsz, akkor hasznlhatjk a param kulcsszt a fggvny paramtereinek deklarlshoz:
[2] PS I:\>function get-random >> { >> param ([double] $max = 1) >> $rnd = new-object random >> $rnd.NextDouble()*$max >> } >> [3] PS I:\>get-random 1000 315,589330306085

Itt a get-random fggvnyem neve utn nem szerepel semmilyen paramter, hanem bekltztettem a fggvnytrzsbe, itt viszont ktelezen egy param kulcsszval kell jelezni a paramtereket. Ez akkor is hasznos lehet, ha bonyolultabb kifejezsekkel adok kezdrtket a paramtereimnek, mert ezzel a kln deklarcis rsszel sokkal olvashatbb lesz a fggvnyem. Ennek paramterezsi lehetsgnek egybknt nem is itt, hanem majd a szrkipteknl lesz mg inkbb jelentsge.

171

Fggvnyek

1.8.2.8 Paramterek, vltozk ellenrzse (validls)


Termszetesen a paramterek ellenrzse akkor a legegyszerbb, ha eleve csak a kvnalmainknak megfelel rtkeket lehetne tadni. A tpus megfelelsgnek vizsglathoz mr lthattuk, egyszeren csak egy tpusjellt kell a paramter neve eltt szerepeltetni. De vajon milyen lehetsgnk van, ha mg tovbbi megszortsokat szeretnnk tenni? Ennek egyik lehetsge, hogy a fggvnynk trzsben sajt programkddal ellenrizzk az rtk helyessgt. Pldul nzznk a korbban mr ltott krterlet kiszmt fggvnyt:
[22] PS C:\>function krterlet ([double] $sugr) >> { >> if ($sugr -lt 0) >> { throw "Pozitv szmot krek!" } >> $sugr*$sugr*[math]::Pi >> } >>

Itt n ellenrzm, hogy csak pozitv szmot lehessen megadni sugrnak. A .NET keretrendszerben azonban vannak kifejezetten ilyen jelleg, paramterellenrzsre szolgl osztlyok is. Ilyen szablyokat hozz is rendelhetnk vltozkhoz, erre szolgl a vltozk tulajdonsgai kztt az Attributes tulajdonsg:
[1] PS C:\> $a = 1 [2] PS C:\> Get-Variable a | fl Name Description Value Options Attributes : : : : : a 1 None {}

Alaphelyzetben ez a tulajdonsg res, vajon hogyan s mivel lehet feltlteni? Nzzk meg, hogy milyen metdusai vannak ennek az attribtumnak:
[8] PS C:\> ,(Get-Variable a).Attributes | gm TypeName: System.Management.Automation.PSVariableAttributeCollection Name ---Add Clear Contains CopyTo Equals GetEnumerator GetHashCode MemberType ---------Method Method Method Method Method Method Method Definition ---------System.Void Add(Attribute item) System.Void Clear() System.Boolean Contains(Attribute item) System.Void CopyTo(Attribute[] array... System.Boolean Equals(Object obj) System.Collections.Generic.IEnumerat... System.Int32 GetHashCode()

172

Elmlet
GetType get_Count get_Item IndexOf Insert Remove RemoveAt set_Item ToString Item Count Method Method Method Method Method Method Method Method Method ParameterizedProperty Property System.Type GetType() System.Int32 get_Count() System.Attribute get_Item(Int32 index) System.Int32 IndexOf(Attribute item) System.Void Insert(Int32 index, Attr... System.Boolean Remove(Attribute item) System.Void RemoveAt(Int32 index) System.Void set_Item(Int32 index, At... System.String ToString() System.Attribute Item(Int32 index) {... System.Int32 Count {get;}

Teht van neki Add metdusa, ezzel lehet ellenrzsi objektumokat hozzadni ehhez 10 az attribtumhoz. A PowerShell MSDN weboldaln s a Reflector programmal a System.Management.Automation nvtrbe besva ezeket az ellenrzsi osztlyokat lehet megtallni:
Osztly neve System.Management.Automation.ValidateArgumentsAttribute System.Management.Automation.ValidateCountAttribute System.Management.Automation.ValidateEnumeratedArgumentsAttribute System.Management.Automation.ValidateLengthAttribute System.Management.Automation.ValidatePatternAttribute System.Management.Automation.ValidateRangeAttribute System.Management.Automation.ValidateSetAttribute System.Management.Automation.ValidateNotNullAttribute System.Management.Automation.ValidateNotNullOrEmptyAttribute Felhasznlsi terlet Szl osztly Attribtumok szmnak ellenrzse Szl osztly Hossz ellenrzse (pl.: sztring, tmb) Regex minta ellenrzse (sztring) rtktartomny ellenrzse (pl.: int, double) rtklista ellenrzse (sztring) Nem null rtk ellenrzse Nem null s nem ressg ellenrzse

Nzznk ezek hasznlatra nhny pldt. Az elsben szeretnk olyan vltozt hasznlni, amely csak 1 s 5 darab karakter kztti hosszsg szveget fogad el:
[87] PS C:\old>$vl = New-Object System.Management.Automation.ValidateLengthA ttribute 1,5 [88] PS C:\old>$sz = "rvid" [89] PS C:\old>(get-variable szo).attributes.add($vl) [90] PS C:\old>$sz="nagyonhossz" Cannot validate because of invalid value (nagyonhossz) for variable szo. At line:1 char:5 + $szo= <<<< "nagyonhossz"

10

http://msdn.microsoft.com/ en-us/library/system.management.automation.validateargumentsattribute(VS.85).aspx

173

Fggvnyek
A [87]-es sorban definilom a VaildateLengthAttribute osztly egy objektumt. Majd ltrehozok egy $sz nev vltozt rvid tartalommal. Ennek a vltoznak az Attributes tulajdonsghoz hozzadom az elbb ltrehozott ellenrzsi objektumot. A [90]-es sorban a vltozmnak egy 5 karakternl hosszabb rtket szeretnk adni, de erre hibt kaptam. Nzznk egy hasonl pldt az ressg vizsglatra:
[94] PS C:\old>$s2="valami" [95] PS C:\old>$vnne = New-Object System.Management.Automation.ValidateNotNu llOrEmptyAttribute [96] PS C:\old>(get-variable s2).Attributes.add($vnne) [97] PS C:\old>$s2="" Cannot validate because of invalid value () for variable s2. At line:1 char:4 + $s2= <<<< ""

Ha egy ilyen ellenrzsi attribtummal ltunk el egy vltozt, akkor az megmutatkozik a vltoz tulajdonsgai kztt is:
[98] PS C:\old>Get-Variable s2 | fl * Name Description Value Options Attributes : : : : : s2 valami None {System.Management.Automation.ValidateNotNullOrEmptyAttribute }

Ezekbl az ellenrzsi objektumokbl egyszerre tbbet is lehet egy vltozhoz rendelni. Sajnos ezen ellenrzsi objektumok felhasznlsnak egyik f nehzsge az, hogy ahhoz, hogy ilyen szablyt egy vltozhoz rendelhessk, ahhoz addigra mr a vltoznak olyan rtkkel kell rendelkeznie, amelyre teljesl az ellenrzsi felttel. Azaz, ha pldul egy NotNull tpus ellenrzst szeretnnk hozzrendelni egy vltozhoz, addigra mr valamilyen rtkkel kell rendelkeznie a vltoznak, klnben nem engedi a szablyt hozzrendelni. gy a fggvnyek paramtereinl trtn felhasznlsuk kicsit krlmnyes:
[9] PS C:\> function nemnull ($p) >> { >> $pteszt = 1 >> $vnn = New-Object System.Management.Automation.ValidateNotNullAttribu te >> (Get-Variable pteszt).Attributes.Add($vnn) >> >> $pteszt = $p >> } >> [10] PS C:\> nemnull 100 [11] PS C:\> nemnull Cannot validate because of invalid value () for variable pteszt.

174

Elmlet
At line:6 char:12 + $pteszt <<<< = $p

Azaz a fggvny trzsben ltrehozok egy tesztelsi clokat szolgl $pteszt vltozt, ami kielgti azt a felttelt, hogy nem res az rtke, s ez a vltoz hordozza az ellenrzsi objektumot is. A fggvny paramternek ellenrzsre a $p vltoz rtkt tadom ennek a tesztelsi clra ltrehozott vltoznak. Amikor a fggvnyemet paramter nlkl hvtam meg, akkor hibt kaptam. Itt igazbl csak annyit sproltam, hogy nem nekem kell lekezelni s kirni a hibt, ezt a PowerShell helyettem elvgezte.

1.8.3 Vltozk lthatsga (scope)


A PowerShellben a vltozknak van szablyozhat lthatsguk (scope). Az alapszably, hogy egy adott krnyezetben ltrehozott vltozk az alkrnyezetekben is lthatk. Krnyezet maga a PowerShell konzol, egy fggvny, egy script. Ahogy ezeket egymsbl meghvjuk generldnak az al-, al-, krnyezetek. A PowerShell konzol az u.n. global krnyezet, az sszes tbbi, innen hvott fggvny vagy szkript ennek alkrnyezete. Nzzk az egyszer lthatsg alapesett:
[1] PS I:\>$a = "valami" [2] PS I:\>function fv{$a} [3] PS I:\>fv valami

[1]-ben ltrehoztam egy $a vltozt, *2+-ben egy nagyon egyszer fggvnyt, ami csak annyit csinl, hogy visszaadja $a-t, majd [3]-ban meghvtam ezt az fv nev fggvnyt. Az eredmny lthat: a fggvny ltta $a-t, ki tudta rni a tartalmt. Nzznk egy kicsit bonyolultabb esetet, mi van akkor, ha a fggvnyemnek is van egy $a vltozja:
[6] PS I:\>$a = "valami" [7] PS I:\>function fv1{$a="msvalami";$a} [8] PS I:\>fv1 msvalami [9] PS I:\>$a valami

[7]-ben az fv1 fggvnyem definil egy $a-t, majd ki is rja. *8+-ban meg is kaptam a bels $a eredmnyt, de ettl fggetlenl *9+-ben a global krnyezetbl nzve az $a tovbbra is az, ami volt. Azaz a gyerek krnyezet nem hat vissza a szlre. Ha szksgnk van kln a szl vltozjra is a fggvnyen bell, akkor ezt meg tudjuk tenni a get-variable cmdlet scope paramternek belltsval. A -scope 0 jelenti a sajt krnyezetet, -scope 1 jelenti a szlkrnyezetet, -scope 2 jelenten a nagyszlt s gy tovbb:

175

Fggvnyek
[11] PS I:\>function fv2{$a="msvalami";$a; get-variable a -scope 0} [12] PS I:\>fv2 msvalami Name ---a Value ----msvalami

[11]-ben a sajt $a-t rja ki a get-variable, a kvetkez pldban pedig a szl $a vltozjt:
[14] PS I:\>function fv2{$a="msvalami";$a; get-variable a -scope 1} [15] PS I:\>fv2 msvalami Name ---a Value ----valami

A gyerek krnyezet fggvnye meg is tudja vltoztatni a szl krnyezet vltozjt, ha a set-variable cmdlet ugyanilyen scope paramtert megadjuk:
[17] PS I:\>function fv3{$a="msvalami";$a; (get-variable a -scope 1).value; set-variable a -scope 1 -value "vltozs"} [18] PS I:\>fv3 msvalami valami [19] PS I:\>$a vltozs

Itt a fv3 fggvnyben vge fel megvltoztatom a szl $a vltozjt vltozs-ra. A 0 s a legfels krnyezetre nmikpp egyszerbb szintaxissal is hivatkozhatunk:
[25] PS I:\>$c=1 [26] PS I:\>function kie{$c=2; "n c-m:$local:c";"Te c-d:$global:c"} [27] PS I:\>kie n c-m:2 Te c-d:1 [28] PS I:\>function ront{$c=2; $local:c=3;$global:c=4;"n c-m:$local:c";"Te c-d:$global:c"} [29] PS I:\>ront n c-m:3 Te c-d:4

Egybknt vigyzni kell nagyon a fggvnyekkel! Az albbi kis pldban, ha a programoz abbl a felttelezsbl indul ki, hogy a $b az gyis 0 kezdetben, gy a $b=$b+5 rtke 5 lesz, akkor nagyot fog csaldni:
[21] PS I:\>$b=10 [22] PS I:\>function elront{$b=$b+5; $b} [23] PS I:\>elront 15

176

Elmlet
[24] PS I:\>$b 10

Mi trtnt itt? A lthatsg miatt az elront fggvnyben az rtkads jobb oldaln szerepl $b az a szl $b-je, a bal oldali $b mr a fggvny bels $b-je. Teht br a nevk ugyanaz trhely szempontjbl klnbzek. Tipp A fggvnyek bels vltozit mindig rtkads utn kezdjk el hasznlni, nehogy tvedsbl a szl krnyezet ltal definilt ugyanolyan nev vltoz rtkvel kezdjnk el dolgozni. Ha nem szeretnnk, hogy egy vltoznkhoz valamelyik gyerek krnyezet hozzfrhessen, akkor nyilvntsuk privtnak ezt a vltozt:
[32] PS [33] PS [34] PS Privt: [35] PS 1 I:\>$private:priv=1 I:\>function latom{"Privt: $priv"} I:\>latom I:\>$priv

Ha egy fggvnynek mgis ennek rtkvel kell dolgoznia, akkor termszetesen paramtertadssal ez megtehet minden tovbbi nlkl, lnyeg az, hogy a privt vltozkat a gyerek krnyezet nem fogja tudni a szl tudta nlkl megvltoztatni. Azonban azrt gy sem lehetnk teljes biztonsgban, hiszen a get-variable s set-variable cmdletekkel mg a privt vltozkat is elrhetjk:
[36] PS [37] PS [38] PS Privt: [39] PS [40] PS [41] PS 99 C:\> C:\> C:\> 1 C:\> C:\> C:\> $private:priv=1 function latom{"Privt: $((get-variable priv -scope 1).value)"} latom function ront{set-variable priv -scope 1 -value 99} ront $priv

A fenti pldban lthatjuk, hogy annak ellenre, hogy privtnak definiltam a $priv vltozmat, ennek ellenre a latom fggvnyem is el tudta rni a get-variable segtsgvel, st, a ront fggvnyem mg meg is tudta vltoztatni az rtkt.

1.8.4 Fggvnyek lthatsga, dotsourcing


Hasonlan a vltozkhoz, a fggvnyeknek is van lthatsguk, scope-juk. Nzznk erre is egy pldt:

177

Fggvnyek
[12] PS I:\>function kls ($p) >> { >> function bels ($b) >> { >> Write-Host "Bels paramtere: $b" >> } >> write-host "Kls paramtere: $p" >> bels 2 >> $k = "kls vltozja" >> } >> [13] PS I:\>kls 1 Kls paramtere: 1 Bels paramtere: 2 [14] PS I:\>bels 3 The term 'bels' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again. At line:1 char:6 + bels <<<< 3 [15] PS I:\>. kls 4 Kls paramtere: 4 Bels paramtere: 2 [16] PS I:\>bels 5 Bels paramtere: 5

A [12]-es sorban definilt kls fggvnyemben definilok egy bels fggvnyt. Amgy a kls csak annyit csinl, hogy kirja a paramtert, meghvja a belst s mg definil magnak egy $k vltozt. A bels csak annyit csinl, hogy kirja a paramtert. Amikor a klst meghvom a *13+-as sorban, az szpen le is fut: a kls s a bels paramtere is kirdik. Amikor a *14+-es sorban kzvetlenl a belst hvom meg, akkor a PowerShell csodlkozik, hiszen a global scope szmra a bels fggvny nem lthat. Viszont van lehetsg arra, hogy a kls fggvnyemet felemelem globlis szintre s gy hvom meg, ezt tettem meg a [15]-s sorban. Ennek formtuma nagyon egyszer: egy darab pont, egy szkz (fontos!) s a fggvny neve. Ezt hvjuk dotsourcing-nak, azaz a meghvs szintjre emelem a fggvny (vagy szkript, ld. ksbb) futtatst. Ez termszetesen nem csak a bels fggvnydefincit emelte fel a globlis scope-ba, hanem a kls sajt vltozjt is:
[17] PS I:\>$k kls vltozja

Ha nem akarunk dotsourcing-gal bbeldni, akkor mi magunk is definilhatjuk eleve globlisnak a fggvnyben definilt fggvnynket:
[23] PS I:\>function fggvnytr >> { >> function global:els >> { "els" } >> function global:msodik >> { "msodik" } >> }

178

Elmlet
>> [24] PS I:\>fggvnytr [25] PS I:\>els els [26] PS I:\>msodik msodik

Ha ezek utn meghvom a fggvnytr fggvnyemet, definildik benne az els s a msodik fggvny is, de a globlis scope-ban, gy kzvetlenl meghvhatk. Megjegyzs: Ez a dotsourcing nagyon ers, azaz ha gy hvok meg egy fggvnyt, akkor a benne trolt minden titok meghvhat lesz kzvetlenl. Mg akkor is, ha private-nak definilom a bels fggvnyemet:
[28] PS I:\>function titkos >> { >> function private:egymegegy >> { "1+1=2" } >> } >> [29] PS I:\>. titkos [30] PS I:\>egymegegy 1+1=2

1.8.5 Referencilis hivatkozs paramterekre ([ref])


Elfordulhat olyan igny, hogy a fggvnyemmel nem j rtkeket akarok ltrehozni, hanem jl bevlt, meglev vltozm rtkt akarom megvltoztattatni. Erre is lehetsget ad a PowerShell, hiszen ltezik referencia szerinti hivatkozs is:
[10] >> { >> >> } >> [11] [12] [13] 2 [14] [15] 3 PS I:\>function bnt ([ref] $v) $v.value ++ PS I:\>$a = 1 PS I:\>bnt ([ref] $a) PS I:\>$a PS I:\>bnt ([ref] $a) PS I:\>$a

A bnt fggvnyem kzvetlenl bntja a paramterknt tadott vltozm rtkt. Ezt gy tudja megtenni, hogy neki nem rtk alapjn, hanem referencia (azaz memriacm) alapjn adjuk t a vltozt, amin aztn tud dolgozni. Mivel ez a memriacm egy referencit tartalmaz vltozba tltdik t ($v), ezrt rtelem szeren nem ennek a

179

Fggvnyek
vltoznak az rtkt kell manipullni, hanem ezen referencia mgtti rtket kell mdostani ($v.value). A fggvny meghvsnl is oda kell figyelni, hiszen ha csak simn ennyit rnnk, az nem vezetne eredmnyre:
bnt $a

Ilyenkor a PowerShell nem vgez automatikus tpuskonverzit, azaz nem automatikusan az $a vltoz referencijt adja t, segteni kell neki a [ref] tpusjelzvel. s mivel a szkzzel elvlasztott kt rszt ([ref] s $a) alaphelyzetben kt paramterknt rtelmezn, ezrt kell zrjelezni, s akkor mr j lesz, mint ahogy ez a [14]-es sorban lthat volt:
[14] PS I:\>bnt ([ref] $a)

1.8.6 Kilps a fggvnybl (return)


Elkpzelhet, hogy egy fggvnybl nem a legvgn akarunk kilpni, mert idkzben egy elgazs alapjn mr nem kell tovbbi mveletet vgezni. Ennek egyik oka lehet valamilyen hiba, amit a 1.8.2.3 Hibajelzs fejezetben ltott throw kulcsszval jelezni tudunk, s itt a fggvny vgrehajtsa meg is szakad. Ha nem hiba miatt, hanem normlis mdon akarunk egy fggvnybl kilpni, akkor erre hasznlhatjuk a return kulcsszt.
[11] PS C:\>function tpus ($i) >> { >> switch ($i) >> { >> {$i -is [int32]} {"Egsz" ; return} >> {$i -is [double]} {return "Akr trt"} >> {$i -is [string]} {return "Szveg"} >> } >> "Nem igazn tudom, hogy mi az, hogy $i" >> } >> [12] PS C:\>tpus 32 Egsz [13] PS C:\>tpus "bla" Szveg [14] PS C:\>tpus (get-date) Nem igazn tudom, hogy mi az, hogy 04/15/2008 09:47:04

A pldafggvnyemben tpust vizsglok a switch kulcssz segtsgvel. Elszr vizsglom, hogy az $i paramter egsz-e? Ha igen, akkor kirom, hogy Egsz s kilpek a fggvnybl. Hasznlhattam volna a break kulcsszt is, de az csak a switch-bl lpett volna ki s vgrehajtotta volna a fggvny utols utastst is.

180

Elmlet
A return msik szintaxist hasznltam az Akr trt s a Szveg gon, azaz a fggvny outputja lesz a return paramtere. Ltszik, hogy csak nagyon ritkn elkerlhetetlen a return alkalmazsa, hiszen az n pldmban is tehettk volna azt is, hogy a Nem igazn tudom... kirst berakjuk a switch default gba is, illetve a return-k helyett alkalmazhattam volna breaket is. Mindenesetre bizonyos helyzetekben jl jhet a return, tudjunk rla!

1.8.7 Pipe kezelse, filter


Ksztsnk olyan fggvnyt, ami kiszmolja a neki tadott fjlok hosszainak sszegt!
[19] PS C:\old>function fjlhossz ([System.IO.FileInfo] $f) >> { >> $hossz = 0 >> $hossz += $f.length >> $hossz >> } >> [20] PS C:\old>fjlhossz C:\old\alice.txt 709

Ez tkletes, de ehhez nem nagyon kellett volna fggvny, hiszen a fjlok Length tulajdonsga pont ezt az rtket adja vissza. n azt szeretnm, hogy egy fjlgyjtemnyt is tadhassak a fggvnynek, gy tbb fjlnak az egyttes hosszt is megkaphassam. Ehhez alaktsuk t a fggvnyt:
[33] PS C:\old>function fjlhossz ([System.IO.FileInfo[]] $f) >> { >> $hossz = 0 >> foreach ($file in $f) >> { >> $hossz += $file.length >> } >> $hossz >> } >> [34] PS C:\old>fjlhossz (dir) 395962

A fggvny paramterdefincis rszben felkszlk fjltmb fogadsra, majd a fggvny trzsben egy foreach ciklussal vgigszaladok az elemeken s sszeadogatom a hosszokat. Ez mr j, csak nagyon nem PowerShell-szer a fggvny meghvsa. Sokkal elegnsabb lenne, ha a dir kimenett lehetne becsvezni a fggvnyembe. Nzzk meg, hogy alkalmas-e erre a fggvnyem talakts nlkl?
[35] PS C:\old>dir | fjlhossz 0

181

Fggvnyek
Nem igazn... Merthogy ilyen csvezs esetben a PowerShell nem ad t rtket a norml paramtereknek, hanem egy automatikusan generld $input vltoznak adja ezt t:
[36] PS C:\old>function fjlhossz >> { >> $hossz = 0 >> foreach ($file in $input) >> { >> $hossz += $file.length >> } >> $hossz >> } >> [37] PS C:\old>dir | fjlhossz 395962

gy mr majdnem tkletes a fggvnyem, de lehet ezt mg szebb tenni! Mi ezzel a gond? Az, hogy ha egy nagyon mly, sok fjlt tartalmaz knyvtrstruktrra alkalmazom, akkor azt fogjuk tapasztalni, hogy a PowerShell.exe memria-felhasznlsa j alaposan felmegy, mire sszell az $input vltozban a teljes fjlobjektum lista, s csak utna tud lefutni a foreach ciklus. Sokkal optimlisabb lenne, ha mr az els fjl tadsval elkezddhetne a szmols, a memriban gy mindig csak egy fjllal kellene foglalkozni. Erre is van lehetsg, br - rdekes mdon a help errl nem r! Merthogy egy fggvnynek valjban lehet hrom elklnl vgrehajtsi fzis rsze:
function <nv> ( <paramter lista> ) { begin { <parancsok> } process { <parancsok> } end { <parancsok> } }

Lehet teht egy fggvnynek egy begin rsze, ami egyszer fut le, a fggvny meghvsakor. Lehet egy process rsze, ami minden egyes cselem megrkezsekor lefut, s lehet egy end rsze, ami az utols cselem rkezse utn fut le. Alaktsuk t gy a fjlhossz fggvnyemet, hogy a process szekciba kerljn a feldolgozs:
[44] PS C:\old>function fjlhossz >> { >> begin {$hossz = 0} >> process {$hossz += $_.length} >> end {$hossz} >> }

182

Elmlet
>> [45] PS C:\old>dir | fjlhossz 395962

Mik a fbb vltozsok? Egyrszt nem kell neknk ciklust szervezni, mert a cselemek amgy is egyesvel rkeznek. Viszont a process szekciban nem a $input vltozval kell foglalkoznunk, hanem a $_ vltozval, az tartalmazza az aktulis cselemet. Olyanynyira, hogy ha gy begin/process/end szekcikra bontjuk a fggvnyt, s a $_ vltozt hasznljuk, akkor nem is generldik $input! Ez olyan fontos, s annyira nincs benne a helpben, hogy kiemelem jra: Fontos! Ha a fggvnyemben kln begin/process/end szekcit hasznlok, akkor nem kpzdik $input vltoz, de a process szekciban a $_ vltozn keresztl rhetem el a bejv cselemeket! Ha egy fggvnynek csak process szekcija lenne, akkor az ilyen fggvnyt egy kln kulcsszval, a filter -rel is definilhatjuk, s akkor egyszerbb a szintaxis is. Pldul ha egy fggvnyem csak annyit csinlna, hogy a csben belrkez szmokat megduplzza, akkor az gy nzne ki:
[46] PS C:\ filter duplz >> { >> $_*2 >> } >> [47] PS C:\ 1,2,5,9 | duplz 2 4 10 18

Ltszik, hogy nincs szksg process kulcsszra, nincs felesleges bajuszpr. Viszont nem lehetsges sem begin, sem end szekci definilsa, gy ha ilyenre van szksgnk (valamilyen fggvnyvltozt kellene inicializlni, vagy az egsz folyamat vgn kellene mg valamit kitenni az outputra), akkor azt nem sszuk meg a function hasznlata nlkl.

1.8.8 Szkriptblokkok
A paramterek egyik nagyon rdekes fajtja a szkriptblokk. Enlkl csak nagyon nehzkesen, bonyolult programozssal lehetne bizonyos feladatokat fggvnyekkel megoldani, szkripblokkokkal viszont nagyon egyszeren. Nzznk erre egy pldt! Szeretnk egy ltalnosabb fggvnyt csinlni, az elz duplz helyett, amellyel tetszleges matematikai mveletet el tudok vgezni a csvezetken berkez szmokon. Ezt a mveletet

183

Fggvnyek
paramterknt szeretnm tadni a fggvnyemnek. Elsre elg bonyolultnak tnhet ilyesmit csinlni, de a szkriptblokkokkal pofonegyszer:
[49] PS C:\>filter mvelet ([scriptblock] $s) >> { >> &($s) >> } >> [50] PS C:\>1,2,3 | mvelet {$_*3} 3 6 9 [51] PS C:\>10,5,2 | mvelet {$_/2} 5 2,5 1

A fggvnyem defincija lthat a *49+-es sorban. Egy igazi paramtere van, ami [scriptblock] tpus, a msik paramtere majd a csbl jn, s majd a $_ vltozn keresztl tudjuk megfogni. Maga a fggvny trzse nhny karakter: &($s), azaz csak annyi trtnik, hogy a paramterknt tadott szkriptet meghvjuk az & opertorral. s ezzel el is kszlt a nagy tuds, univerzlis matematikai fggvnynk! Persze a hasznlathoz tudni kell, hogy olyan kifejezst kell neki tadni paramterknt, ami a $_ vltozval jtszadozik, de amgy tnyleg egyszer a dolog: az *50+-es sorban hromszoroz a fggvnyem, az [51]-es sorban pedig felez.

1.8.8.1 Anonim fggvnyek


Valjban egy szkriptblokk nem csak paramterknt szerepelhet, hanem nv nlkli fggvnyknt is felfoghatjuk ket. Nzzk a legegyszerbb csvezetkkel vgezhet mveletet, adjuk vissza egyesvel, vltoztats nlkl a csbe bemen elemeket. Ugye megtanultuk, hogy a cselemekhez a process szekciban frnk hozz a $_ vltozn keresztl. Els prblkozs:
[85] PS C:\old> 1, "kett", 3.04 | process {$_} Get-Process : A parameter cannot be found that matches parameter name '$_'. At line:1 char:27 + 1, "kett", 3.04 | process <<<< {$_}

Ez nem j, a csjel (|) utn valami kifejezst vr, valami vgrehajthat dolgot, mrpedig a process kulcssz, nem vgrehajthat kifejezs, ezrt a PowerShell itt ezt gy rtelmezi, hogy az a Get-Process lneve, annak pedig nincs $_ paramtere. Segtsnk neki, csinljunk belle szkriptet, pontosabban fogalmazva szkriptblokkot, amiben mr van rtelme a process kulcssznak:
[86] PS C:\old> 1, "kett", 3.04 | {process {$_}} Expressions are only permitted as the first element of a pipeline. At line:1 char:33

184

Elmlet
+ 1, "kett", 3.04 | {process {$_}} <<<<

Ez sem lett sokkal jobb, merthogy rdekes mdon a szkriptblokk sem vgrehajthat! Az majdnem ugyanolyan adatszersg, mint a vltoz, vagy akr egy szm. Segtsnk tovbb neki, tegynk el egy vgrehats-opertort:
[87] PS C:\old> 1, "kett", 3.04 | &{process {$_}} 1 kett 3,04

Na, itt mr jl lefutott. Kis talaktssal ugyanazt a funkcionalitst el tudjuk rni, mint az elz alfejezet duplz filter:
[88] PS C:\old> 1, "kett", 3.04 | &{process {$_*2}} 2 kettkett 6,08

Azaz az ilyen szkriptblokkokat felfoghatjuk gy is, mint anonim fggvnyek. Ilyeneket akkor rdemes hasznlni, ha nem akarom tbbszr felhasznlni a fggvnyt, hiszen akkor minek neki nevet adni?

1.8.9 Fggvnyek trlse, mdostsa


Ha egy fggvnyre nincs szksgem, akkor trlhetem is. Van ugye egy specilis PSDrive-om, a function:, ez tartalmazza az sszes fggvnyt s ennek klnbz elemeit ugyangy trlhetem, mint a fjlokat:
[33] PS I:\>Get-ChildItem function: CommandType ----------... Function Function Function Function Function Function Function Name ---bels kls fggvnytr els msodik titkos egymegegy Definition ---------param($b) Write-Host "Bels... param($p) function bels (... function global:els... "els" "msodik" function private:egymegegy... "1+1=2"

A lista vgn vannak az ltalam definilt fggvnyek, eltte gyri fggvnyek vannak, amelyeket mindjrt tnznk. Ha meg szeretnk szabadulni pldul az egymegegy fggvnyemtl, akkor hasznlhatom a remove-item cmdletet:
[34] PS I:\>Remove-Item function:egymegegy

185

Fggvnyek
Ha mr itt tartunk, akkor vajon PSDrive-kezel cmdletekkel is ltrehozhatok-e fggvnyt? Termszetesen igen, nzzk hogyan mkdik a new-item:
[35] PS C:\> new-item -path function: -name fv1 -value {"Fjlknt new-item-m el"} CommandType ----------Function Name ---fv1 Definition ---------"Fjlknt new-item-mel"

[36] PS C:\> fv1 Fjlknt new-item-mel

Mdostani a fggvnyeimet vagy megismtelt fggvnydefincival tudom, vagy a szintn a PSDrive-kezel set-item cmdlettel:
[37] PS C:\> Set-Item -path function:fv1 -Value {"Mdosts set-item-mel"} [38] PS C:\> fv1 Mdosts set-item-mel

Ht ez sikerlt! Akkor nzzk is meg, hogy amgy mire kpes a set-item, s az hogyan alkalmazhat a fggvnyekre! rdekes mdon a helpben a szintaxisban nincsen -options paramter:
[53] PS C:\old> (get-help set-item).syntax Set-Item [-path] <string[]> [[-value] <Object>] [-force] [-include <string[ ]>] [-exclude <string[]>] [-filter <string>] [-passThru] [-credential <PSCr edential>] [-whatIf] [-confirm] [<CommonParameters>] Set-Item [-literalPath] <string[]> [[-value] <Object>] [-force] [-include < string[]>] [-exclude <string[]>] [-filter <string>] [-passThru] [-credentia l <PSCredential>] [-whatIf] [-confirm] [<CommonParameters>]

Azonban a pldkban mr lthat, hogy van:


[54] PS C:\old> (get-help set-item).examples ... -------------------------- EXAMPLE 4 -------------------------C:\PS>set-item -path function:prompt -options "AllScope,ReadOnly" This command sets the AllScope and ReadOnly options for the "prompt" functi on. This command uses the Options dynamic parameter of the Set-Item cmdlet. The Options parameter is available in Set-Item only when you use it with t he Alias or Function provider.

A magyarzat is ott van legalul, hogy ez egy dinamikus paramter, s csak az Alias s a Function PSDrive hasznlatakor ltezik. Ezzel lehet belltani a fggvnyem ltha-

186

Elmlet
tsgt (scope) s hasonlan a vltozkhoz azt is, hogy a fggvnyem csak olvashat (azaz nem lehet fellrni), vagy konstans (mg a force kapcsolval sem lehet fellrni). Megjegyzs Sajnos elg esetleges ezen dinamikus paramterek fellelse a helpben, a cmdletek mellett. Taln eredmnyesebb, ha a providerek irnybl keressk meg ezeket. Pldul nzzk, hogy az Alias: providernek milyen dinamikus paramterei vannak:
[63] PS C:\> get-help -Category provider -name alias ... DYNAMIC PARAMETERS -Options <System.Management.Automation.ScopedItemOptions> Determines the value of the Options property of an alias. None No options. "None" is the default. Constant The alias cannot be deleted and its properties cannot be ch anged. Constant is available only when you are creating an alias. You cannot change the option of an existing alias to Constant. Private The alias is visible only in the current scope (not in chil d scopes). ReadOnly The properties of the alias cannot be changed, except by us ing the Force parameter. You can use Remove-Item to delete the alias. AllScope The alias is copied to any new scopes that are created. Cmdlets Supported: New-Item, Set-Item

Azaz tbb lehetsgnk is van arra, hogy milyen mdon kezeljk a fggvnyeinket, lneveinket. Megjegyzs Kzenfekvnek tnhetne, hogy a fggvnyobjektum definition tulajdonsgt rjuk t a fggvny mdostshoz. Ez azonban nem megy, mert az Read Only attribtum, azaz nem rhat t:
[41] PS C:\> (get-item function:fv1).definition = {"Mdosts a definition t ulajdonsgon keresztl"} "Definition" is a ReadOnly property. At line:1 char:25 + (get-item function:fv1).d <<<< efinition = {"Mdosts a definition tulaj

187

Fggvnyek
donsgon keresztl"}

A fenti pldban ltszik, hogy hibt a definition attribtum kzvetlen mdostsakor kaptam.

1.8.10 Gyri fggvnyek


A fggvnyeken bell akkor most nzzk meg azokat, amelyek mr az alap PowerShell krnyezetben is benne vannak. Ehhez nem kell a helpet hosszasan bjnunk, mivel mint ahogy korbban mr lthattuk egy kln meghajt van ltrehozva a fggvnyek elrsre s listzshoz, a function: PSDrive:
PS C:\> dir function: CommandType ----------Function Function Function Function Function Function Function Function Function Function Function ... Function Name ---prompt TabExpansion Clear-Host more help man mkdir md A: B: C: Z: Definition ---------'PS ' + $(Get-Location) + ... ... $spaceType = [System.Manag... param([string[]]$paths); ... param([string]$Name,[strin... param([string]$Name,[strin... param([string[]]$paths); N... param([string[]]$paths); N... Set-Location A: Set-Location B: Set-Location C: Set-Location Z:

Ezek kzl a bet: formtumak nagyon egyszerek, ezek csak annyit csinlnak, hogy az aktulis meghajtnak belltjk az adott betjellel jelzett meghajtt. A prompt fggvny automatikusan lefut, ha a konzolon j sort nyitunk. Ezt a fggvnyt is tetszlegesen tszerkeszthetjk, pldul n is itt a knyvben, hogy jobban lehessen hivatkozni a begpelt kdsorokra, beraktam egy sorszmot is szgletes zrjelek kz, amit radsul mindig nvelek eggyel. Szintn egy fggvnynek, a TabExpansion-nek ksznhetjk a TAB-ra trtn parancs-kiegsztst, ami akkor fut le automatikusan, amikor megnyomjuk a TAB billentyt. Ezt is testre szabhatjuk, ha nem talljuk elg okosnak. A tbbi fggvnynek is meg lehet nzni a defincis rszt, vagy akr jra lehet definilni ket az elz fejezetben megismert mdon. Megjegyzs A gyri fggvnyek tdefinilsa nem tarts, azaz ha becsukjuk a PowerShell ablakot, majd jra megnyitjuk, akkor visszall az eredeti fggvnydefinci. Tartss vltoztat-

188

Elmlet
sainkat gy tehetjk, ha profil fjlban definiljuk jra ezeket a fggvnyeket. Profilokrl a 2.1.1 Profilok fejezetben lesz sz.

189

Szkriptek

1.9 Szkriptek
A fggvnyek utn nzzk a szkripteket. Amint korbban mr emltettk a PowerShell elre elksztett (fjlba mentett) parancssorozatait hvjuk szkriptnek, amelyeket kzvetlenl is futtathatjuk, hasonlan a fggvnyekhez. Ebben a fejezetben azokkal a szerkezetekkel fogunk megismerkedni, amelyek br a fggvnyeknl is elfordultak, de hasznlatuk elssorban szkriptekben szoksos, br termszetesen minden begpelhet kzvetlenl a parancssorba is.

1.9.1 Szkriptek engedlyezse s indtsa


Ksztsk is el mindjrt els szkriptnket! Olyan fjlt kell ksztennk, amelynek kiterjesztse ps1, ez a PowerShell szkriptek alaprtelmezett kiterjesztse. Egyszerbb esetben mg a notepadra sincs szksg, ltrehozhatjuk a fjl kzvetlenl a PowerShellbl is:
PS C:\> "`"Hurr! Fut az els szkriptnk.`"" | Out-File elso.ps1

Ht ennyi. Lthat, hogy nincs szksg tl sok cicomra, amit a parancssorba berhat11 nnk, az minden tovbbi nlkl j szkriptnek is . Indtsuk is el gyorsan a szkriptet:
PS C:\> c:\elso.ps1 File C:\elso.ps1 cannot be loaded because the execution of scripts is disa bled on this system. Please see "get-help about_signing" for more details. At line:1 char:11 + c:\elso.ps1 <<<<

Hopp! A PowerShell olyan szkriptkrnyezet, amelyben nem engedlyezett a szkriptek futtatsa?! Termszetesen ez csak a secure-by-default jegyben belltott alaprtelmezs, a szkriptekkel szemben tanstott viselkedst a SetExecutionPolicy cmdlet segtsgvel szablyozhatjuk az albbi ngy llapot kzl a megfelel kivlasztsval:
PS PS PS PS C:\> C:\> C:\> C:\> Set-ExecutionPolicy Set-ExecutionPolicy Set-ExecutionPolicy Set-ExecutionPolicy -ExecutionPolicy -ExecutionPolicy -ExecutionPolicy -ExecutionPolicy Restricted AllSigned RemoteSigned Unrestricted

Az egyes paramterek jelentse a kvetkez: Restricted A PowerShell semmifle szkriptet nem futtathat (alaprtelmezett llapot).

11

A`" karakterek azrt kellenek, hogy a nyit s zr idzjel is bekerljn a fjlba. Az escape karakterek teljes listjt az about_escape_characters sgtma tartalmazza. (A ` karaktert magyar billentyzeten az AltGr+7 kombincival tudjuk berni.)

190

Elmlet
AllSigned csak digitlis alrssal elltott, megbzhatnak minstett szkriptek futtathatk. RemoteSigned ha a szkript mshonnan szrmazik (nem a loklis gpen kszlt, hlzati meghajtrl lett elindtva vagy az internetrl lett letltve), akkor alrtnak kell lennie, de a helyben kszlt szkriptek korltozs nlkl futtathatk. Unrestricted minden szkript korltozs nlkl futtathat. A fenti biztonsgi belltst a registry-n keresztl is bellthatjuk:

37. bra Execution Policy helye a registry-ben

Vagy bellthatjuk ezt az rtket kzpontilag is Group Policy segtsgvel is. Ehhez letlthet a Microsoft downloads oldalrl az Administrative templates for Windows PowerShell adm fjl. lltsuk be a megfelel biztonsgi szintet a PowerShell cmdlet segtsgvel (legalbb RemoteSigned) s prbljuk meg ismt az indtst! (Termszetesen csak rendszergazda jogosultsgok birtokban tudjuk ezt megtenni.) Az elbb taln tl sokat is gpeltnk a fjl a c: gykerben van, elg lesz csak ennyi:
PS C:\> elso.ps1 The term 'elso.ps1' is not recognized as a cmdlet, function, operable prog ram, or script file. Verify the term and try again. At line:1 char:8 + elso.ps1 <<<<

Ht ez nem elg! Rgi j UNIX / Linux szoks szerint a PowerShell nem prblja az aktulis mappban megtallni a megadott futtathat llomnyt, gy teljes tvonalat (relatv vagy abszolt) kell megadnunk. Teht pldul az albbi mdon indthatjuk el vgre a korbban ltrehozott szkriptet:
PS C:\> ./elso.ps1 Hurr! Fut az els szkriptnk.

Ha az aktulis mappban nem is, de a PATH krnyezeti vltozban felsorolt mappkban termszetesen prblkozik a PowerShell, ilyen esetben nem szksges tvonalat megadnunk. Sajnos mg mindig nem vagyunk teljesen kszen, mivel ha szkriptnk tvonala szkz karaktert is tartalmaz, jabb problmba tkznk. Hozzunk ltre egy jabb szkriptet a C:\Documents and Settings mappban!

191

Szkriptek
PS C:\> "`"Hurr! Fut a msodik szkriptnk.`"" | Out-File "c:\documents and settings\masodik.ps1"

Rutinosabb versenyz persze nem is prblkozik az idzjelek nlkli indtssal, ez azonban ebben az esetben kevs, mivel a parancs gy nem parancs s nem is tvonal, csak egy kznsges karakterlnc:
PS C:\> "c:\documents and settings\masodik.ps1" c:\documents and settings\masodik.ps1

Be kell vetnnk a korbban mr hasznlt futtat karaktert (&) az albbi mdon:


PS C:\> &"C:\Documents and Settings\masodik.ps1" Hurr! Fut a msodik szkriptnk.

Vgl foglaljuk ssze rviden mi is szksges ahhoz, hogy PowerShell szkripteket futtassunk: Be kell lltanunk a megfelel vgrehajtsi rendet (execution policy). Alaprtelmezs szerint a PowerShell nem futtat le semmifle szkriptet, akrhogy is adjuk meg az tvonalat. A szkript indtshoz adjuk meg annak teljes tvonalt, illetve ha a fjl az aktulis mappban van, hasznljuk a .\ jellst. tvonal nlkl is elindthatjuk a szkriptet, ha olyan mappban van, amely szerepel a Windows keressi tvonaln (PATH krnyezeti vltoz). Ha az tvonal szkzket tartalmaz, tegyk idzjelek kz s rjuk el a futtat karaktert (&).

A korbbi szoksokkal (cmd, vbs, stb.) ellenttben (termszetesen szintn biztonsgi okokbl) maga a szkriptfjl kzvetlenl nem indthat el a shellen kvl, mivel a ps1 kiter12 jeszts fjlokat alaprtelmezs szerint a notepad.exe nyitja meg . Hogy lefuttathassuk szkriptnket, a powershell.exe-t kell elindtanunk (keressi tvonalon van), amelynek paramterknt adhatjuk t futtatand szkriptfjl nevt. A cmd.exe-bl pldul az albbi mdon indthatjuk el a fenti szkriptet (a -noexit kapcsol hatsra a powershell.exe nem ll le a szkript lefuttatsa utn, megfigyelhet, hogy a PowerShellre jellemz promptot kapunk vissza):
C:\>powershell -noexit c:\elso.ps1 Hurr! Fut az els szkriptnk. PS C:\>

Prbljuk meg hasonl mdon elindtani a masodik.ps1 szkriptet is! Nyilvn itt is kell a futtat karakter:

12

Persze ez mdosthat az sszerendels megvltoztatsval.

192

Elmlet
C:\>powershell -noexit &"c:\Documents and Settings\masodik.ps1" Windows PowerShell Copyright (C) 2006 Microsoft Corporation. All rights reserved. PS C:\>

Ugyan lthat a promptbl, hogy a cmd shell talakult PowerShell, de sajnos a szkriptnk gy sem futott le. Mg egy trkkre van szksg, a cmd.exe ell el kell rejteni a PowerShellnek szl & jelet egy jabb, kls idzjelprral:
C:\>powershell -noexit "& 'c:\Documents and Settings\masodik.ps1'" Hurr! Fut a msodik szkriptnk. PS C:\>

1.9.2 Vltozk kiszippantsa a szkriptekbl (dot sourcing)


A fggvnyeknl mr ltott, de a scripteknl mg gyakrabban alkalmazott dotsourcing lehetsget eleventsk fel ismt. Ehhez hasonl szolgltatssal korbban (cmd, VBScript, stb.) egyltaln nem tallkozhattunk. Ksztsk el a kvetkez szkriptet, akr a notepad segtsgvel:
$a = $b = $c = "`$c "egyik-" "msik" $a + $b = $c"

Mentsk el a fjlt, mondjuk a c:\scripts mappba source.ps1 nven! Ezutn futtassuk le az elkszlt szkriptet, ami kirja a $c vltoz tartalmt, majd a szkript lefutsa utn nzzk meg, milyen rtk van a $c vltozban! A helyes tipp az, hogy semmilyen. Ez gy termszetes, a szkript s a konzol kln munkamenetnek tekintend, a szkript a konzol gyerekkrnyezete, a konzol ezrt nem ri el a gyereke adatait.
PS $c PS PS C:\> c:\scripts\source.ps1 = egyik-msik C:\> $c C:\>

Eddig teht tulajdonkppen semmi meglept nem tapasztaltunk, inkbb az lett volna furcsa, ha nem gy van. Ha azonban egy specilis mdon indtjuk el szkriptnket, akkor vratlan jelensg szemtani lehetnk. Indtsuk el most a szkriptet gy, hogy a parancsot egy pont s egy szkz karakterrel kezdjk.

193

Szkriptek
PS C:\> . c:\scripts\source.ps1 $c = egyik-msik PS C:\> $c egyik-msik

Hopp! A konzol munkamenet tudja, hogy mi volt a vltoz rtke a szkriptben, ami mr rges-rg vget rt. Ez a jelensg a fggvnyeknl mr megismert dotsourcing (1.8.4 Fggvnyek lthatsga, dotsourcing fejezet), amelynek hatsra a szkript valamennyi vltozja az t meghv krnyezet vltozjv alakul. Jelen esetben globliss vlt, vagyis minden munkamenet (gy a konzol s ms szkriptek is) elrhetik, felhasznlhatjk s megvltoztathatjk a bennk trolt rtkeket mg akkor is, amikor az ket ltrehoz munkamenet (vagyis a szkript) mr bezrult. Taln ez mr nyilvnval, hogy milyen hasznos ez a lehetsg, hiszen gy a szkript ltal lekrdezett, ltrehozott adatszerkezetek (pldul egy adatbzisbl, vagy az Active Directorybl szrmaz adathalmaz) a szkript lefuttatsa utn interaktv zemmdban is listzhatk, feldolgozhatk. Vagyis egyszerre lvezhetjk a szkript- s az interaktv zemmd elnyeit. Ha egy feladat egyik rszt inkbb szkriptknt rdemes elkszteni, de ms rszeknl egyszerbb az interaktv zemmd hasznlata, akkor btran hasznlhatjuk ezt a lehetsget, mindent olyan mdon vgezhetnk el, ahogy az a legkedvezbb..

1.9.3 Paramterek tvtele s a szkript ltal visszaadott rtk


Szkriptjeinknek is lehetnek paramterei, melyeket hasonlan a fggvnyekhez - az $args vltozban rhetjk el. A $args egy tmb, amelybe tetszs szerinti tpus rtkek kerlhetnek, a megjelen tpus a bert rtktl fgg, ezrt knyesebb esetekben clszer lehet a paramterek szmn kvl azok tpust is ellenrizni a tovbbi tnykeds eltt. Az albbi szkriptben csak a megfelel szm paramter megltt ellenrizzk:
if ($args.Length -ne 3) { Write-Error "A szkript csak 3 paramterrel indthat!" return "Hibs futs!" } Write-Host $args.GetType() foreach($arg in $args) { Write-Host $arg Write-Host $arg.GetType() } return "J futs!"

Ha a paramtereket trol tmb nem hrom elembl ll, akkor hibazenetet runk ki, s a return kulcssz utn megadjuk a szkript ltal visszaadott rtket (a return utni

194

Elmlet
rsz mr nem fut le). Paramter nlkli indtsi ksrlet esetn a kvetkez hibazenet jelenik meg:
PS C:\> ./parameter.ps1 C:\parameter.ps1 : A szkript csak 3 paramterrel indthat! At line:1 char:15 + ./parameter.ps1 <<<< Hibs futs!

Ha megvan mindhrom paramter, akkor visszarjuk azok tpust s rtkt a kpernyre, a szkript pedig egy msik rtket fog visszaadni.
PS C:\> ./parameter.ps1 egy kett hrom System.Object[] egy System.String kett System.String hrom System.String J futs!

A visszaadott rtk a fenti esetekben egyszeren a kpernyre kerlt, de ez nem igazn erre val. Az rtk segtsgvel a hv szkript kaphat informcit az elindtott szkript belsejben trtntekrl. Termszetesen semmi akadlya nincsen tbb rtk visszaadsnak sem (br csak egyetlen return futhat le), szkriptnk egy tmb elemeinek kpben tetszleges szm s tpus rtket is visszaadhat.
PS C:\> $vissza = ./parameter.ps1 egy kett hrom System.Object[] egy System.String kett System.String hrom System.String PS C:\> $vissza J futs!

Termszetesen nem csak az $args vltoz ll rendelkezsnkre, hanem hasznlhatunk explicit paramterdefincit is. Miutn a szkriptnek nincs sajt, bels neve, hanem csak a fjlnak, amibe rakjuk, ezrt a paramtereit se tudjuk a nem ltez neve mellett felsorolni, csak kln param kulcssz megadsval:
param ($a, $b) $a / $b

Elmentetem a fenti, nagyon bonyolult szkriptet oszts.ps1 nven, s meg is hvhatom, hasonlan egy fggvnyhez:

195

Szkriptek
[6] PS C:\old>.\oszts.ps1 20 4 5 [7] PS C:\old>.\oszts.ps1 b 3 a 27 9

Akr a hely szerinti, akr a nv szerinti paramtertads is mkdik. Termszetesen a szkript ltal visszaadott eredmnyt felhasznlhatjuk rtkads sorn is, megint csak ugyangy, mintha fggvny lenne:
[8] PS C:\old>$eredmny = .\oszts 50 11 [9] PS C:\old>$eredmny 4,54545454545455

1.9.4 Szkriptek rsa a gyakorlatban


Szkripteket a gyakorlatban ritkn runk magval a PowerShell konzolablakon, mg csak nem is a Notepad az idelis eszkz, hanem valamilyen szkriptszerkeszt. A 1.3 Segdprogramok fejezetben mr emltett PowerGUI Script Editora taln a legegyszerbb ilyen jelleg eszkz, ami radsul pont eleget tud ahhoz, hogy hatkonyan hasznlhassuk. Radsul ingyenes!

1.9.4.1 PowerGUI Script Editor


A korbbi oszts szkriptpldt kicsit mg kiegsztettem, mindez gy nz ki a PowerGUI Script Editorban:

38. bra Szkriptem a PowerGUI Script Editorban

Sajnos a knyv nem sznes, gy nem lthat a fenti bra szneinek kavalkdja, de kln sznnel jelzi a program a kulcsszavakat, cmdleteket, vltozkat, megjegyzseket, opertorokat. Az eszkzsorban lthat Start Debugging (F5) gombbal lehet futtatni ott helyben a szkriptet. Az eszkzsorban, a beviteli mezben lehet paramtereket is tadni (a kpen ez

196

Elmlet
most 15 7). A futs sorn generld output kikerl a jobb als ablakrszbe s a bels vltozk tartalma is azonnal megtekinthet a baloldali rszben. A jobb szemlltethetsg kedvrt mg egy felesleges $c vltozt is felvettem, hogy lthat legyen az, ahogyan a Locals rszben a vltozkban trolt objektumok tulajdonsgai is azonnal elrhetk s kiolvashatk, nem kell llandan get-member-t futtatni.

1.9.4.2 Megjegyzsek, kommentezs (#)


A fjlba mentett parancssorozatainkat rdemes kommentekkel elltni, hogy ha pr hnap utn nyitjuk meg ket, akkor is rtsk, hogy mit csinl a szkript, a paramterek, vltozk hogyan hasznlhatk. A komment jele a # jel.
[10] PS C:\old>$a = 5 #rtkads [11] PS C:\old>$a 5

A fejleszts sorn a megjegyzseket, kommenteket arra is felhasznlhatjuk, hogy klnbz kdvltozatok tesztelsekor az egyik vltozatot kikommentezzk, mg a msikat teszteljk, aztn meg cserlnk, s megnzhetjk, hogy a msik vltozat hogyan mkdik. Vagy az is gyakori, hogy a szkriptnk kifejlesztse sorn jval tbb tmeneti vltoz s llapot rtkt ratjuk ki, mg a vgleges verzinl ezt mr nem szeretnnk. Ilyenkor szintn jl jn a kikommentezsi lehetsg. Kitrlni nem akarjuk ezeket a kiratsi lehetsgeket, mert htha jl jnnek majd a szkript tovbbfejlesztsekor. Ezt a gyors ki-be kommentezst jl tmogatja a PowerGUI Script Editora, az eszkzsorban tallhat gombokkal egy kattintssal tudjuk ezt ki-be kapcsolni, radsul tbb sor kijellsvel is mkdik. Sajnos a # jel hatsa csak az adott sorra rvnyes a sor vgig. Ha tbbsoros kommenteket szeretnnk beszrni, akkor vagy minden sort kln elltunk ilyen jellel, vagy esetleg hasznlhatjuk a here string formtumot, mghozz semmiv konvertlva:
[void] "@ nagyon hossz komment igazbl string de nem hajtdik vgre, mert a nihilbe kldm @"

1.9.5 Adatbekrs (Read-Host)


A szkriptek esetben gyakori, hogy egy kis interakcit vrunk el tlk, azaz ne kelljen mindig parancssorban felparamterezni ket, hanem krdezzk meg tlnk, hogy mit szeretnnek. Az els pldban egy kis interaktv vezrlst mutatok be egy kis menstruktra segtsgvel:

197

Szkriptek
do { Write-Host "=========================================================" Write-Host "0 - Folyamatok listzsa" Write-Host "1 - Szolgltatsok listzsa" Write-Host "2 - Folyamat indtsa" Write-Host "3 - Folyamat lelltsa" Write-Host "9 - Kilps" $v = Read-Host Write-Host "=========================================================" switch ($v) { "0" {Get-Process} "1" {Get-Service} "2" {&(Read-Host "Folyamat neve")} "3" {Stop-Process -name (&Read-Host "Folyamat neve")} "9" {break} default {Write-Host "rvnytelen billenty!";break } } } while ($v -ne "9")

A szkript egy j kis htul tesztel do-while ciklus, ami egszen addig fut, amg a kzptjon tallhat Read-Host cmdletnek nem adunk t egy 9-est. Ha 0, 1, 2, 3 rtkek valamelyikt adjuk be neki, akkor egy switch kifejezs a megfelel PowerShell cmdletet futtatja le. Radsul bizonyos parancsok mg tovbbi paramtert ignyelnek, gy azokat egy jabb Read-Host kri be. A Read-Host az nem billenty letsre vr, hanem komplett sort kr be Enter letsig, s addig vr, amg ezt meg nem kapja. A fenti pldban lthat, hogy nem muszj a Read-Host kimenett vltozba tlteni, azt azon melegben is felhasznlhatjuk. Pldul a 2-es vlasztsval rgtn meghvjuk azt, amit begpeltnk:
&(Read-Host "Folyamat neve")

Ugye itt megint hasznljuk a vgrehajtats opertort, az & jelet. A Read-Host-nak van egy szveg paramtere, ezt teszi fel krdsknt a sor beadsra val vrakozs eltt.

1.9.6 Szkriptek digitlis alrsa


Lttuk a fejezet elejn, hogy a szkriptek futtatst engedlyezni kell. Ha a legbiztonsgosabb futtatsi hzirenddel dolgozunk, akkor csak olyan szkript futhat, amelyik digitlisan al van rva, s az alrst igazol tanstvnyt az adott gp elismeri biztonsgos tanstvnynak. Na de honnan lesz neknk ilyen tanstvnyunk? Az els lehetsg, hogy van mr kiptett PKI infrastruktrnk, amelyben van code signing tpus tanstvnyt kiosztani kpes CA kiszolgl. Innen ignyelni kell ilyen tanstvnyt, s ezzel fogunk tudni dolgozni a ksbb lert mdon.

198

Elmlet
A problematikusabb helyzet az, amikor nincs ilyen PKI infrastruktrnk. Pldul n otthon szeretnk alrt szkripteket ltrehozni, hogy tesztelhessem a mkdsket. Ebben az esetben ltrehozhatok u.n. nalrt tanstvnyt, amelyet csak azok a gpek fognak elismerni hitelesnek, ahova manulisan teleptem azokat. Nzznk ennek lpseit! Honnan szedek n nalrt tanstvnyt? Direkt ilyen tesztelsi clokra van a .NET Framework Software Development Kit-ben (letlthet: http://msdn2.microsoft.com/en-us/netframework/aa731542.aspx) egy makecert.exe segdprogram, amely erre kpes. Ez egy parancssori eszkz, nzzk meg a meghvsnak paramtereit:
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0>"C:\Program Files\Micros oft Visual Studio 8\SDK\v2.0\Bin\makecert.exe" -! Usage: MakeCert [ basic|extended options] [outputCertificateFile] Extended Options -sc <file> Subject's certificate file -sv <pvkFile> Subject's PVK file; To be created if not present -ic <file> Issuer's certificate file -ik <keyName> Issuer's key container name -iv <pvkFile> Issuer's PVK file -is <store> Issuer's certificate store name. -ir <location> Issuer's certificate store location <CurrentUser|LocalMachine>. Default to 'CurrentUser ' -in <name> Issuer's certificate common name.(eg: Fred Dews) -a <algorithm> The signature algorithm <md5|sha1>. Default to 'md5' -ip <provider> Issuer's CryptoAPI provider's name -iy <type> Issuer's CryptoAPI provider's type -sp <provider> Subject's CryptoAPI provider's name -sy <type> Subject's CryptoAPI provider's type -iky <keytype> Issuer key type <signature|exchange|<integer>>. -sky <keytype> Subject key type <signature|exchange|<integer>>. -l <link> Link to the policy information (such as a URL) -cy <certType> Certificate types <end|authority> -b <mm/dd/yyyy> Start of the validity period; default to now. -m <number> The number of months for the cert validity period -e <mm/dd/yyyy> End of validity period; defaults to 2039 -h <number> Max height of the tree below this cert -len <number> Generated Key Length (Bits) -r Create a self signed certificate -nscp Include netscape client auth extension -eku <oid[<,oid>]> Comma separated enhanced key usage OIDs -? Return a list of basic options -! Return a list of extended options

Nem egyszer, de kezdjnk neki. Els lpsknt a makecert-et r kell brni, hogy tanstvnykioszt hatsg szerept vegye fel:

199

Szkriptek
makecert -n "CN=PowerShell Sajat Root CA" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv c:\cert\root.pvk c:\cert\root.cer -ss Root -sr localMachine

Nzzk az egyes paramterek jelentst: Paramter -n "CN=PowerShell Sajat Root CA" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv c:\cert\root.pvk c:\cert\root.cer -ss Root -sr localMachine Jelents A tanstvnykiosztm neve A digitlis alrs algoritmusa A kiosztand tanstvnyok fajtja, ez a szm jelenti a Code signing lehetsget nalrt legyen a tanstvnykioszt tanstvny A tanstvnykioszt tanstvnyainak trolsi helye fjl szinten A tanstvnykioszt tanstvnyainak trolsi helye a tanstvnytrban Mghozz a helyi gpen

Amikor ezt a parancsot futtatom, akkor ktszer is megjelenik egy jelszbekr ablak, ami a privt kulcsok kezelsnek vdelmt szolglja. Az els esetben adjuk meg a privtkulcshoz val hozzfrs jelszavt:

39. bra Makecert.exe futtatsa tanstvnykioszt szerep cljra

A msodik esetben pedig mr hasznlja is a httrben a makecert ezt a privt kulcsot, ezrt kri be az elbb megadott jelszt:

200

Elmlet

40. bra Jelszbeads a privt kulcshoz val hozzfrskor

Teht idig azt csinltuk, hogy ltrehoztunk egy tanstvnykioszt nalrt tanstvnyt, amellyel al lesznek rva az ezutn legenerlhat, immr tnylegesen kdalrsra sznt tanstvnyaink. Hozzunk is mindjrt ltre egy ilyet:
makecert -pe -n "CN=Soos Tibi PS Guru" -ss PSCS -a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv c:\cert\root.pvk -ic c:\cert\root.cer

Nzzk ezeknek a jelentst: Paramter -pe -n "CN=Soos Tibi PS Guru" -ss PSCS Jelents Exportlhat privt kulcsot hoz ltre (exportlssal biztonsgba tudjuk helyezni) A kdalr tanstvnyon szerepl nv A tanstvny trolsnak a helye, n itt egy j trolt hoztam ltre, ha szemlyes trolba szeretnm berakni, akkor arra a My nvvel lehet hivatkozni Digitlis alrs algoritmusa Tanstvny clja (code signing) A kioszt hatsg privt kulcsa Az n tanstvnyomat viszonthitelest tanstvny

-a sha1 -eku 1.3.6.1.5.5.7.3.3 -iv c:\cert\root.pvk -ic c:\cert\root.cer

Miutn ezen parancs futtatsa sorn is hasznljuk az els lpsben ltrehozott privt kulcsot, gy jra meg kell adni az ott megadott jelszt:

41. bra A kdalr tanstvny generlsa sorn megjelen jelszbekr

201

Szkriptek
Ha ezt is sikeresen lefuttattam, akkor megnzhetem, hogy a tanstvnytramban tnyleg ott van-e a kdalr tanstvny:

42. bra Kdalr tanstvnyom a tanstvnytrban

Akkor most mr van alkalmas kdalr tanstvnyom. Itt csatlakoznak be azok az olvask, akiknek van igazi PKI infrastruktrjuk, s egy norml tanstvnykioszttl szereztek kdalr tanstvnyt. Most lehet alrni a szkriptemet. Elsknt ragadjuk meg az alrsra sznt tanstvnyunkat (itt nagyon nagy segtsg a TAB-kiegszts, azaz nem kell azt a hossz szmsort begpelni, ha a knyvtrra rlelnk, akkor elg a TAB-bal lptetni):
[9] PS C:\old> $signcert = (get-item cert:\CurrentUser\PSCS\8ED2798A04D5F794 DA6C8C3C167EB033CB8BE6C2) [10] PS C:\old> $signcert Directory: Microsoft.PowerShell.Security\Certificate::CurrentUser\PSCS Thumbprint ---------8ED2798A04D5F794DA6C8C3C167EB033CB8BE6C2 Subject ------CN=Soos Tibi PS Guru

s akkor kvetkezzen a lnyeg, rjuk al a szkriptet az elbb betlttt tanstvnnyal:


[11] PS C:\old> Set-AuthenticodeSignature safe.ps1 $signcert Directory: C:\old SignerCertificate ----------------8ED2798A04D5F794DA6C8C3C167EB033CB8BE6C2 Status -----Valid Path ---safe.ps1

lltsuk t a vgrehajtsi hzirendet gy, hogy mindenkppen megkvetelje az alrst, s futtatom a safe.ps1 szkriptemet:

202

Elmlet
[12] PS C:\old> Set-ExecutionPolicy allsigned [13] PS C:\old> .\safe.ps1 Do you want to run software from this untrusted publisher? File C:\old\safe.ps1 is published by CN=Soos Tibi PS Guru and is not trusted on your system. Only run scripts from trusted publishers. [V] Never run [D] Do not run [R] Run once [A] Always run [?] Help (default is "D"):a Titkos script!

Miutn ez egy nalrt tanstvnyon alapul tanstvny, gy a rendszer rkrdez, hogy elfogadom-e hitelesnek? n azt vlaszoltam, hogy igen, st, minden alkalommal fogadja el ezt hitelesnek (Always) innentl kezdve. Nzzk meg, hogy hogyan is nz ki egy ilyen alrt szkript:

43. bra Az elektronikusan alrt szkript

Az eredeti szkriptem nagyon egyszer volt, csak annyit csinlt, hogy kirta Titkos script!. Ez olvashat is az els sorban. Ami utna ll az az elektronikus alrs. Ha brmit mdostok ebben a szkriptben, akr egy karaktert is, s futtatni akarom, akkor a kvetkez hibajelzst fogom kapni:
[14] PS C:\old> .\safe.ps1 File C:\old\safe.ps1 cannot be loaded. The contents of file C:\old\safe.ps1 may have been tampered because the hash of the file does not match the has h stored in the digital signature. The script will not execute on the syste m. Please see "get-help about_signing" for more details.. At line:1 char:10 + .\safe.ps1 <<<<

203

Szkriptek
Ha srtetlen a szkriptem, akkor ellenrizhetem, hogy ki is rta al, azaz rtelmeztethetem azt a sok zrs karaktert a szkriptem vgn:
[17] PS C:\old> Get-AuthenticodeSignature C:\old\safe.ps1 | fl SignerCertificate : [Subject] CN=Soos Tibi PS Guru [Issuer] CN=PowerShell Sajat Root CA [Serial Number] 123B087E7C0B44934585DF9A4B374842 [Not Before] 2008.04.17. 21:57:56 [Not After] 2040.01.01. 0:59:59 [Thumbprint] 8ED2798A04D5F794DA6C8C3C167EB033CB8BE6C2 TimeStamperCertificate Status StatusMessage Path : : Valid : Signature verified. : C:\old\safe.ps1

1.9.7 Vgrehajtsi preferencia


Beszltnk az lnevekrl, cmdletekrl, fggvnyekrl, szkriptekrl. Lttuk azt is, hogy a PowerShell ugyangy vgrehajtja az elrsi ton tallhat futtathat llomnyokat, mint ahogy a hagyomnyos parancssor. Azt is lttuk, hogy elnevezsek tekintetben elg szabad a PowerShell, nagyon kevs megszorts van a neveket illeten, gy pldul lehet egyforma neve egy ltalunk ltrehozott fggvnynek s aliasnak, mint egy meglev cmdletnek. Pldul elnevezhetek egy fggvny gy is:
[14] PS C:\old> function script.ps1 {"Ez most fggvny"} [15] PS C:\old> script.ps1 Ez most fggvny

Annak ellenre is, hogy ugyanilyen nvvel van nekem egy szkriptem is, radsul ppen az aktulis knyvtrban:
[16] PS C:\old> Get-Content script.ps1 "Ez most a szkript"

204

Elmlet
Ennek ellenre a *15+-s sorban a script.ps1 bersra nem a szkriptem, hanem a fggvnyem futott le. s ez mg nem elg, ugyanilyen nvvel ltrehozhatok egy lnevet is:
[17] PS C:\old> New-Alias script.ps1 get-command

Ha most futtatom a script.ps1-et, akkor az alias fut le:


[18] PS C:\old> script.ps1 CommandType ----------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet ... Name ---Add-Content Add-History Add-Member Add-PSSnapin Clear-Content Definition ---------Add-Content [-Path] <Strin... Add-History [[-InputObject... Add-Member [-MemberType] <... Add-PSSnapin [-Name] <Stri... Clear-Content [-Path] <Str...

Hogyan lehet mgis a szkriptet lefuttatni? Ht pldul gy:


[19] PS C:\old> &(get-item script.ps1) Ez most a szkript

Hogyan tudom a fggvnyt futtatni? Hasonl logikval, mint a szkriptet, csak ms a trolsnak helye:
[20] PS C:\old> &(get-item function:script.ps1) Ez most fggvny

Nzzk sszefoglalva a vgrehajtsi preferencit: 1. Alias 2. Fggvny 3. Cmdlet 4. Futtathat fjlok (exe, com, stb.) 5. Szkriptek 6. Kiterjeszts alapjn a hozz tartoz alkalmazs futtatsa Azaz nagyon vigyzni kell, hogy milyen nven hozunk ltre lneveket s fggvnyeket, mert ezek a vgrehajtsi preferenciban megelzik a cmdleteket is. Pldul egy gonosz szkript tdefinilhatja a gyri cmdleteket ugyanolyan nev lnevekkel vagy fggvnyekkel s a PowerShell teljesen msknt kezd el viselkedni, mint ahogy vrjuk.

205

Fontosabb cmdletek

1.10 Fontosabb cmdletek


A PowerShell fbb nyelvi elemeit ttekintettk az elz fejezetekben, most szemelgessnk a legfontosabb cmdletek kztt. Ezek a cmdletek annyira ltalnosan hasznlhatk, hogy szinte nyelvi elemknt lehet ket tekinteni, ezrt mindenkppen itt, az elmleti rszben kell ket trgyalni.

1.10.1 Csvezetk feldolgozsa (Foreach-Object) jra


Ugyan mr volt sz a ForEach-Object cmdletrl a 1.7.5 ForEach-Object cmdlet fejezetben, de most mr ismerjk a fggvnyeket s filtereket, gy tisztban vagyunk azzal, hogy hogyan trtnik a csvezetken rkez objektumok feldolgozsa paramterknt tadott szkriptblokkok segtsgvel. Tulajdonkppen mr mi magunk is meg tudnnk rni egy ForEach-Object cmdlethez hasonl mkds fggvnyt, de mivel ezt olyan gyakran hasznlnnk, hogy rdemesebb volt ez gyorsabban lefut, natv PowerShell parancsknt implementlni. Ennek ellenre elg tanulsgos lenne egy ilyen fggvnyt rni. Ehhez elszr nzzk meg a ForEach-Object szintaxist:
[1] PS C:\> (get-help foreach-object).syntax ForEach-Object [-process] <ScriptBlock[]> [-inputObject <psobject>] [-begin <scriptblock>] [-end <scriptblock>] [<CommonParameters>]

Most a CommonParameters rszt kihagyom, de a tbbit n is definilom a fggvnyemben:


[2] PS C:\> function sajt-foreachobject ([scriptblock] $process = $(throw " Ktelez!"), [PSObject] $inputObject, [scriptblock] $begin, [scriptblock] $e nd) >> { >> begin >> { >> if($inputObject) >> { >> $inputObject | sajt-foreachobject -p $process -b $begin -e $end >> return >> } >> if($begin) {&$begin} >> } >> process {&$process} >> end >> { >> if($end) {&$end} >> } >> } >>

206

Elmlet
Itt a $process paramter ktelezen kitltend, hibt ad a fggvnyem, ha ez hinyzik:
[3] PS C:\> 222 | sajt-foreachobject Ktelez! At line:1 char:63 + function sajt-foreachobject ([scriptblock] $process = $(throw <<<< "Kt elez!"), [PSObject] $inputObject, [scriptblock] $begin, [scriptblock] $end )

Ha ez helyesen van kitltve, akkor akr csvezetkkel is jl mkdik:


[4] PS C:\> 1,3,44, "q" | sajt-foreachobject {$_*3} 3 9 132 qqq

De mkdik gy is, ha nem belecsvezzk a feldolgozand objektumot, hanem -inputobject paramterknt tadjuk:
[5] PS C:\> sajt-foreachobject {$_*2} -i 654 1308

Ehhez a fggvnydefinciban egy kicsit trkkztem, ha ez utbbi mdszerrel akarnk objektumot tadni, akkor nem lenne $_ vltoz, ezrt a begin szekciban meghvom rekurzv mdon a fggvnybl sajt magt, immr csvezs mdszerrel. Azrt, hogy a rekurzv hvsbl visszatrve ne fusson le mg egyszer a fggvnyem, ezrt ott egy return-nel kilpek.

1.10.2 A csvezetk elgaztatsa (Tee-Object)


A Tee-Object cmdlet a csvezetk megcsapolsra szolgl. Tetszs szerinti pontra beillesztve az arra jr objektumkupacot egy vltozba vagy egy megadott fjlba rja, de ekzben vltozatlan formban tovbbkldi a csvn is, a kvetkez parancs pontosan gy kapja meg az objektumokat, mintha a Tee-Object ott sem lett volna. Az albbi parancs pldul a c: meghajt mappalistjt krdezi le, a Tee-Object ennek szveges megfeleljt belerja a c:\dir.txt fjlba, a lekrdezett eredeti objektumokat pedig tovbbadja a Where-Object cmdletnek:
PS C:\> Get-ChildItem | Tee-Object -FilePath c:\dir.txt | Where-Object {$_.Name -eq "Windows"} Directory: Microsoft.PowerShell.Core\FileSystem::C:\ Mode ---d---LastWriteTime ------------2007.07.16. 22:42 Length Name ------ ---WINDOWS

207

Fontosabb cmdletek
Leggyakrabban a fentihez hasonl esetekben hasznljuk ezt a cmdletet, azaz amikor a kimenetet ktfel szeretnnk gaztatni: egyrszt pldul naplzsi cllal beirnytjuk a csvezetk tartalmt egy fjlba, msrszt valami egyb tevkenysget is vgznk ezekkel az objektumokkal.

1.10.3 Csoportosts (Group-Object)


A Group-Object cmdlet segtsgvel egy (vagy tbb) megadott tulajdonsg rtke szerint csoportosthatunk objektumokat. A csoportokba az azonos tulajdonsgrtkkel rendelkez objektumok kerlnek.

Feladat: Ksztsnk listt, amely a fut s a lelltott szolgltatsok szmt tartalmazza!

A szolgltatsokat lekrdez Get-Service kimenett a Group-Object-nek kell megkapnia, paramterknt pedig meg kell adnunk, hogy melyik tulajdonsg rtkei szerint akarjuk elvgezni a csoportostst. Az alaprtelmezett listban is szerepel a Status tulajdonsg, a feladat szerint ezt kell majd megadnunk, de termszetesen brmelyik, a listban szerepl egyb tulajdonsg szerint csoportosthatnnk:
PS C:\> get-service | group-object -property status Count ----42 59 Name ---Stopped Running Group ----{Alerter, AppMgmt, aspnet_state, CiSvc...} {ALG, AudioSrv, BITS, Browser...}

Feladat: Ksztsnk listt, amely a PowerShell sgtmval rendelkez, klnfle tpus elemeinek darabszmt tartalmazza!

A fenti feladatban tulajdonkppen semmi jdonsg nincsen a megelzhz kpest, csak azrt kerlt ide, mert igen szp pldt ad a PowerShell objektumkezelsnek szinte tkletesen egysges voltra. Mindegy, hogy rendszerszolgltatsokrl, vagy a PowerShell sgtminak listjrl van sz, a szksges parancsok gyakorlatilag azonosak, a tkletesen klnbz tpus adatoktl fggetlenl. A megolds:
PS C:\> get-help * | group-object -property category Count ----102 129 7 56 Name ---Alias Cmdlet Provider HelpFile Group ----{ac, asnp, clc, cli...} {Get-Command, Get-Help, Get-History, In... {Alias, Environment, FileSystem, Functi... {about_alias, about_arithmetic_operator...

Ha valakinek ez sem elg, akkor mg olyat is lehet csinlni a Group-Object segtsgvel, hogy egyszerre tbb szempont szerinti csoportot is ltrehozhatunk:

208

Elmlet
[18] PS C:\> get-process | Group-Object -Property processname, company Count ----1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 8 1 1 1 1 1 1 1 Name ---alg, Microsoft Corpora... ATKOSD, csrss daemon, DT Soft Ltd explorer, Microsoft Co... GoogleDesktop, Google gStart, GARMIN Corp. HControl, hh, Microsoft Corporation Idle inetinfo, Microsoft Co... install, Microsoft Cor... lsass, Microsoft Corpo... msiexec, Microsoft Cor... msmsgs, Microsoft Corp... NetSDK64setup, Microso... NMSAccessU nvsvc64, NVIDIA Corpor... powershell, Microsoft ... Quest.PowerGUI.ScriptE... RTHDCPL, Realtek Semic... rundll32, Microsoft Co... scardsvr, Microsoft Co... services, Microsoft Co... sm56hlpr, Motorola Inc. smss, Microsoft Corpor... splwow64, Microsoft Co... spoolsv, Microsoft Cor... StkCSrv, Syntek Americ... svchost, Microsoft Cor... System vmh, Microsoft Corpora... vssrvc, Microsoft Corp... winlogon WINWORD, Microsoft Cor... wmiprvse, Microsoft Co... wscntfy, Microsoft Cor... Group ----{alg} {ATKOSD} {csrss} {daemon} {explorer} {GoogleDesktop, GoogleDesktop} {gStart} {HControl} {hh} {Idle} {inetinfo} {install} {lsass} {msiexec} {msmsgs} {NetSDK64setup} {NMSAccessU} {nvsvc64} {powershell} {Quest.PowerGUI.ScriptEditor} {RTHDCPL} {rundll32, rundll32} {scardsvr} {services} {sm56hlpr} {smss} {splwow64} {spoolsv} {StkCSrv} {svchost, svchost, svchost, svchost...} {System} {vmh} {vssrvc} {winlogon} {WINWORD} {wmiprvse} {wscntfy}

A fenti paranccsal a processzek neve s gyrtjuk alapjn egyttesen csoportostottam a fut folyamatokat. Ez nem igazi ktszint csoportosts, hanem kpez egy ltszlagos tulajdonsgot, amely a processz nevbl s gyrtjbl ll, s ezen sszetett tulajdonsg alapjn csoportost. Ha nincs szksgnk az egyes elemekre, csak a csoportokra, akkor hasznlhatjuk a -NoElement kapcsolt:
[21] PS C:\> get-process | Group-Object -Property company -noelement Count Name ----- ---30 Microsoft Corporation

209

Fontosabb cmdletek
2 5 1 2 1 1 1 1 1 1

DT Soft Ltd Google GARMIN Corp. NVIDIA Corporation Quest Software Realtek Semiconductor ... Motorola Inc. Syntek America Inc.

A fenti pldban csak a gyrtkra voltam kvncsi s a darabszmokra. Ezekbl a pldkbl mg az is kiderlhetett szmunkra, hogy a Group-Object hasznlata eltt nem kell kln sorba rendezni a csvezetken rkez objektumokat, hogy a csoportok jl kialakuljanak. Emlkezhetnk a format-table cmdlet -groupby paramterre az 1.4.17 Egyszer formzs fejezetbl, ott azt lthattuk, hogy a formattable szmra elbb sorba kellett rendezni az objektumokat, hogy j legyen a csoportosts. Itt ilyesmire nincs szksg, hiszen a Group-Object halmazokat kszt, nem csak megjelenti a csoportokat.

1.10.4 Objektumok talaktsa (Select-Object)


A Select-Object cmdlet a kapott objektumok megcsonktst kpes elvgezni, a kimenetknt kapott objektumokban mr csak a paramterlistban megadott tulajdonsgok fognak szerepelni, a tbbi tulajdonsgot (s a bemenetknt kapott objektumreferencit is) a cmdlet egyszeren eldobja. Viszont az eredeti objektum tulajdonsgait talakthatjuk, jabb tulajdonsgokat szmolhatunk ki, hozhatunk ltre, amelyekkel esetleg knynyebben tudunk dolgozni.

Feladat: Alaktsuk t a Get-Process-tl rkez objektumokat gy, hogy csak a folyamat nevt, gyrtjt s lerst tartalmazzk!

A Select-Object cmdletnek egyszeren azt kell megadnunk, hogy melyik tulajdonsgokat szeretnnk megtartani:
PS C:\> get-process | select-object name, company, description Name ---ctfmon CTHELPER CTSVCCDA csrss explorer ... Company ------Microsoft Corporation Creative Technology Ltd Creative Technology Ltd Microsoft Corporation Description ----------CTF Loader CtHelper MFC Application Creative Service for ... Windows Intz

Mi is trtnik ebben az esetben? A Get-Process Process objektumokat dobl a csbe, ezeket kapja meg a Select-Object, amely a paramterlista ltal meghatro-

210

Elmlet
zott tulajdonsgokat egy jonnan ltrehozott egyedi objektum azonos nev tulajdonsgaiba msolja. Ezek az objektumok fognak aztn tovbbvndorolni a csvn. Termszetesen nemcsak azt mondhatjuk meg, hogy mely tulajdonsgokra van szksgnk, hanem azt is, hogy melyekre nincs: az -excludeproperty paramter utn felsorolt tulajdonsgok nem fognak szerepelni a kimen objektumokban (de az sszes tbbi igen). A kimen objektumok szerkezett egy Get-Member hvs mutatja meg:
PS C:\> get-process | select-object -property name, description, company | get-member TypeName: System.Management.Automation.PSCustomObject Name ---Equals GetHashCode GetType ToString Company Description Name MemberType ---------Method Method Method Method NoteProperty NoteProperty NoteProperty Definition ---------System.Boolean Equals(Object obj) System.Int32 GetHashCode() System.Type GetType() System.String ToString() System.Management.Automation.PSObject Company=... System.Management.Automation.PSObject Descript... System.String Name=alg

Ltszik, hogy ez mr nem az eredeti objektum, hanem egy PSCustomObject. A fentieken kvl a Select-Object nhny ms funkcival is rendelkezik: nemcsak elemi objektumokat kpes talaktani, hanem gyjtemnyeket is talakt. Pldul kpes a bemenetknt kapott tmb elejrl vagy vgrl meghatrozott szm elemet levlasztani (-first s -last paramter), illetve kpes egy gyjtemny elemei kzl csak a klnbzeket (vagyis az egyforma elemek kzl csak egyet) tovbbadni a unique kapcsol segtsgvel:
PS C:\> PS C:\> 1,1,3,56,3,1,1,1,3 | Select-Object -unique 1 3 56

Ilyenkor a gyjtemny, tmb egyes elemei termszetesen megrzik tpusukat. Nzznk vgl arra is pldt, hogy a Select-Object-tel jabb, szmolt tulajdonsgokat is ltrehozhatunk. Itt most a jobb rtelmezhetsg kedvrt ttrdeltem a kdot:

211

Fontosabb cmdletek
dir c:\old | Select-Object name, @{ n = "Mret"; e = {switch ($m = $_.Length) { {$m -lt 1kb} {"Pici"; break} {$m -lt 3kb} {"Kzepes"; break} {$m -lt 100kb} {"Nagy"; break} default {"risi"} } } }

A fenti pldban nem vagyok megelgedve a dir, azaz a get-childitem ltal a fjloknl megmutatott tulajdonsgokkal, nekem kellene egy pici/kzepes/nagy/risi besorolsa a fjloknak. Ehhez a Select-Object-nek a fjlok igazi name tulajdonsga mellett egy kpzett tulajdonsgot is megadok. Ennek formja:
@{ name = "Tulajdonsgnv; expression = Tulajdonsgrtk}

A name s expression paramtereket lehet rvidteni. Nlam az expression rsz egy switch kifejezs, mellyel besorolom a fjlokat a mretk alapjn. s nzzk a kimenetet:
Name ---alice.txt coffee.txt lettercase.txt numbers.txt presidents.txt readme.txt skaters.txt symbols.txt vertical.txt votes.txt wordlist.txt Mret ----Pici Pici Pici Pici Pici Kzepes Nagy Pici Pici Nagy risi

Mg egy gyakori felhasznlsi terlete van a select-object-nek. Ennek felvezetsre nzznk egy egyszer pldt:
[1] PS C:\>get-service a* | Group-Object -Property status Count ----3 2 Name ---Stopped Running Group ----{Alerter, AppMgmt, aspnet_state} {ALG, AudioSrv}

Az [1]-es sorban lekrdezem az a betvel kezdd szolgltatsokat, majd csoportostottam ket a status paramterk alapjn. A kimeneten az egyes csoportokat alkot szolgltatsok tmbbe rendezve (kapcsos zrjelek kztt) lthatk.

212

Elmlet
Ez most a kevs szolgltatsnl akr j is lehet, de ha az sszes szolgltatsra futtattam volna, akkor nem nagyon frt volna ki az egyes csoportok listja. A kibontsban segthet a select-object az expandproperty paramterrel:
[2] PS C:\>get-service a* | Group-Object -Property status | Select-Object -E xpandProperty group Status -----Stopped Stopped Stopped Running Running Name ---Alerter AppMgmt aspnet_state ALG AudioSrv DisplayName ----------Alerter Application Management ASP.NET State Service Application Layer Gateway Service Windows Audio

A [2]-es sor utols tagjban a select-object kifejti a group tulajdonsgot, eredmnyekppen visszakapjuk a szolgltatsok listjt, immr csoportosts utni sorrendben. Gyakorlatilag ugyanahhoz az eredmnyhez jutottunk, mint az 1.4.17 Egyszer formzs fejezet vgn a get | sort | format-table groupby kifejezssorral. Mivel itt is gyjtemnyen vgeztem a select-object-tel a mveletet, az egyes elemek eredeti objektumtpusa megrzdtt:
[3] PS C:\> get-service a* | Group-Object -Property status | Select-Object ExpandProperty group | Get-Member TypeName: System.ServiceProcess.ServiceController Name ---Name add_Disposed Close Continue ... MemberType ---------AliasProperty Method Method Method Definition ---------Name = ServiceName System.Void add_Disposed(EventHa... System.Void Close() System.Void Continue()

Lthatjuk, hogy a mvelet vgn ServiceController tpus objektumokat kaptunk.

1.10.5 Rendezs (Sort-Object)

Feladat: Listzzuk ki a tz legtbb memrit foglal folyamatot a memriafoglals sorrendjben!

A folyamatok listjt termszetesen ismt a Get-Process adja. A folyamat ltal ignybe vett fizikai memria mennyisgt a Workingset tulajdonsg adja meg, ami az alaprtelmezett tblzatban is szerepel. A Sort-Object tetszleges tulajdonsg rtkei szerint tudja sorba rendezni a kimenetet. A listzs alaprtelmezs szerint a legki-

213

Fontosabb cmdletek
sebb rtktl indul, de ha megadjuk a -desc paramtert, akkor a legnagyobb rtkek kerlnek a lista tetejre.
PS C:\> get-process | sort-object -property workingset -desc

A lista teht mr rendezett, de neknk csak az elejn szerepl tz sorra lenne szksgnk. A korbban mr hasznlt Select-Object cmdlet egyik alfunkcijnak segtsgvel ez is knnyen megoldhat, egyszeren paramterknt kell megadnunk, hogy hny sorra van szksgnk. A megolds teht:
PS C:\> get-process | sort-object -property workingset -desc | select-object -first 10 Handles ------2779 420 463 693 317 1729 557 779 340 456 NPM(K) -----45 9 18 20 19 82 16 20 11 13 PM(K) ----197548 41488 34580 22396 45132 25332 46872 67944 17876 48196 WS(K) VM(M) ----- ----45732 439 34552 159 23060 343 20312 123 20048 125 16368 215 7720 180 7200 198 6716 122 6452 139 CPU(s) -----407,91 6,13 114,03 39,34 121,17 96,22 42,11 19,30 143,34 4,84 Id -460 612 3952 960 624 1436 2896 2496 1540 3604 ProcessName ----------iexplore powershell WINWORD explorer Mcshield svchost OUTLOOK iexplore svchostl iexplore

Nem mindegy, hogy milyen kultrkr, nyelv bcje szerint rendezzk az objektumokat. Alaphelyzetben az adott gp terleti belltsait veszi figyelembe a PowerShell, de ezt a -culture paramterrel megvltoztathatjuk:
[24] PS C:\> "zug", "zsuga", "csak", "cuki" | Sort-Object -Culture "hu-hu" cuki csak zug zsuga [25] PS C:\> "zug", "zsuga", "csak", "cuki" | Sort-Object -Culture "en-us" csak cuki zsuga zug

A [24]-es sorban magyar nyelv szablyai szerint rendeztem sorba a szavakat, mg a [25]-s sorban ugyanezeket a szavakat az angol bc szerint. Ltjuk, hogy jelents eltrs van a kt sorrend kztt, hiszen a magyar nyelvben a ketts betk kln soroldnak be a az bcbe. A klnbz nyelvekhez tartoz nyelvi kdok jellst a http://msdn2.microsoft.com/en-us/library/ms970637.aspx oldalon meg lehet nzni.

214

Elmlet

1.10.6 Mg egyszer format-table


Az elzekben lthattuk, hogy a select-object segtsgvel kiszmoltathatunk j tulajdonsgrtkeket is. Azonban ilyesmire a format-table is alkalmas:
[9] PS C:\old>Get-ChildItem | Format-Table name,@{Expression={if($_.psiscont ainer){"Knyvtr"}else{"Fjl"}};Label="Tpus";width=10} Name ---alfolder alice.txt coffee.txt dir.xml Tpus ----Knyvtr Fjl Fjl Fjl

Azaz itt is megadhat egy hashtbla kifejezs, amit a format-table kiszmol, illetve bept a tblzatba: Mez Expression Label Width Jelentse A kiszmoland kifejezs A tblzat oszlopnak cmkje Az oszlop szlessge

Ez annyiban klnbzik a select-object-es talaktstl, hogy itt az eredeti objektumhoz nem nylunk, az minden eredeti tulajdonsgt s a tpust megrzi, csak a megjelentst vltoztatjuk meg.

1.10.7 Gyjtemnyek sszehasonltsa (CompareObject)


A Compare-Object cmdlet segtsgvel kt tetszleges gyjtemnyt hasonlthatunk ssze, kimenetl a gyjtemnyek kztti klnbsget ler objektumokat kapunk. Az albbi pldban egy vltozba mentjk a gpen fut folyamatok listjt. Ezutn lelltunk, illetve elindtunk nhny folyamatot, majd ezt az j llapotot egy msik vltozba rjuk. A Compare-Object-nek odaadjuk a kt vltozt, pedig kilistzza klnbsgeket:
PS C:\> $a = Get-Process PS C:\> $b = Get-Process PS C:\> Compare-Object $a $b InputObject ----------System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process SideIndicator ------------(cmd) => (iexplore) => (notepad) => (OUTLOOK) <=

215

Fontosabb cmdletek
Mire hasznlhat ez? Szeretnnk pldul megtudni, hogy az internetrl gyjttt csodaprogram teleptje pontosan mit garzdlkodik a gpnkn? Semmi gond, ksztsnk pillanatfelvtelt az rzkeny terletekrl (fut folyamatok, fjlrendszer, registry) a telepts eltt, majd hasonltsuk ssze a teleptprogram lefutsa utni llapottal. Lesz nagy meglepets! Nem kell elaprzni, btran lekrhetjk pldul a teljes c: meghajt llapott, a gp majd beleizzad kicsit az sszehasonltsba, de gy mindenre fny derl:
PS C:\> $a = Get-ChildItem c: -recurse PS C:\> $b = Get-ChildItem c: -recurse PS C:\> Compare-Object $a $b

Vigyzzunk azonban a compare-object-tel! Ha tl sok a klnbsg a kt gyjtemny kztt, akkor nem biztos, hogy minden klnbsget felfedez. Nzznk erre egy pldt:
[29] PS C:\> Compare-Object 1,2,3,4,5,6,7,8,9,10 11,12,13,14,15,16,1 InputObject ----------11 1 12 2 3 4 5 13 14 15 16 1 6 7 8 9 10 SideIndicator ------------=> <= => <= <= <= <= => => => => => <= <= <= <= <=

A fenti pldban az egyik gyjtemnyem 1-tl 10-ig a szmok, a msik gyjtemnyem 11-tl 16-ig, plusz az 1-es. Azaz az 1 az nem klnbsg a kt gyjtemny kztt, mgis az eredmnyben, ami ugye az eltrseket adja meg, az 1-es is szerepel, radsul ktszer is. Ennek az az oka, hogy a compare-object nem minden elemhez nz meg minden elemet, hanem alaphelyzetben csak t elem tvolsgra. Azaz az els halmaz 1-est sszehasonltja a msodik tmbbeli 11-el, 12-vel stb., 16-tal, de az 1-gyel mr nem. Rbrhatjuk a compare-object-et, hogy messzebbre tekintsen a syncwindow paramterrel:
[31] PS C:\> Compare-Object 1,2,3,4,5,6,7,8,9,10 11,12,13,14,15,16,1 -SyncWi ndow 6 InputObject SideIndicator ----------- ------------2 <=

216

Elmlet
3 4 11 12 13 14 15 16 5 6 7 8 9 10 <= <= => => => => => => <= <= <= <= <= <=

Ebben a pldban az alaphelyzet szerinti 5 tvolsgot megtoldottam mg eggyel, gy mr rlelt az sszehasonlts a kt 1-esre.

1.10.8 Klnbz objektumok (Get-Unique)


Sokszor elfordulhat, hogy egyedi objektumokat keresnk, azaz a duplikcikra nem vagyunk kvncsiak. Pldul a fut processzek esetben ugyanazokat nem akarom tbbszr ltni. Alaphelyzetben ezt a listt kapom:
[45] PS C:\>Get-Process | sort Handles ------... 0 758 807 97 80 473 ... NPM(K) -----0 20 24 3 3 10 PM(K) ----0 28864 54592 740 1216 4284 WS(K) VM(M) ----- ----28 24160 28636 2864 3572 1444 0 162 207 23 34 43 CPU(s) -----29,53 93,50 0,09 0,16 7,66 Id ProcessName -- ----------0 2504 1296 2788 2532 1016 Idle iexplore iexplore igfxpers igfxtray lsass

Nzzk csak az egyedieket a get-unique segtsgvel:


[47] PS C:\>Get-Process | get-unique | sort Handles ------... 0 807 97 80 481 ... NPM(K) -----0 24 3 3 11 PM(K) ----0 54592 740 1216 4316 WS(K) VM(M) ----- ----28 28636 2864 3572 1880 0 207 23 34 43 CPU(s) -----93,50 0,09 0,16 7,66 Id ProcessName -- ----------0 1296 2788 2532 1016 Idle iexplore igfxpers igfxtray lsass

Ltszik, hogy az iexplorer csak egyszer szerepel a msodik listmban.

217

Fontosabb cmdletek
Vajon mit lehet tenni akkor, ha pont a duplikltakra vagyok kvncsi? Sajnos nincs get-duplicate cmdlet, de ilyen jelleg mkdst mi magunk is el tudunk idzni a get-unique s az elbb ltott compare-object tvzetvel:
[55] PS C:\>$elemek = "a","b","c","d","e","a","b","a" [56] PS C:\>Compare-Object ($elemek) ($elemek| sort | Get-Unique) InputObject ----------a b a SideIndicator ------------<= <= <=

Nzzk meg ugyanezt a processzekre:


[57] PS C:\>Compare-Object (Get-Process ) (Get-Process| Get-Unique) InputObject ----------System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process SideIndicator ------------=> <= => <= => <= => <= => <= <= <= <= <= <= <=

(System) (iexplore) (UdaterUI) (svchost) (usnsvc) (svchost) (VsTskMgr) (svchost) (vVX3000) (svchost) (svchost) (System) (UdaterUI) (usnsvc) (VsTskMgr) (vVX3000)

Hopp! Ez nem tl bartsgos. Az mg rthet, hogy az iexplore az benne van a listban, hiszen az kt pldnyban fut a gpemen. De vajon a System processz mirt nincs benne a unique listban? Ez valjban a compare-object elbb mr ltott sara, mivel ahogy lttuk nem minden elemet minden elemmel hasonlt ssze, hanem az egyms mell tett listkban csak +/- 5 elem krnyezetben vizsglja az egyezsget (hogy ne legyen tl lass az egsz cmdlet). De persze alaposabb tehetjk a keresst megint csak a -syncWindow paramter megnvelsvel (miutn a gpemen 100-nl kevesebb processz futott, ezrt a 100-as rtk bven elg):
[59] PS C:\>Compare-Object (Get-Process ) (Get-Process| Get-Unique) -syncwin dow 100 InputObject SideIndicator ----------------------System.Diagnostics.Process (iexplore) <= System.Diagnostics.Process (svchost) <=

218

Elmlet
System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process System.Diagnostics.Process (svchost) (svchost) (svchost) (svchost) <= <= <= <=

gy mr jl mkdik a get-duplicate kifejezsem!

1.10.9 Szmlls (Measure-Object)


Tetszleges objektumcsoport elemeivel kapcsolatos sszegzst tlagolst, stb. vgezhetnk el a Measure-Object cmdlet segtsgvel. A cmdlet kt klnbz zemmdban hasznlhat, s ennek megfelelen kt klnbz tpus objektumot adhat kimenetl. Szveges zemmdot a -line, -word, -character paramterek valamelyikvel krhetnk, ekkor a bemenetknt rkez objektumok szveges reprezentcijbl szrmaz rtkek kerlnek a kimenetbe, vagyis a cmdlet megszmolja a szvegben tallhat sorokat, szavakat s karaktereket.

Feladat: Szmoljuk meg a korbban ksztett dir.txt sorait, szavait s karaktereit!

A megolds egyszeren a kvetkez (az -ignorewhitespace paramter hasznlata esetn a szkzk s tabultorok nem szmtanak bele a karakterek szmba):
PS C:\> get-content c:\dir.txt | measure-object -ignorewhitespace -line word -char | format-table -autosize Lines Words Characters Property ----- ----- ---------- -------13 55 403

Ha a -property paramter utn megadjuk a bemen objektumok valamelyik tulajdonsgnak nevt, akkor a kimeneten a megadott tulajdonsg sszege, tlaga, maximlis s minimlis rtke fog megjelenni.

Feladat: sszegezzk memriafoglalst! A megolds egyszeren a kvetkez:

rendszerfolyamatok

fizikai

PS C:\> get-process | measure-object -property workingset -sum -average -m ax -min Count Average Sum Maximum Minimum : : : : : 42 4400664,38095238 184827904 80818176 16384

219

Fontosabb cmdletek
Property : WorkingSet

A count sorban lv szm ebben az esetben azt jelenti, hogy 42 darab workingset tulajdonsgot tlagolt, illetve sszegzett a cmdlet, vagyis ennyi Process objektumot kapott bemenetknt. Ha csak a fenti statisztika egyik szmadatval szeretnnk dolgozni, akkor a szoksos tulajdonsghivatkozssal ezt is megtehetjk. Pldul szeretnm a fenti memriafoglalst megabjtokban kijelezni:
[7] PS I:\>(get-process | measure-object -property workingset -sum).sum / 1m b 968,5390625

1.10.10 Nyomtats (Out-Printer)


Az Out-Printer cmdlet a bemenetknt kapott adatokat az alaprtelmezett, vagy a paramterknt megadott nyomtatra rja.
PS C:\> Get-Process | Out-Printer \\server\HPLJ5si

1.10.11 Kirs fjlba (Out-File, Export-)


Alaprtelmezs szerint a PowerShell parancsok kimenete (vagyis a kimenetknt kapott objektumok szveges reprezentcija) a konzolablakban jelenik meg. A szveges kimenet fjlba irnytst az Out-File s a Set-Content cmdlet segtsgvel vgezhetjk el, amelyek paramtereknt a ltrehozand fjl nevt kell megadnunk. Az Export-Csv s az Export-CliXML cmdletek nevkhz mltan csv, illetve xml formtumban rjk fjlba a bemenetl kapott objektumok adatait.

Feladat: Ksztsnk szvegfjlt, csv s xml fjlt a c: meghajt mappalistjbl!

A megolds mindhrom esetben nagyon egyszer, viszont az eredmny a formtumon tl, a tovbbi felhasznlhatsg szempontjbl is lnyegesen klnbzik egymstl.
PS C:\> Get-ChildItem | Out-File c:\dir.txt

Ebben az esetben a fjlba csak az kerl, amit az eredeti parancs a kpernyre rt volna. Ha a fjlt visszaolvassuk (Get-Content), az eredeti kimenet sorainak megfelel karakterlncokat kapunk. A kimeneti fjlban alaphelyzetben 80 karakter szlessgre trdelt sorokat kapunk, ha ennl szlesebb sorokat szeretnnk, akkor hasznljuk a width paramtert.

220

Elmlet
[27] PS C:\>Get-ChildItem c:\old | ft -property * -auto | Out-File c:\old\di r2.txt -Width 800

A fenti pldban a fjllistmat tblzatos formban akarom kirakni egy szveges llomnyba, de az sszes tulajdonsggal. Ez j szles tblzatot eredmnyez, gy az outfile-nl egy brutlisan szles sormretet adok meg lehetsges rtknek. De hogy feleslegesen ne terpeszkedjen szt a tblzatom, ezrt hasznltam a format-table cmdletnl az auto kapcsolt, mert ez olyan srn teszi az oszlopokat, amilyen srn adatveszts nlkl lehet. gy teht kaptam egy optimlis szlessg szveget, amely tnylegesen csak 399 karakter szles lett, azaz nem kellett kihasznlni a 800 karakteres maximumot. Nzzk meg, hogy mg milyen formtumokba tudjuk kitenni fjlba az outputot. A kvetkez a csv formtum, ami tblzatos forma:
PS C:\> Get-ChildItem | Export-Csv c:\dir.csv

Ha belenznk az eredmnyl kapott csv fjlba (notepad, vagy excel is j), akkor rmmel lthatjuk, hogy ebben az esetben az objektumok minden tulajdonsga belekerlt a kimenetbe, st a fejlcben mg a tpus megnevezse is megtallhat. Van egy Import-Csv cmdletnk is, ami a fjlt visszaolvasva jra ltrehozza az eredeti objektumot, jobban mondva egy ahhoz hasonl objektumot. Prbljuk is ki:
PS C:\> Import-Csv c:\dir.csv PSPath PSParentPath PSChildName PSDrive PSProvider PSIsContainer Mode : : : : : : : Microsoft.PowerShell.Core\FileSystem::C:\Config.Msi Microsoft.PowerShell.Core\FileSystem::C:\ Config.Msi C Microsoft.PowerShell.Core\FileSystem True d----

Az eredmny rdekesen nz ki, viszont sajnos nem hasonlt tlsgosan az eredeti mappalistra. Egy Get-Member hvs segtsgvel megtudhatjuk, hogy mi is trtnt az adatainkkal:
PS C:\> Import-Csv c:\dir.csv | get-member TypeName: CSV:System.IO.DirectoryInfo Name ---Equals GetHashCode GetType ToString Attributes MemberType ---------Method Method Method Method NoteProperty Definition ---------System.Boolean Equals(Object obj) System.Int32 GetHashCode() System.Type GetType() System.String ToString() System.String Attributes=Directory

221

Fontosabb cmdletek
CreationTime CreationTimeUtc Exists Extension FullName LastAccessTime ... NoteProperty NoteProperty NoteProperty NoteProperty NoteProperty NoteProperty System.String System.String System.String System.String System.String System.String CreationTime=2006.11.15. 8... CreationTimeUtc=2006.11.15... Exists=True Extension= FullName=C:\752e9949d08195... LastAccessTime=2007.07.06....

Lthat, hogy nem az igazi DirectoryInfo tpust kaptuk vissza (radsul a FileInfo tpus teljesen eltnt), hanem csak valamifle ptlkot, az eredeti objektum leegyszerstett vltozatt, amelynek nincsenek metdusai (csak amelyek az Object osztlybl rkldnek, ezekkel minden objektum rendelkezik), tulajdonsgai pedig elvesztettk eredeti tpusukat. Minden tulajdonsgrtk megvan ugyan, de csak karakterlncknt, az eredeti tpusinformci trolsra a csv formtum nem kpes. Ha kevesebb informcivesztssel szeretnnk trolni s visszaolvasni objektumainkat, akkor az xml formtumot kell vlasztanunk.
PS C:\> Get-ChildItem | Export-CliXML c:\dir.xml

Az xml fjl mrete kzel tzszerese a csv-nek, de ebbl pontosan az eredeti adathalmaz tulajdonsgai olvashatk vissza, mindenfle vesztesg, vagy torzuls nlkl. Ilyen mdon teht tetszleges .NET objektum, gyjtemny, akrmi teljes tartalmt lemezre menthetjk, s ksbb, a fjlt egyetlen paranccsal visszaolvasva helyrellthatjuk az ere13 deti objektumot . Nem rossz!
PS C:\> Import-CliXML c:\dir.xml Directory: Microsoft.PowerShell.Core\FileSystem::C:\ Mode ---LastWriteTime ------------2007.06.10. 12:41 2007.06.13. 21:30 2003.10.25. 18:59 2007.06.04. 20:36 Length Name ------ ---Config.Msi Documents and Settings Inetpub Program Files

Azrt egy kis csals itt is van. Ha megnzzk get-member-rel, hogy mit is kaptunk, akkor kiderl, hogy itt sem ugyanolyan objektumtpust kaptunk vissza, pldul a metdusokat ez is elvesztette:
[13] PS C:\old>import-clixml C:\dir.xml | gm TypeName: Deserialized.System.IO.DirectoryInfo

13

A Mode oszlop azrt hinyzik, mert az eredeti .NET objektumnak sincs ilyen tulajdonsga, ezt csak a PowerShell hazudja oda.

222

Elmlet

Name ---PSChildName PSDrive PSIsContainer PSParentPath PSPath PSProvider Attributes CreationTime CreationTimeUtc Exists Extension FullName LastAccessTime LastAccessTimeUtc LastWriteTime LastWriteTimeUtc Name Parent Root

MemberType ---------NoteProperty NoteProperty NoteProperty NoteProperty NoteProperty NoteProperty Property Property Property Property Property Property Property Property Property Property Property Property Property

Definition ---------System.String PSChildName=alfolder System.Management.Automation.PSObject PSD... System.Boolean PSIsContainer=True System.String PSParentPath=Microsoft.Powe... System.String PSPath=Microsoft.PowerShell... System.Management.Automation.PSObject PSP... System.String {get;set;} System.DateTime {get;set;} System.DateTime {get;set;} System.Boolean {get;set;} System.String {get;set;} System.String {get;set;} System.DateTime {get;set;} System.DateTime {get;set;} System.DateTime {get;set;} System.DateTime {get;set;} System.String {get;set;} System.String {get;set;} System.String {get;set;}

TypeName: Deserialized.System.IO.FileInfo Name ---PSChildName PSDrive PSIsContainer PSParentPath PSPath PSProvider Attributes CreationTime CreationTimeUtc Directory DirectoryName Exists Extension FullName IsReadOnly LastAccessTime LastAccessTimeUtc LastWriteTime LastWriteTimeUtc Length Name MemberType ---------NoteProperty NoteProperty NoteProperty NoteProperty NoteProperty NoteProperty Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Definition ---------System.String PSChildName=alice.txt System.Management.Automation.PSObject PSD... System.Boolean PSIsContainer=False System.String PSParentPath=Microsoft.Powe... System.String PSPath=Microsoft.PowerShell... System.Management.Automation.PSObject PSP... System.String {get;set;} System.DateTime {get;set;} System.DateTime {get;set;} System.String {get;set;} System.String {get;set;} System.Boolean {get;set;} System.String {get;set;} System.String {get;set;} System.Boolean {get;set;} System.DateTime {get;set;} System.DateTime {get;set;} System.DateTime {get;set;} System.DateTime {get;set;} System.Int64 {get;set;} System.String {get;set;}

Azaz az Export-CliXML s Import-CliXML prossal az objektumot tulajdonsgai megrzdnek, ugyangy felhasznlhatjuk ezeket mveletek vgzsre, mint az eredeti objektumok tulajdonsgait, viszont a metdusok elvesztek, ha azokra is szksgnk lenne, akkor sajnos azon melegben, mg exportls eltt meg kell hvnunk ezeket.

223

Fontosabb cmdletek

1.10.12 talakts szvegg (Out-String)


Lthattuk, hogy j dolog az objektumorientlt megkzelts, az esetek dnt tbbsgben jelentsen egyszerbb vlt tle az let a hagyomnyos shellekkel sszehasonltva. Bizonyos esetekben mgis szksg lehet arra, hogy az objektumokbl ll kimenetet szvegknt dolgozzuk fel, s pldul egy szveges keress alapjn vlogassuk ki belle azokat a sorokat, amelyekre szksgnk van. Nem szerencss pldul az objektumos kimenet, ha az, amit keresnk, tbb tulajdonsg rtkben is elfordulhat, s neknk azok a sorok kellenek, amelyekben akrhol is, de elfordul (vagy ppen hinyzik) a keresett rtk.

Feladat: Listzzuk ki egy Get-Process alaprtelmezett kimenetbl azokat a sorokat, amelyekben (brmelyik oszlopban!) elfordul a 44 karakterlnc!

Az objektumok szveges vltozatnak ellltsra az Out-String cmdlet kpes. Bemenetre tetszleges objektumokat kldhetnk (pldul formzott tblzatot, listt, stb. is), a kimenetn egy hossz karakterlnc fog megjelenni, amely mindazt tartalmazza, amit a bemenet a kpernyre rt volna. Prbljuk ki a kvetkezt:
PS C:\> get-process | out-string Handles ------66 173 29 473 689 NPM(K) -----3 5 1 6 18 PM(K) ----864 3564 380 2144 25440 WS(K) VM(M) ----- ----2808 30 5340 33 756 15 2420 28 18048 107 CPU(s) -----0,08 0,19 0,02 11,45 50,84 Id -416 1100 1436 612 3804 ProcessName ----------ctfmon CTHELPER CTSVCCDA csrss explorer

Ltszlag semmi klnbsg nincs az nll Get-Process-hez kpest, de ha a kimenetre krnk egy Get-Member-t, akkor lthat, hogy az mr nem System.Diagnostics.Process objektumokbl ll, hanem egyszer karakterlncc alakult. Mr csak a szveges keress van htra, amelyet a Select-String cmdlet segtsgvel fogunk elvgezni (ezzel rszletesen a 2.3.3 Szvegfjlok feldolgozsa (Get-Content, Select-String) fejezetben lesz sz):
PS C:\> get-process | out-string | select-string -pattern "44"

Valami mg nem egszen kerek, mivel ismt csak a teljes listt kaptuk vissza. Mi lehet a baj? Az Out-String cmdlet alaprtelmezs szerint egyetlen karakterlncot ad vissza, ami a teljes listt tartalmazza a sortrsektl fggetlenl. A teljes listban persze ott van a keresett minta, gy az egyetlen karakterlnc kzl azt az egyet kirtuk a kpernyre.

224

Elmlet
Soronknt trdelt kimenetet (karakterlncokbl ll tmbt) a -stream paramter hasznlatval krhetnk, a helyes megolds teht:
PS C:\> get-process | out-string -stream | select-string -pattern "44" 37 63 779 21 162 142 2 3 20 1 7 4 2016 1068 67944 168 4960 2396 40 372 7200 144 2652 372 30 30 198 4 60 44 0,09 0,09 19,30 0,08 0,44 0,50 3144 844 2496 920 1968 640 cmd daemon iexplore smss spoolsv VsTskMgr

Az out-string-nek van mg egy praktikus paramtere, ez pedig a width. Ez akkor jhet jl, ha nagyon szles tblzatot akarunk megjelenteni, s az alaphelyzet szerinti 80 karakteres szlessg tl kevsnek tnik. Mi van akkor, ha a get-process-szel a folyamatok sszes tulajdonsgt meg akarom jelenteni. Ez 80 karakterben gyakorlatilag remnytelen, nzzk meg, hogy 600 karakterbe hogyan fr el:
[19] PS C:\>get-process | ft -Property * | out-string -Width 600 -Stream > c :\old\proc.txt

Ezek utn nzzk notepad-del a fjlt:

44. bra 600 karakter szles szveg Notepadben

A sortrst kikapcsoltam, s ltszik, hogy viszonylag jl elfrnk mr. Az als grdtsv mretbl lthat, hogy elg jcskn lehet vzszintesen grgetni ezt a tblzatot. Ezzel gyakorlatilag ugyanazt az eredmnyt rtem el, mint az out-file cmdlet hasznlatval, megfelel width paramterrel.

1.10.13 Kimenet trlse (Out-Null)


Bizonyos feldolgozsok sorn (elssorban automatikusan futtatott szkriptekben) zavar lehet a konzolon megjelen kimenet. Ebben az esetben tehet j szolglatot az OutNull cmdlet, amelyet a sor vgre biggyesztve mindenfle esetleg megjelen zenettl szvegtl (kivve a hibazeneteket) megszabadulhatunk.

225

sszefoglal: PowerShell programozsi stlus

1.11 sszefoglal: PowerShell programozsi stlus


Ez elmleti rsz lezrsaknt sszefoglalnm azokat a fbb jellemzket, amelyek a PowerShellben trtn programozs jellegzetessgeinek rzek: Csvezs minden mennyisgben! Egy-egy mvelet eredmnyt legtbb esetben felesleges vltozkba rakni, rdemes azonnal tovbbkldeni tovbbi feldolgozsra a csvezetken keresztl egy jabb parancs szmra. Ezzel nem csak egyszerbb, tmrebb lesz a programunk, hanem egy csom tmeneti adattrols memria-felhasznlst sproljuk meg. Gyjtemny vagy objektum? Mint ahogy a lttuk pldul a get-member cmdlet mkdsnl, a PowerShell nha tl okosan prbl gyjtemnyeket kezelni, azaz nem mint objektumokat hasznlja, hanem kifejti az egyes elemeit. Mg ha egy elemet adunk neki, akkor meg azt az adott objektumknt kezeli. Ez gyakran flrevezet, fleg amikor egy objektum tulajdonsgait prbljuk feltrkpezni, s azt hisszk, hogy mr egy indexelhet tmbnl tartunk, s akkor derl ki szmunkra, hogy nem, mg mlyebbre kell snunk, mert amit ltunk az mg mindig egy egyetlen elemet tartalmaz tmbobjektum. Hagyomnyos programols ciklus helyett brmi ms! Akinek valamilyen klasszikus programnyelvben van gyakorlata, az PowerShellben is hajlamos eleinte minden tbbelem adat feldolgozsakor FOR ciklust rni. De ha nincs szksgnk az elemek ilyen jelleg indexelsre, nyugodtan hasznljunk FOREACH ciklust. Ha csvezetken rkeznek az adatok, akkor meg hasznljunk ForEach-Object cmdletet. St, mint ahogy az Exchange 12 Rocks pldmban szerepelt (1.5.7 Tpuskonverzi fejezet), a tpuskonverzi is kivlthat sok esetben ciklust, illetve mg a SWITCH kifejezs is hasznlhat ciklusknt. rjunk fggvnyeket, szkripteket, de ha nem akarjuk jra felhasznlni ezeket, akkor ksztsnk anonim fggvnyt, azaz olyan szkriptblokkot, mint amit a 1.8.8.1 Anonim fggvnyek fejezetben mutattam. Ez azrt j, mert itt rgtn hasznlhatjuk a kifejezsnkben a $_ vltozt, azaz kezelhetjk a cselemeket. Minden objektum! Soha ne feledkezznk meg arrl, hogy a PowerShellben minden kimenet objektum. Ugyan a konzolon szvegeket, karaktereket ltunk, de ezek az esetek tlnyom tbbsgben nem egyszer szvegek, hanem mindig sszetett objektumok, melyeknek csak nhny tulajdonsgt ltjuk a kpernyn szvegknt. Radsul ezek a tulajdonsgok is ltalban szintn objektumok. Ne legynk restek ezeknek a mlyre sni. Ebben segt bennnket a get-member cmdlet, a klnbz szkript szerkesztk

226

Elmlet
(mint pldul a PowerGUI Script Editora) s a Reflector segdprogram, valamint az MSDN weboldal. Nzznk utna a tulajdonsgoknak, metdusoknak, konstruktoroknak, statikus metdusoknak, nehogy leprogramozzunk valami olyasmit, ami mr kszen megtallhat az objektum jellemzi kztt vagy a .NET keretrendszer valamelyik osztlyban. Szabjuk testre a PowerShellt, de ez ne menjen a kompatibilits krra Lthattuk, hogy a PowerShell jelenleg mg csak 1.0-s verzij s van nhny hinyossga, de nagyon egyszeren lehet bvteni a krnyezetet. jabb fggvnyekkel j funkcikat valsthatunk meg. j lnevekkel kevesebbet kell gpelnnk. A tpusok kiegsztsvel jabb tulajdonsgokat s metdusokat kszthetnk objektumainkhoz. Vigyzzunk azonban, hogy ha valamilyen bvtst ksztnk, akkor az vajon hogyan mkdik egy msik gpen? Ott is megvannak-e azok a kiegsztsek, amik lehetv teszik a bvtmnyeink futtatst? Ezeket se felejtsk el magunkkal vinni, ksztsnk fggvnytrakat a gyakran hasznlt fggvnyeinkbl. Ezzel folytatom majd a knyv msodik rszt. Viszont a beptett cmdleteket, lneveket lehetleg ne definiljuk jra, mert ez a programjaink, parancssoraink rtelmezhetsgnek krra megy.

227

PowerShell krnyezet

2. Gyakorlat
Az elmleti rszben ttekintettk a PowerShell teleptst, nyelvi elemeit. A knyv ezen rszben gyakorlatiasabb pldkkal folytatjuk. Termszetesen itt sem fogunk tbb oldalas pldaprogramokat rni, hiszen ez a knyv nem fejlesztknek, hanem gyakorl rendszergazdknak szl, akik gyorsan, kevs programozssal szeretnnek eredmnyre jutni.

2.1 PowerShell krnyezet


A gyakorlati rsz els fejezete a PowerShell krnyezet komfortosabb ttelrl szl, milyen lehetsgek llnak rendelkezsre, hogy a PowerShell ablak ne ugyanolyan tudssal induljon, mint korbban, hanem ptse be az ltalunk korbban elksztett fggvnyeket, szkripteket, illetve tltse be azokat a kls bvtmnyeket, amelyekkel szintn kiterjeszthetjk a kpessgeit.

2.1.1 Szkriptknyvtrak, futtatsi informcik ($myinvocation)


Munknk sorn valszn j nhny hasznos fggvnyt ksztnk, amelyeket rendszeresen hasznlni szeretnnk. Ezekhez gy frnk hozz legegyszerbben, ha ezeket a fggvnyeket szkriptfjlokban elmentjk egy knyvtrba, majd a sok kis szkriptfjlunkat egy beemel, include jelleg kzponti szkripttel lefuttatjuk. Ennek modellezsre ksztettem egy scripts knyvtrat, amelyben hrom szkriptem hrom fggvnyt definil. Ezen kvl van egy include.ps1 szkriptem, ami csak annyit csinl, hogy a sajt knyvtrban lev msik hrom szkriptet meghvja dotsourcing jelleggel, azaz gy, hogy a szkriptek ltal definilt fggvnyek brhonnan elrhetk, meghvhatk legyenek.
[17] PS C:\powershell2\egyik> Get-ChildItem C:\powershell2\scripts Directory: Microsoft.PowerShell.Core\FileSystem::C:\powershell2\scripts Mode ----a---a---a---a--LastWriteTime ------------2008.04.19. 12:31 2008.04.19. 12:31 2008.04.19. 12:31 2008.04.19. 12:32 Length -----42 45 45 40 Name ---fv1.ps1 fv2.ps1 fv3.ps1 include.ps1

228

Gyakorlat
[18] PS C:\powershell2\egyik> get-content C:\powershell2\scripts\fv1.ps1 function fv1 { "Els fggvny" } [19] PS C:\powershell2\egyik> get-content C:\powershell2\scripts\include.ps1 . .\fv1.ps1 . .\fv2.ps1 . .\fv3.ps1

Ez egyes fggvnyek nagyon egyszerek, csak annyit rnak ki, hogy hnyadik fggvnyrl van sz. Ez gy kln-kln nagyon szpnek s logikusnak tnik, prbljuk meg futtatni az include.ps1 szkriptnket az egyik nev knyvtrbl:
[22] PS C:\powershell2\egyik> C:\powershell2\scripts\include.ps1 The term '.\fv1.ps1' is not recognized as a cmdlet, function, operable prog ram, or script file. Verify the term and try again. At C:\powershell2\scripts\include.ps1:1 char:2 + . <<<< .\fv1.ps1 The term '.\fv2.ps1' is not recognized as a cmdlet, function, operable prog ram, or script file. Verify the term and try again. At C:\powershell2\scripts\include.ps1:2 char:2 + . <<<< .\fv2.ps1 The term '.\fv3.ps1' is not recognized as a cmdlet, function, operable prog ram, or script file. Verify the term and try again. At C:\powershell2\scripts\include.ps1:3 char:2 + . <<<< .\fv3.ps1

Valami nem j! Nyomozzunk utna, cserljk le az include.ps1 belsejt egy olyan vizsglatra, amely megmutatja, hogy mit rez a szkript aktulis knyvtrnak. Amg nem tallom meg a hibt, a fggvnyeket definil szkriptek hvst kikommenteztem:
#. .\fv1.ps1 #. .\fv2.ps1 #. .\fv3.ps1 Get-Location

Futtatva ezt kapjuk:


[23] PS C:\powershell2\egyik> C:\powershell2\scripts\include.ps1 Path ---C:\powershell2\egyik

Kiderlt a hiba oka, annak ellenre, hogy az include.ps1 a scripts knyvtrban fut, szmra is az aktulis knyvtr az egyik. Hogyan lehetne azt megoldani, hogy az include.ps1 szmra a sajt knyvtra legyen az aktulis?

229

PowerShell krnyezet
Szerencsre van egy $MyInvocation nev automatikus vltoz, amely a szkriptek szmra a futtatsukkal kapcsolatos informcikat rulja el. Nzzk is ezt meg, mdostottak az include.ps1 szkriptemet:
#. .\fv1.ps1 #. .\fv2.ps1 #. .\fv3.ps1 $MyInvocation

Ezt futtatva kapjuk a kvetkezket:


[30] PS C:\powershell2\egyik> C:\powershell2\scripts\include.ps1 MyCommand ScriptLineNumber OffsetInLine ScriptName Line PositionMessage : : : : : : include.ps1 1 -2147483648 C:\powershell2\scripts\include.ps1

At line:1 char:34 + C:\powershell2\scripts\include.ps1 <<<< InvocationName : C:\powershell2\scripts\include.ps1 PipelineLength : 1 PipelinePosition : 1

Ha tlpnk a szlknyvtrba, s onnan hvjuk meg a szkriptet a kvetkezkppen alakul a $MyInvocation rtke:
[31] PS C:\powershell2\egyik> cd .. C:\powershell2 [32] PS C:\powershell2> .\scripts\include.ps1 MyCommand ScriptLineNumber OffsetInLine ScriptName Line PositionMessage : : : : : : include.ps1 1 -2147483648 .\scripts\include.ps1

At line:1 char:21 + .\scripts\include.ps1 <<<< InvocationName : .\scripts\include.ps1 PipelineLength : 1 PipelinePosition : 1

Ebbl az ltszik, hogy se a Line, se az InvocationName tulajdonsg nem a szkript tnyleges elrsi tjt tartalmazza, hanem azt, ahonnan meghvtuk. gy ezekkel a tulajdonsgokkal nem tudunk dolgozni, mert ezek sem adnak irnymutatst arra vonatkozlag, hogy hol van tnylegesen az include.ps1, s vele egytt a fggvnyeimet tartalmaz szkriptek. Nzzk, hogy vajon a MyCommand-nak vannak-e tulajdonsgai:

230

Gyakorlat
#. .\fv1.ps1 #. .\fv2.ps1 #. .\fv3.ps1 $MyInvocation.MyCommand

A futtats eredmnye:
[34] PS C:\powershell2> .\scripts\include.ps1 | fl Path Definition Name CommandType : : : : C:\powershell2\scripts\include.ps1 C:\powershell2\scripts\include.ps1 include.ps1 ExternalScript

Itt mr van egy sokat sejtet Path tulajdonsg, ami egy teljes elrsi t, gy remny van r, hogy ebbl kiindulva mr jl el fogjuk tudni rni a fggvnyeket tartalmaz szkripteket. Ltezik egy split-path cmdlet, amellyel le tudjuk vlasztani egy elrsi trl a knyvtr-hierarchia rszt, ennek segtsgvel mr el tudjuk kszteni az univerzlis, brhonnan mkd include.ps1 szkriptnket:
Push-Location Set-Location (split-path $MyInvocation.MyCommand.Path) . .\fv1.ps1 . .\fv2.ps1 . .\fv3.ps1 Pop-Location

s a futtatsnak eredmnye:
[41] PS C:\powershell2> .\scripts\include.ps1 [42] PS C:\powershell2> fv1 The term 'fv1' is not recognized as a cmdlet, function, operable program, o r script file. Verify the term and try again. At line:1 char:3 + fv1 <<<<

Na, most mi a hiba? Ht az, hogy br jl lefutott az include.ps1, de a betlttt fggvnyszkriptek csak az szintjre lettek dotsource-olva. Ahhoz, hogy a globlis scope-bl is elrhessk ezeket a fggvnyeket, magt az include.ps1-et is dotsourceszal kell meghvni ([43]-as sorban a plusz pont s szkz a prompt utn):
[43] PS C:\powershell2> . .\scripts\include.ps1 [44] PS C:\powershell2> fv1 Els fggvny [45] PS C:\powershell2> fv2 Msodik fggvny

gy mr tkletesen mkdik a szkriptknyvtrunk.

231

PowerShell krnyezet

2.1.1.1 A $MyInvocation felhasznlsa parancssorelemzsre


Nzzk kicsit alaposabban meg ezt a $myinvocation vltozt. Ha interaktvan szeretnnk megnzni, akkor ezt kapjuk:
[1] PS C:\> "kakukk"; $myinvocation kakukk MyCommand ScriptLineNumber OffsetInLine ScriptName Line PositionMessage InvocationName PipelineLength PipelinePosition : : : : : : : : : "kakukk"; $myinvocation 0 0

2 1

Ltszik, hogy a MyCommand property tartalmazza, hogy mi is az ppen futtatott parancs. Mivel ezt ritkn hasznljuk interaktvan, nzzk meg, hogy egy szkriptbl futtatva mit ad. Maga a szkript nagyon egyszer:
$myinvocation | fl

s a kimenet:
[7] PS C:\> C:\powershell2\scripts\get-mycommand.ps1 MyCommand ScriptLineNumber OffsetInLine ScriptName Line PositionMessage : : : : : : get-mycommand.ps1 1 -2147483648 C:\powershell2\scripts\get-mycommand.ps1

At line:1 char:40 + C:\powershell2\scripts\get-mycommand.ps1 <<<< InvocationName : C:\powershell2\scripts\get-mycommand.ps1 PipelineLength : 1 PipelinePosition : 1

Nzzk meg, hogy egy fggvnyben hogyan alakul ez a vltoz:


[8] PS C:\> function get-myinvocation {$myinvocation | fl *} [9] PS C:\> "kakukk" | get-myinvocation MyCommand : get-myinvocation ScriptLineNumber : 1 OffsetInLine : -2147483648

232

Gyakorlat
ScriptName Line PositionMessage : : "kakukk" | get-myinvocation : At line:1 char:27 + "kakukk" | get-myinvocation <<<< InvocationName : get-myinvocation PipelineLength : 1 PipelinePosition : 1

A fenti pldkbl ltszik, hogy elssorban a MyCommand s a Line tulajdonsg hasznos. Ha csak a szken vett futtatsi krnyezetre vagyunk kvncsi, akkor a MyCommand kell neknk, ha a teljes parancssor, akkor Line. Ezt felhasznlva ksztsnk egy olyan fggvnyt, ami megismtli valahnyszor az eltte formailag csvezetkknt megadott kifejezst ilyen formban:
kifejezs | repeat-commandline 5

Az ezt megvalst fggvny:


[1] PS C:\> function repeat-commandline ([int] $x = 2) >> { >> $s = $myinvocation.line >> $last = $s.LastIndexOf("|") >> if ($last -lt 0) {throw "Nincs mit ismtelni!"} >> $cropped = $s.substring(0,$last) >> for ($r = 0; $r -lt $x; $r++) >> { >> invoke-expression $cropped >> } >> } >> [2] PS C:\> "tbbszr" | repeat-commandline 5 tbbszr tbbszr tbbszr tbbszr tbbszr

A fggvny lnyegi rsze a $myinvocation automatikus vltoz Line tulajdonsgnak felhasznlsa. Neknk itt a teljes parancssor kell, gy a Line tulajdonsgot hasznlom. Megkeresem az utols csjelet, (ha nincs ilyen benne, akkor hibt jelzek) s csonkolom odig a kifejezst, majd egy ciklussal vgrehajtom ezt annyiszor, amennyi a fggvnynek tadott paramter.

2.1.2 Krnyezeti vltozk (env:)


A DOS/Windows krnyezeti vltozkat is elrjk PowerShellbl az env: PSDrive-on keresztl:

233

PowerShell krnyezet
[3] PS C:\> cd env: [4] PS Env:\> dir Name ---COMPUTERNAME HOMEPATH USERNAME PROCESSOR_ARCHITECTURE Path CommonProgramFiles(x86) ProgramFiles(x86) PROCESSOR_LEVEL LOGONSERVER HOMEDRIVE USERPROFILE SystemRoot TEMP SESSIONNAME ALLUSERSPROFILE FP_NO_HOST_CHECK APPDATA ProgramFiles PATHEXT CLIENTNAME OS CommonProgramFiles PROCESSOR_IDENTIFIER ComSpec SystemDrive PROCESSOR_REVISION NUMBER_OF_PROCESSORS TMP USERDOMAIN windir Value ----ASUS \Documents and Settings\Administrator Administrator AMD64 C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS... C:\Program Files (x86)\Common Files C:\Program Files (x86) 6 \\ASUS C: C:\Documents and Settings\Administrator C:\WINDOWS C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp Console C:\Documents and Settings\All Users NO C:\Documents and Settings\Administrator\A... C:\Program Files .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.W... Console Windows_NT C:\Program Files\Common Files EM64T Family 6 Model 15 Stepping 10, Genu... C:\WINDOWS\system32\cmd.exe C: 0f0a 2 C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp ASUS C:\WINDOWS

Ezeket a vltozkat felhasznlhatjuk szkriptjeinkben. Pldul keressk az sszes PATH-ban tallhat txt kiterjeszts fjlt:
[41] PS C:\> $env:path.split(";") | ForEach-Object {$_ + "\*"} | Get-ChildIt em -Include *.txt Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\system32 Mode ----a---a--LastWriteTime ------------2006.03.29. 14:00 2008.01.18. 14:45 Length -----41661 0 Name ---eula.txt h323log.txt

Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS

234

Gyakorlat
Mode ----a---a--... LastWriteTime ------------2008.01.28. 12:38 2008.01.18. 13:57 Length -----1672 749897 Name ---OEWABLog.txt setuplog.txt

Vagy pldul ki szeretnm trlni az sszes tmp kiterjeszts tmeneti llomnyt:


[47] PS C:\> dir ($($env:temp)+"\*") -Include *.tmp | Remove-Item

Itt elfordulhat, hogy ha vannak zrolt llomnyaink, akkor trlsk nem sikerl, hibt kapunk, de a tbbi llomnyt trli a kifejezs.

2.1.3 Lpjnk kapcsolatba a konzolablakkal ($host)


J lenne a PowerShell ablakot is minl komfortosabb tenni. Ennek nhny lehetsge (QuickEdit mode, ablakszlessg, stb.) mr a 1.2.5 Gyorsbillentyk, belltsok fejezetben szerepelt. Az ott lertaknl kicsit tbb is rendelkezsnkre ll, ehhez tudni kell, hogy ltezik egy $host automatikus vltoz, ami a PowerShell ablak sok jellemzjt tartalmazza.
[1] PS I:\>$host Name Version InstanceId UI ConsoleHost 1.0.0.0 197f1a6f-6cdc-4e47-a81f-0fa93e8276e8 System.Management.Automation.Internal.Host.InternalHostU serInterface CurrentCulture : hu-HU CurrentUICulture : en-US PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy : : : :

Kzvetlenl a $host mg nem igazn a mi bartunk, de nzzk ennek tagjellemzit:


[3] PS I:\>$host.ui | gm TypeName: System.Management.Automation.Internal.Host.InternalHostUserInt erface Name ---Equals GetHashCode GetType get_RawUI Prompt PromptForChoice PromptForCredential ReadLine MemberType ---------Method Method Method Method Method Method Method Method Definition ---------System.Boolean Equals(Object obj) System.Int32 GetHashCode() System.Type GetType() System.Management.Automation.Host.PSHo... System.Collections.Generic.Dictionary`... System.Int32 PromptForChoice(String ca... System.Management.Automation.PSCredent... System.String ReadLine()

235

PowerShell krnyezet
ReadLineAsSecureString ToString Write WriteDebugLine WriteErrorLine WriteLine WriteProgress WriteVerboseLine WriteWarningLine RawUI Method Method Method Method Method Method Method Method Method Property System.Security.SecureString ReadLineA... System.String ToString() System.Void Write(String value), Syste... System.Void WriteDebugLine(String mess... System.Void WriteErrorLine(String value) System.Void WriteLine(), System.Void W... System.Void WriteProgress(Int64 source... System.Void WriteVerboseLine(String me... System.Void WriteWarningLine(String me... System.Management.Automation.Host.PSHo...

Mg itt sem biztos, hogy felcsillan a szemnk, de nzzk a sokat sejtet RawUI-t:
[4] PS I:\>$host.ui.rawui | gm TypeName: System.Management.Automation.Internal.Host.InternalHostRawUser Interface Name ---Equals FlushInputBuffer GetBufferContents GetHashCode GetType get_BackgroundColor get_BufferSize get_CursorPosition get_CursorSize get_ForegroundColor get_KeyAvailable get_MaxPhysicalWindowSize get_MaxWindowSize get_WindowPosition get_WindowSize get_WindowTitle LengthInBufferCells NewBufferCellArray ReadKey ScrollBufferContents SetBufferContents set_BackgroundColor set_BufferSize set_CursorPosition set_CursorSize set_ForegroundColor set_WindowPosition set_WindowSize set_WindowTitle ToString BackgroundColor BufferSize CursorPosition CursorSize ForegroundColor MemberType ---------Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Property Property Property Property Property Definition ---------System.Boolean Equals(Object obj) System.Void FlushInputBuffer() System.Management.Automation.Host.B... System.Int32 GetHashCode() System.Type GetType() System.ConsoleColor get_BackgroundC... System.Management.Automation.Host.S... System.Management.Automation.Host.C... System.Int32 get_CursorSize() System.ConsoleColor get_ForegroundC... System.Boolean get_KeyAvailable() System.Management.Automation.Host.S... System.Management.Automation.Host.S... System.Management.Automation.Host.C... System.Management.Automation.Host.S... System.String get_WindowTitle() System.Int32 LengthInBufferCells(St... System.Management.Automation.Host.B... System.Management.Automation.Host.K... System.Void ScrollBufferContents(Re... System.Void SetBufferContents(Coord... System.Void set_BackgroundColor(Con... System.Void set_BufferSize(Size value) System.Void set_CursorPosition(Coor... System.Void set_CursorSize(Int32 va... System.Void set_ForegroundColor(Con... System.Void set_WindowPosition(Coor... System.Void set_WindowSize(Size value) System.Void set_WindowTitle(String ... System.String ToString() System.ConsoleColor BackgroundColor... System.Management.Automation.Host.S... System.Management.Automation.Host.C... System.Int32 CursorSize {get;set;} System.ConsoleColor ForegroundColor...

236

Gyakorlat
KeyAvailable MaxPhysicalWindowSize MaxWindowSize WindowPosition WindowSize WindowTitle Property Property Property Property Property Property System.Boolean KeyAvailable {get;} System.Management.Automation.Host.S... System.Management.Automation.Host.S... System.Management.Automation.Host.C... System.Management.Automation.Host.S... System.String WindowTitle {get;set;}

Itt mr minden van, ami hasznos lehet. Gyakorlatilag az ablak legtbb tulajdonsga ezen objektumon keresztl lekrdezhet s bellthat. Pldul cserljk le az ablak fejlcnek szvegt:

Billentyletsre vr programok kszthetk a ReadKey() metdus segtsgvel:


[13] PS I:\>$host.ui.rawui.ReadKey() a VirtualKeyCode Character ---------------------65 a

ControlKeyState --------------NumLockOn

KeyDown ------True

Kimeneteknt lthatjuk a karakterkdot s a lettt karaktert magt is. Ha nem akarjuk ltni a lettt karaktert, akkor hasznlhatjuk a ReadKey() klnbz opcii kzl a NoEcho-t, amelyet vagy az IncludeKeyDown, vagy az IncludeKeyDown opcival egytt kell hasznlni:
[14] PS C:\>$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") VirtualKeyCode -------------74 Character --------j ControlKeyState --------------NumLockOn KeyDown ------True

Az IncludeKeyUp hasznlatval csak a billenty felengedsekor ad kimenetet a kifejezs. Ez akkor hasznos, ha a Shift vagy egyb kiegszt billentyt is akarjuk hasznlni, hiszen ha a lenyomsra lesedne, akkor mr a Shifthez val hozzrskor lefutna a metdus s nem lenne id az igazi billenty lenyomsra. Pldul egy Shift+Ctrl+Alt+w megnyomsa esetn a metdus futsnak eredmnye gy nz ki:
[15] PS C:\>$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp") | fl * VirtualKeyCode Character ControlKeyState KeyDown : 87 : : LeftAltPressed, LeftCtrlPressed, ShiftPressed, NumLockOn : False

237

PowerShell krnyezet
Ezzel, s mg egy opci, az AllowCtrlC megadsval akr a Ctrl+C is megfigyeltethet:
[16] PS C:\>$host.UI.RawUI.ReadKey("NoEcho,AllowCtrlC,IncludeKeyUp") VirtualKeyCode -------------67 Character -------- ControlKeyState --------------LeftCtrlPressed KeyDown ------False

2.1.4 Prompt belltsa


A PowerShellben a prompt testre szabhat. Mint ahogy a 1.8.10 Gyri fggvnyek fejezetben lttuk, a promptot egy automatikusan, minden beviteli sor megnylsakor meghvd prompt nev fggvny generlja. Ez a fggvny tdefinilhat, testre szabhat. n ebben a knyvben a norml [PS] C:\> jelleg prompt el biggyesztettem egy folytonosan nvekv sorszmot, hogy jobban lehessen hivatkozni a bemsolt parancssorokra. De termszetesen a prompt fggvnnyel nem csak olyan tevkenysgeket vgeztethetnk, ami kizrlag a megjelen promptot szabja testre, hanem pldul a PowerShell ablakunk fejlct is folyamatosan aktualizlhatjuk az aktulis idre. Nzznk erre egy pldt:

45. bra A prompt testre szabsa s annak eredmnye

Ltjuk, hogy amint a fggvny defincija megtrtnt, mr letbe is lp az j prompt. Azonban vigyzzunk, ha becsukjuk az ablakot s jra megnyitjuk, akkor visszakapjuk az eredeti promptot, a mi testre szabsunkat elfelejti. Ezen majd a nemsokra bemutatsra kerl profilok segtenek majd.

2.1.5 Snapin-ek
A PowerShell modulris felpts, az egyes cmdletek s providerek klnbz moduloknak, u.n. snapin-eknek ksznhetk. A snapinek ltalban dll fjlok, s a registry-ben kell ket regisztrlni a PowerShell szmra. Egy ilyen snapin regisztrcija valahogy gy nz ki (csak akkor jn ez a registry g ltre, ha legalbb egy, nem gyri snapinnk van):

238

Gyakorlat

46. bra Snapin regisztrcija

Ezt termszetesen nem neknk, manulisan kell bejegyezni, hanem a snapin gyrtja ltalban biztost valamilyen teleptt, ami ezt megteszi. Ha van ilyen szpen elksztett snapinnk, akkor ha a teleptje valamilyen egyb mdon nem integrlja be a PowerShell konzolba a Add-PSSnapin cmdlettel be tudjuk pteni a PowerShell konzolba. Snapinekbl mr eleve tbb van a PowerShell 1.0-ban, s ezeket a gyri snapineket nem kell kln regisztrlni. A snapinek lekrdezhetk a get-pssnapin cmdlettel:
[1] PS I:\>Get-PSSnapin Name : Microsoft.PowerShell.Core PSVersion : 1.0 Description : This Windows PowerShell snap-in contains Windows PowerShell m anagement cmdlets used to manage components of Windows PowerS hell. Name : Microsoft.PowerShell.Host PSVersion : 1.0 Description : This Windows PowerShell snap-in contains cmdlets used by the Windows PowerShell host. Name : Microsoft.PowerShell.Management PSVersion : 1.0 Description : This Windows PowerShell snap-in contains management cmdlets u sed to manage Windows components. Name : Microsoft.PowerShell.Security PSVersion : 1.0 Description : This Windows PowerShell snap-in contains cmdlets to manage Wi ndows PowerShell security. Name : Microsoft.PowerShell.Utility PSVersion : 1.0 Description : This Windows PowerShell snap-in contains utility Cmdlets used to manipulate data.

Snap-inekkel kapcsolatos egyb cmdletek:

239

PowerShell krnyezet
[3] PS I:\>Get-Command -noun pssnapin CommandType ----------Cmdlet Cmdlet Cmdlet Name ---Add-PSSnapin Get-PSSnapin Remove-PSSnapin Definition ---------Add-PSSnapin [-Name] <Stri... Get-PSSnapin [[-Name] <Str... Remove-PSSnapin [-Name] <S...

Azaz hozz lehet adni (Add-PSSnapin) ezeket, le lehet krdezni (GetPSSnapin), s el lehet tvoltani (Remove-PSSnapin). Mg azt is megnzhetjk, hogy az egyes cmdletek melyik snapinben tanyznak:
[17] PS I:\>get-command | Select-Object name, pssnapin | Group-Object pssnap in | ft -wrap Count Name ----- ---47 Microsoft.PowerShell.Mana gement 12 Microsoft.PowerShell.Core Group ----{Add-Content, Clear-Content, Clear-Item, Cl ear-ItemProperty...} {Add-History, Add-PSSnapin, Export-Console, ForEach-Object...} 58 Microsoft.PowerShell.Util {Add-Member, Clear-Variable, Compare-Object ity , ConvertTo-Html...} 10 Microsoft.PowerShell.Secu {ConvertFrom-SecureString, ConvertTo-Secure rity String, Get-Acl, Get-AuthenticodeSignature. ..} 2 Microsoft.PowerShell.Host {Start-Transcript, Stop-Transcript}

Mikor lehet erre szksg? Igazbl az alap snap-inekkel n nem nagyon jtszadoznk, de majd a 3. Bvtmnyek fejezetben ltunk olyan bvtmnyeket, amelyeket esetleg ki lehet kapcsolni, vagy ppen az alap PowerShell ablakhoz hozz lehet adni. Snap-inekkel kapcsolatos vltoztatsok sem idt llk, azaz ha becsukjuk a PowerShell ablakot s jra megnyitjuk, akkor megint az alaphelyzet szerinti snap-inek ksznnek vissza. Sajnos a get-pssnapin nem listzza ki azokat a bepl modulokat, amelyek mg nincsenek hozzadva a rendszerhez, gy nem is tudjuk, hogy mikkel bvthetnnk azt. Ksztsnk egy ilyen hozzadhat snap-in listt:
[54] PS C:\> function get-customsnapins >> { >> Get-ChildItem hklm:\SOFTWARE\Microsoft\PowerShell\1\PowerShellSnapIns | >> Select-Object @{n="PSSnapIns" ; e={$_.pschildname}} >> } >> [55] PS C:\> get-customsnapins PSSnapIns --------PowerGadgets Pscx

240

Gyakorlat
A fenti get-customsnapins fggvny alaposabb megrtshez kell majd a 2.5 Registry kezelse fejezet elolvassa is, de azrt nagyjbl rthet gy is a mkdse. Azaz kilistzom egy Get-ChildItem cmdlettel a snapineket tartalmaz registry-g tartalmt, majd talaktom az gy kijv objektumgyjtemnyt, hogy csak a szmomra fontos adat, a PSChildName kerljn a kimenetre, mghozz PSSnapIns nven.

2.1.6 Konzolfjl
Mind a szkriptknyvtraknl, mind a promptnl, mind pedig a snapineknl megjegyeztem, hogy a sajt bvtmnyeinket, testre szabsainkat a PowerShell ablak elfelejti, ha becsukjuk. Ezrt vannak olyan megoldsok, amelyek a bvtmnyeink definilst, beemelst vgz szkriptjeinket automatikusan minden PowerShell ablak nyitskor lefuttatjk. Az egyik ilyen lehetsggel magt a konzolt tudjuk testre szabni a snapinek tekintetben fggetlenl attl, hogy ki indtja el a PowerShell krnyezetet. Ezt konzolfjl segtsgvel tudjuk elrni, ilyen fjlt az Export-Console cmdlet segtsgvel lehet legegyszerbben ltrehozni. Nzzk, hogy most milyen snapinek vannak a gpemen a Start menbl elindtott PowerShell ikon utn megjelen konzolban:
[3] PS C:\> Get-PSSnapin | ft -Property Name Name ---Microsoft.PowerShell.Core Microsoft.PowerShell.Host Microsoft.PowerShell.Management Microsoft.PowerShell.Security Microsoft.PowerShell.Utility Pscx

Ltszik, hogy n mr teleptettem egy bvtmnyt, amirl majd a 3.2 PCX PowerShell Community Extensions fejezetben lesz sz. Nzzk ezek utn, mit eredmnyez az export-console cmdlet:
[3] PS C:\> Export-Console C:\powershell2\scripts\console [4] PS C:\> Get-Content C:\powershell2\scripts\console.psc1 <?xml version="1.0" encoding="utf-8"?> <PSConsoleFile ConsoleSchemaVersion="1.0"> <PSVersion>1.0</PSVersion> <PSSnapIns> <PSSnapIn Name="Pscx" /> </PSSnapIns> </PSConsoleFile>

Ez a cmdlet egy psc1 kiterjeszts XML fjlt generl, aminek a mlyn ott tallhat azon snapineknek a listja, amelyek nem gyriak. Ha egy ilyen psc1 fjlra dupln kattintunk, vagy a powershell.exe paramtereknt szerepeltetjk, akkor az itt felsorolt

241

PowerShell krnyezet
snapineket automatikusan betlti a konzol. Nzzk, hogy hogyan nzne ki ezzel a powershell.exe felparamterezse:
powershell.exe -PSConsoleFile C:\powershell2\scripts\console.psc1

2.1.7 Profilok
Lttuk, hogy konzolfjlokkal a snapineket tudjuk automatikusan testre szabni. Ennl sokkal tbb lehetsget biztostanak a profilok. A profilok egyszer fjlban trolt szkriptek, amelyek a PowerShell indtsakor automatikusan lefutnak. Kicsit hasonlatosak a Windows StartUp mappihoz. A PowerShellben sszesen ngy klnbz hely van, ahova ltrehozhatjuk a profilunkat: Elrsi t %windir%\system32\WindowsPowerShell\v1.0\ profile.ps1 %windir%\system32\WindowsPowerShell\v1.0\ Microsoft.PowerShell_profile.ps1 Magyarzat Az adott gp sszes felhasznljnak, mindenfajta PowerShelles gykdsre hatssal van. Az adott gp sszes felhasznljnak, de csak az alaphelyzet szerinti Microsoft PowerShell konzol gykdsre van hatssal. Az adott gp adott felhasznljnak, mindenfajta PowerShelles gykdsre hatssal van. Az adott gp adott felhasznljnak csak az alaphelyzet szerinti Microsoft PowerShell gykdsre van hatssal.

%UserProfile%\My Documents\ WindowsPowerShell\profile.ps1 %UserProfile%\\My Documents\ WindowsPowerShell\ Microsoft.PowerShell_profile.ps1

Mit jelent az, hogy "Microsoft PowerShell gykds"? Azt, hogy nem felttlenl csak a hagyomnyos "DOS" ablakos kinzetet veheti fel a PowerShell, egyb gyrtk ms, akr grafikus felleteket is csinlhatnak. Na, ilyen esetekben nekik lehet kln profil fjljuk is a Microsoftoshoz kpest. Ilyen profilban meghvhatok include jelleg, fggvnyknyvtrak betltst vgz szkripteket, testre szabhatjuk a promptot, globlis vltozkat definilhatok, de akr mg snapineket is betlthetek. n a sorszmozott promptomhoz egy globlis $promptno vltozt s a prompt testre szabott fggvnydefincijt tettem bele egy ilyen profilba.

242

Gyakorlat

2.1.8 rktsk meg munknkat (start-transcript)


A PowerShell magnknt is tud mkdni, azaz az sszes parancssort, amit mi begpelnk, s az sszes kimenetet, amit kapunk a konzolra kpes elmenteni automatikusan egy fjlba. Ezt az zemmdot a start-transcript cmdlettel tudjuk elindtani, s a stop-transcript-tel meglltani:
[6] PS C:\> Start-Transcript Transcript started, output file is C:\Documents and Settings\Administrator\ My Documents\PowerShell_transcript.20080421212835.txt [7] PS C:\> $a = "Valaki figyel!" [8] PS C:\> $a.Split() Valaki figyel! [9] PS C:\> Stop-Transcript Transcript stopped, output file is C:\Documents and Settings\Administrator\ My Documents\PowerShell_transcript.20080421212835.txt

Ha nem adjuk meg, hogy milyen fjlba rgztsen, akkor az aktulis felhasznl dokumentumknyvtrba ment, dtummal, idvel elltott nev szveges fjlba. Nzzk, hogy hogyan nz ki egy ilyen fjl:
[11] PS C:\> Get-Content 'C:\Documents and Settings\Administrator\My Documen ts\PowerShell_transcript.20080421212835.txt' ********************** Windows PowerShell Transcript Start Start time: 20080421212835 Username : ASUS\Administrator Machine : ASUS (Microsoft Windows NT 5.2.3790 Service Pack 2) ********************** Transcript started, output file is C:\Documents and Settings\Administrator\ My Documents\PowerShell_transcript.20080421212835.txt [7] PS C:\> $a = "Valaki figyel!" [8] PS C:\> $a.Split() Valaki figyel! [9] PS C:\> Stop-Transcript ********************** Windows PowerShell Transcript End End time: 20080421212912 **********************

Ltszik, hogy mindent, mg a promptokat is szrl-szra rgztette fejlc s lblc informcik kztt. Ennek a fjlnak egyfajta feldolgozsra ltunk pldt a 2.3.4 Sortrs kezelse szvegfjlokban fejezetben.

243

PowerShell krnyezet

2.1.9 Stopperoljuk a futsi idt s vrakozzunk (measure-command, start-sleep)


Bizonyos esetekben fontos lehet a szkriptnk futsnak hatkonysga, melynek egyik ismrve, hogy milyen gyorsan fut le a szkript. Szerencsre nem kell stopperrval a keznkben figyelni a konzolt, mert a PowerShell rendelkezik beptett stopperrel, melyet a measure-command cmdlettel tudunk zembe helyezni. Pldul stopperoljuk le, hogy mennyi ideig tart vgiglistzni a c:\ meghajt sszes alknyvtrt s fjljt:
[5] PS C:\> Measure-Command {get-childitem c:\ -recurse} Days Hours Minutes Seconds Milliseconds Ticks TotalDays TotalHours TotalMinutes TotalSeconds TotalMilliseconds : : : : : : : : : : : 0 0 0 33 306 333067130 0,000385494363425926 0,00925186472222222 0,555111883333333 33,306713 33306,713

Lthatjuk, hogy a measure-command paramtere egy szkriptblokk, kimenete egy timespan tpus objektum, amelyben mindenfle mrtkegysgben lthatjuk az eltelt idt. Ha egy szkriptnknl pont az lenne a feladat, hogy ne legyen tl gyors, mert pldul percenknt kellene, hogy valamilyen paramtert kiolvassunk, akkor a start-sleep cmdlettel tudunk vrakozni:
[12] PS C:\> get-date; start-sleep 10; get-date 2008. prilis 24. 22:40:59 2008. prilis 24. 22:41:09

A fenti pldban 10 msodpercet vrakoztam, ha rvidebb vrakozsi idre van szksg, akkor milliseconds paramterrel lehet ezt megadni. A measure-command s a start-sleep kombinlsval lehet olyan ciklust rni, ami pldul pontosan minden egsz percben fut le. Azaz mrhetjk, hogy mennyi ideig tart a futsa egy ciklusnak, majd kiegsztsknt annyit vrunk, hogy a kvetkez perc elejn induljon jra a ciklusunk.

244

Gyakorlat

2.1.10 Elrehalads jelzse (write-progress)


Ha mr idmrs s vrakozs, akkor rdemes megemlteni, hogy szp progress bar-t, azaz elrehalads-jelzt is megjelenthetnk PowerShellben a write-progress cmdlet segtsgvel. Ez fleg akkor hasznos, ha idignyesebb valamelyik parancssorunk, szkriptnk s nyomon szeretnnk kvetni, hogy tnylegesen hol is tart a futs. Pldaknt nzznk egy analg rt:
ra 12 [oooooooooooooooooooooooooooooooo Perc 53 [oooooooooooooooooooooooooooooooooooooooooooooooooooooo MP 53 [oooooooooooooooooooooooooooooooooooooooooooooooooooo

] ] ]

[91] PS C:\>while ($true) { >> $t = Get-Date >> $ra = $t.hour >> $perc = $t.Minute >> $mp = $t.Second >> Write-Progress -Activity "ra" -status "$ra" -Id 1 -PercentComplete ($ a/24*100) >> Write-Progress -Activity "Perc" -status "$perc" -Id 2 -ParentId 1 -Perce tComplete ($perc/60*100) >> Write-Progress -Activity "MP" -status "$mp" -ParentId 2 -PercentComplete ($mp/60*100) >> Start-Sleep -Seconds 1 >> } >>

Sajnos nyomtatsban nem annyira szp a kp, nem ltszik az ablak tetejn a trkizes httrsznen, de a kis karikkbl ll elrehalads-jelzt azrt lthat. Maga a szkript, ami ezt produklja a kariks sorok alatt tallhat. Egy while ciklusban folyamatosan kiolvasom az aktulis rendszeridt, sztszedem kln ra, perc, msodpercre. Ezutn jn a lnyegi rsz. Az egyes cskoknak adhatok cmkt (Activity paramter), sttusz cmkt (Status), azonost szmot (Id paramter), az elrehalads rtkt (0 s 100 kztti szm, PercentComplete paramter). Ltszik, hogy a kijelzk egymsba is gyazhatk, ha definilom a ParentID paramterrel a szl cskot. Ekkor a gyerek a szl alatt fog megjelenni, kicsit beljebb.

245

Hibakezels

2.2 Hibakezels
Az elmleti rszben nem foglalkoztam hibkkal, hiszen elmletileg minden tkletes , na de a gyakorlat! Nzzk meg, hogy a PowerShell milyen lehetsgeket nyjt a hibk detektlsra, elhrtsra, illetve milyen lehetsgek vannak arra, ha a felmerl hibkat n a szkriptemben akarom lekezelni.

2.2.1 Megszakt s nem megszakt hibk


Elsknt nzznk pr fogalmat. A PowerShellben kt hibafajta van, a terminating error, azaz a futst mindenkppen megszakt, s a nonterminating error, azaz a futst nem felttlenl megszakt hiba. Megszakt hibk pldul a szintaktikai hibk, amikor elgpelnk valamit. Vagy pldul amikor nullval szeretnnk osztani. Mi magunk is generlhatunk ilyen hibkat a korbban mr ltott throw kulcsszval, amikor pldul egy fggvnynknek nem ad t a felhasznl minden fontos paramtert. Elfordulhatnak olyan hibk, amelyek elllsakor nem kvnjuk, hogy a szkript futsa megszakadjon, de azrt szeretnnk rteslni ezekrl. Ez fleg olyan cmdleteknl s fggvnyeknl jhet jl, amelyek cselemeket dolgoznak fel, s egy-kt cselem esetben megengedjk, hogy ne fusson le a szkript, de azrt a tbbi elemre nyugodtan prblkozzon. Nzznk pldt a ktfajta hibra, elsknt a megszakt hibra, rgtn kt pldt is:
[7] PS C:\old> "Eleje"; 15/0; "Vge" Attempted to divide by zero. At line:1 char:13 + "Eleje"; 15/0 <<<< ; "Vge"

A [7]-es sorban 0-val osztok. Ez olyannyira terminating, hogy mr a parancssor ellenrzse sorn kiszrja ezt a hibt, s mr az Eleje sem fut le.
[8] PS C:\old> "Eleje"; throw "kakukk"; "Vge" Eleje kakukk At line:1 char:15 + "Eleje"; throw <<<< "kakukk"; "Vge"

A [8]-as sorban n magam okoztam egy megszakt hibt a throw kulcssz segtsgvel. Most nzznk nem megszakt hibra pldt:
[9] PS C:\old> "Eleje"; Remove-Item c:\old\nincs.txt; "Vge" Eleje Remove-Item : Cannot find path 'C:\old\nincs.txt' because it does not exist . At line:1 char:21

246

Gyakorlat
+ "Eleje"; Remove-Item Vge <<<< c:\old\nincs.txt; "Vge"

A fenti pldban nem megszakt hiba trtnt, amikor trlni akartam egy nem ltez fjlt, ugyan hibt kaptam, de kirsra kerlt a Vge is. Mi magunk is befolysolhatjuk a hibk lefolyst. Akr parancsonknt vagy akr az adott konzolra vonatkozan is. Elszr nzzk, hogy a cmdletek esetben mit tehetnk. A parancsokhoz tartoz sgkban legtbbszr valami hasonlt ltunk:
[18] PS C:\old> (get-help remove-item).syntax Remove-Item [-path] <string[]> [-recurse] [-force] [-include <string[]>] [exclude <string[]>] [-filter <string>] [-credential <PSCredential>] [-whatI f] [-confirm] [<CommonParameters>] Remove-Item [-literalPath] <string[]> [-recurse] [-force] [-include <string []>] [-exclude <string[]>] [-filter <string>] [-credential <PSCredential>] [-whatIf] [-confirm] [<CommonParameters>]

Nzzk meg, a CommonParameters mi lehet? Paramter Verbose Debug ErrorAction Magyarzat Bbeszdes kimenetet ad a mvelet lefolysrl. Hibakeres informcikat ad, s interaktv mdon lekezelhetk a hibk. Az elzhz hasonl, de nem csak interaktvan, hanem fixen bellthat hibakezelsi md: Continue [default] - folytat, Stop - megll, SilentlyContinue figyelmeztets nlkl tovbbmegy, Inquire - rkrdez. Sajt hibavltoznk neve ($ jel nlkl!). A $error vltoz mellett ide is betltdik a hibt ler objektum. Kimenetet ide tlti be. Az objektum-puffer mrete, ennyi elemet magban tart, mieltt tovbbtja az outputot a kvetkez csszakasznak.

ErrorVariable OutVariable OutBuffer

A -debug paramter pont a mostani tmnkba vg, nzzk, milyen opcikat knl:
[23] PS C:\old> "Eleje"; get-content blabla.txt -debug; "Vge" Eleje Confirm Cannot find path 'C:\old\blabla.txt' because it does not exist. [Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help (default is "Y"):h Get-Content : Command execution stopped because the user selected the Halt option. At line:1 char:21

247

Hibakezels
+ "Eleje"; get-content <<<< blabla.txt -debug; "Vge"

Lthatjuk, hogy ezzel a paramterrel a nem megszakt hibk lefolysrl dnthetnk interaktv mdon. Ha a Halt opcit vlasztom, akkor kirta a meglls okt, s a Vge nem futott le. Nzznk, hogy hogyan viselkedik ms vlasz esetn:
[24] PS C:\old> "Eleje"; get-content blabla.txt -debug; "Vge" Eleje Confirm Cannot find path 'C:\old\blabla.txt' because it does not exist. [Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help (default is "Y"):a Get-Content : Cannot find path 'C:\old\blabla.txt' because it does not exis t. At line:1 char:21 + "Eleje"; get-content <<<< blabla.txt -debug; "Vge" Vge

Ha Yes vagy Yes to All opcit vlasztom, akkor a cmdlet gy fut le, ahogy eddig lttuk a nem megszakt hibknl, azaz kirta a hibt, de tovbb futott. Nzzk a tovbbi vlasztsi lehetsgnket:
[25] PS C:\old> "Eleje"; get-content blabla.txt -debug; "Vge" Eleje Confirm Cannot find path 'C:\old\blabla.txt' because it does not exist. [Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help (default is "Y"):s

Ha a Suspend opcit vlasztjuk, akkor a szkript futsa megszakad, s nem is r ki semmilyen tovbbi hibajelzst. Azaz hasonl az eredmny a Halt opci vlasztsakor tapasztaltakhoz, csak itt nem ratunk ki rszletesebb hibalerst. Nzzk a msik tmnkba vg CommonParameter-t, az ErrorAction-t:
[44] PS C:\old> "Eleje"; get-content blabla.txt -ErrorAction Stop; "Vge" Eleje Get-Content : Command execution stopped because the shell variable "ErrorAc tionPreference" is set to Stop: Cannot find path 'C:\old\blabla.txt' becaus e it does not exist. At line:1 char:21 + "Eleje"; get-content <<<< blabla.txt -ErrorAction Stop; "Vge"

Ha a Stop opcit vlasztjuk, akkor a szkript a nem megszakt hibknl is megszaktdik.


[45] PS C:\old> "Eleje"; get-content blabla.txt -ErrorAction SilentlyContinu e; "Vge" Eleje

248

Gyakorlat
Vge

A SilentlyContinue opcival folytatja a szkriptet s nem is ad semmilyen hibajelzst.


[46] PS C:\old> "Eleje"; get-content blabla.txt -ErrorAction Inquire; "Vge" Eleje Confirm Cannot find path 'C:\old\blabla.txt' because it does not exist. [Y] Yes [A] Yes to All [H] Halt Command [S] Suspend [?] Help (default is "Y"):a Get-Content : Cannot find path 'C:\old\blabla.txt' because it does not exis t. At line:1 char:21 + "Eleje"; get-content <<<< blabla.txt -ErrorAction Inquire; "Vge" Vge

Ha az Inquire opcit vlasztjuk, akkor - hasonlan a debug paramter hasznlatakor ltottakhoz - rkrdez a folytats mikntjre.

2.2.2 Hibajelzs kiolvassa ($error)


Az elzekben a hibajelzseket a kpernyn olvastuk el, de ezeket a PowerShell automatikusan egy $error tmbbe gyjti. A [0]-s index elem mindig a legfrissebb hibajelzst tartalmazza, s gy tolja mindig el eggyel a hibkat. Ez azrt j, mert ha ki is kapcsoljuk a hibajelzst (SilentlyContinue), az $error vltoz ennek ellenre rizni fogja a fellp hibt:
[54] PS C:\old> "54Eleje"; get-content blabla.txt -ErrorAction SilentlyConti nue; "54Vge" 54Eleje 54Vge [55] PS C:\old> $error[0] Get-Content : Cannot find path 'C:\old\blabla.txt' because it does not exis t. At line:1 char:23 + "54Eleje"; get-content <<<< blabla.txt -ErrorAction SilentlyContinue; "5 4Vge"

Radsul most mr nem is csodlkozunk a $error elemei is objektumok! Nzzk meg a tagjellemzit:
[59] PS C:\old> $error[0] | gm TypeName: System.Management.Automation.ErrorRecord Name MemberType Definition

249

Hibakezels
---Equals GetHashCode GetObjectData GetType get_CategoryInfo get_ErrorDetails get_Exception get_FullyQualifiedErrorId get_InvocationInfo get_TargetObject set_ErrorDetails ToString CategoryInfo ErrorDetails Exception FullyQualifiedErrorId InvocationInfo TargetObject ---------Method Method Method Method Method Method Method Method Method Method Method Method Property Property Property Property Property Property ---------System.Boolean Equals(Object obj) System.Int32 GetHashCode() System.Void GetObjectData(Serializa... System.Type GetType() System.Management.Automation.ErrorC... System.Management.Automation.ErrorD... System.Exception get_Exception() System.String get_FullyQualifiedErr... System.Management.Automation.Invoca... System.Object get_TargetObject() System.Void set_ErrorDetails(ErrorD... System.String ToString() System.Management.Automation.ErrorC... System.Management.Automation.ErrorD... System.Exception Exception {get;} System.String FullyQualifiedErrorId... System.Management.Automation.Invoca... System.Object TargetObject {get;}

Itt igazbl a tulajdonsgok az rdekesek szmunkra:


[62] PS C:\old> $error[0].categoryinfo Category Activity Reason TargetName TargetType : : : : : ObjectNotFound Get-Content ItemNotFoundException C:\old\blabla.txt String

[63] PS C:\old> $error[0].errordetails [64] PS C:\old> $error[0].fullyqualifiederrorid PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand [65] PS C:\old> $error[0].invocationinfo MyCommand ScriptLineNumber OffsetInLine ScriptName Line PositionMessage : : : : : : Get-Content 1 -2147483648 "54Eleje"; get-content blabla.txt -ErrorAction SilentlyC ontinue; "54Vge"

At line:1 char:23 + "54Eleje"; get-content <<<< blabla.txt -ErrorAction S ilentlyContinue; "54Vge" InvocationName : get-content PipelineLength : 1 PipelinePosition : 1

[66] PS C:\old> $error[0].targetobject

250

Gyakorlat
C:\old\blabla.txt

A CategoryInfo tulajdonsg nmagban nagyon sok mindent elrul a hibrl, amit az InvocationInfo mg tovbbi rszleteket lthatunk. Ezen informcik birtokban tnyleg nem jelenthet gondot a hibk feldertse s elhrtsa.

2.2.3 Hibakezels globlis paramterei


Az elzekben ltott hibakezelsi mdszerek gy mkdtek, hogy egy adott cmdletnl lltottam be a CommonParameter-ek segtsgvel, hogy az hogyan reagljon egy hibra. Azonban ez elg nehzkes egy hosszabb szkript esetben. Szerencsre ezt a fajta mkdst szerencsre globlisan is bellthatjuk. Nzzk meg, hogy milyen errorral kapcsolatos vltozink vannak:
[69] PS C:\old> Get-ChildItem variable:\*error* Name ---Error ReportErrorShowSource ReportErrorShowStackTrace ReportErrorShowExceptionClass ErrorActionPreference MaximumErrorCount ReportErrorShowInnerException ErrorView Value ----{PathNotFound,Microsoft.PowerShell.Comman... 1 0 0 Continue 256 0 NormalView

Nzzk ezek kzl azoknak a magyarzatt, amelyek a mindennapi hasznlatkor rdekesek: Vltoz $Error $ErrorActionPreference Magyarzat A korbban mr ltott hibajelzsek tmbje. Globlis hibakezelsi md: Continue [default] - folytat, Stop - megll, SilentlyContinue figyelmeztets nlkl tovbbmegy, Inquire - rkrdez. Az $error tmb maximlis mrete. Az ennl rgebbi (nagyobb sorszm) hibajelzsek kihullnak a tmbbl. A hibajelzsek nzete: Normal vagy CategoryView

$MaximumErrorCount $ErrorView

251

Hibakezels

2.2.4 Hibakezels sajt fggvnyeinkben (trap)


Az eddigi sok okossgot a hibakezelssel kapcsolatban mind a cmdletek fejlesztinek ksznhetjk. Azaz hogy egy cmdlet rendelkezik az ErrorAction paramterrel, s ennek klnbz rtkeire hogyan reagl, az mind leprogramozand. Ha mi ksztnk egy fggvnyt vagy szkriptet, s abban mi is figyelembe akarjuk venni a globlis $ErrorActionPreference vltoz rtkt, vagy mi is implementlni akarjuk az -ErrorAction paramtert, akkor ezt a fggvnynk, szkriptnk belsejben neknk le kell programozni. Ehhez a PowerShell nyelvi szinten a trap kulcsszt biztostja. Ennek szintaxisa gy nz ki:
trap [ExceptionType] {code; keyword}

A trap-pel teht t lehet venni a vezrlst a hibk felmerlsekor. Nzznk erre pr pldt:
trap { "Hibajelensg: $_" } Remove-Item c:\nemltezfile.txt

A fenti plda egy szkript, nzzk mit ad ez kimenetknt, ha lefuttatom:


[2] PS C:\powershell2\scripts> .\trap1.ps1 Remove-Item : Cannot find path 'C:\nemltezfile.txt' because it does not e xist. At C:\powershell2\scripts\trap1.ps1:6 char:12 + Remove-Item <<<< c:\nemltezfile.txt

Nem sok mindent. Mivelhogy a trap csak megszakt hibkra led fel, azaz a fenti nem megszakt hibt t kell alaktani megszakt hibv. Nzzk a mdostott szkriptet:
trap { "Hibajelensg: $_" } Remove-Item c:\nemltezfile.txt -ErrorAction Stop

Itt mr mindenkppen megllttatom a cmdlet futst brmilyen hibajelensgre. s ennek kimenete:


[4] PS C:\powershell2\scripts> .\trap2.ps1 Hibajelensg: Command execution stopped because the shell variable "ErrorAc tionPreference" is set to Stop: Cannot find path 'C:\nemltezfile.txt' bec ause it does not exist.

252

Gyakorlat
Remove-Item : Command execution stopped because the shell variable "ErrorAc tionPreference" is set to Stop: Cannot find path 'C:\nemltezfile.txt' bec ause it does not exist. At C:\powershell2\scripts\trap2.ps1:6 char:12 + Remove-Item <<<< c:\nemltezfile.txt -ErrorAction Stop

Itt mr megjelenik az n trap kdom. A trap megkapja a hibt jelz objektumot a $_ vltozba, amit ki is rtam. Viszont nem rendelkeztem arrl, hogy a sajt hibakezel rutinom lefutsa utn mi trtnjen, gy utna visszakapja a vezrlst a PowerShell, ami szintn kirja a hibajelzst. Ez felesleges, gy mdostsuk a hibakezelst:
trap { "Hibajelensg: $_" continue } Remove-Item c:\nemltezfile.txt -ErrorAction Stop

Ebben a vltozatban a trap szkriptblokkjba elhelyeztem egy continue kulcsszt, ami azt jelzi a PowerShellnek, hogy mr minden rendben, neki mr nem kell foglalkozni a hibval. Nzzk ekkor a kimenetet:
[5] PS C:\powershell2\scripts> .\trap3.ps1 Hibajelensg: Command execution stopped because the shell variable "ErrorAc tionPreference" is set to Stop: Cannot find path 'C:\nemltezfile.txt' bec ause it does not exist.

Fejlesszk tovbb a kdot, j lenne kicsit hasznosabb informcikat is kirni a hibrl:


trap { "Hibajelensg: $_" "-------- Rszletek --------------" $_.Exception.GetType().FullName $_.InvocationInfo "-------- Rszletek vge ---------" continue } Remove-Item c:\nemltezfile.txt -ErrorAction Stop

Nzzk ennek a kimenett:


[37] PS C:\powershell2\scripts> .\trap4.ps1 Hibajelensg: Command execution stopped because the shell variable "ErrorAc tionPreference" is set to Stop: Cannot find path 'C:\nemltezfile.txt' bec ause it does not exist. -------- Rszletek -------------System.Management.Automation.ActionPreferenceStopException

253

Hibakezels
MyCommand ScriptLineNumber OffsetInLine ScriptName Line PositionMessage : : : : : : Remove-Item 11 12 C:\powershell2\scripts\trap4.ps1 Remove-Item c:\nemltezfile.txt -ErrorAction Stop

At C:\powershell2\scripts\trap4.ps1:11 char:12 + Remove-Item <<<< c:\nemltezfile.txt -ErrorAction St op InvocationName : Remove-Item PipelineLength : 1 PipelinePosition : 1 -------- Rszletek vge ---------

A Rszletek els eleme a hibajelensg tpusa, azaz az ExceptionType. Jelen esetben ez egy: System.Management.Automation.ActionPreferenceStopException tpus hiba. Ha csak bizonyos tpus hibkra szeretnm, hogy a trap-em reagljon, akkor ezt a tpuselnevezst kell a trap paramtereknt berni (lsd nemsokra). Ezutn kirattam a hibaobjektum InvocationInfo paramtert, ami termszetesen nmaga is egy objektum, gy annak is szmos tulajdonsga van. Ezen tulajdonsgok kztt lthatjuk, hogy milyen parancs vgrehajtsa sorn lpett fel a hiba, milyen szkriptben, mi volt a teljes parancssor, stb. Ezek az informcik hasznos segtsget nyjtanak a hiba feldertsben. Nzzk, mit kapunk, ha egy msik hibajelensget kap a trap-em, mondjuk egy nullval val osztst:
trap { "Hibajelensg: $_" "-------- Rszletek --------------" $_.Exception.GetType().FullName $_.InvocationInfo "-------- Rszletek vge ---------" continue } $nulla = 0 8/$nulla

Kicsit trkkzni kellett, hiszen korbban lttuk, hogy ha kzvetlenl ezt rnm. 8/0, akkor azt mr maga a parancsrtelmez kiszrn, s u.n. nontrappable, azaz nem elkaphat hibaknt kezeln. Ezrt elrejtem egy vltozba a nullt, s gy osztok vele. Nzzk a kimenetet:
[38] PS C:\powershell2\scripts> .\trap5.ps1 Hibajelensg: Attempted to divide by zero. -------- Rszletek -------------System.DivideByZeroException

254

Gyakorlat

MyCommand ScriptLineNumber OffsetInLine ScriptName Line PositionMessage

: : : : : :

12 3 C:\powershell2\scripts\trap5.ps1 8/$nulla

At C:\powershell2\scripts\trap5.ps1:12 char:3 + 8/$ <<<< nulla InvocationName : / PipelineLength : 0 PipelinePosition : 0 -------- Rszletek vge ---------

Ltjuk a rszletek els sorban, hogy ez egy msfajta hiba, egy System.DivideByZeroException tpus. Ezek utn, ha n csak az ilyen fajta hibkat akarom lekezelni, akkor a trap defincijt kell mdostani:
trap [System.DivideByZeroException] { "Hibajelensg: $_" "-------- Rszletek --------------" $_.Exception.GetType().FullName $_.InvocationInfo "-------- Rszletek vge ---------" continue } $nulla = 0 8/$nulla Remove-Item nemltezfile.txt

Ebben a szkriptben a trap mellett lthat annak a hibatpusnak a neve, amire szeretnnk, ha a trap-nk reaglna. Az sszes tbbi hibafajtt a PowerShell fogja lekezelni. A szkript vgn ktfajta hibt okoz mveletet hajtok vgre. Nzzk, hogyan reagl ezekre a trap:
[39] PS C:\powershell2\scripts> .\trap6.ps1 Hibajelensg: Attempted to divide by zero. -------- Rszletek -------------System.DivideByZeroException MyCommand ScriptLineNumber OffsetInLine ScriptName Line PositionMessage : : : : : :

12 3 C:\powershell2\scripts\trap6.ps1 8/$nulla At C:\powershell2\scripts\trap6.ps1:12 char:3

255

Hibakezels
+ 8/$ <<<< nulla InvocationName : / PipelineLength : 0 PipelinePosition : 0 -------- Rszletek vge --------Remove-Item : Cannot find path 'C:\powershell2\scripts\nemltezfile.txt' b ecause it does not exist. At C:\powershell2\scripts\trap6.ps1:14 char:12 + Remove-Item <<<< nemltezfile.txt

Lthatjuk, hogy csak egyszer fut le az n hibakezel kdom, a nullval val osztsra. A nem ltez fjl trlsekor a PowerShell eredeti hibakezelje futott le. Az ilyen hibatpusokat legegyszerbben megtapasztals ltal lehet felderteni vagy egy ltalnos trapkezel rutinnal, vagy az $error tmb elemeinek vizsglatval. Ha valaki elre fel akar kszlni a lehetsges hibkra, akkor a .NET Framework System.Exception leszrmaztatott objektumait kell nzni, pldul a mr emltett Reflector programmal:

47. bra Exception tpusok a .NET Frameworkben a Reflector programmal szemllve

256

Gyakorlat
Nagyon sok ilyen hibatpus van, gy valszn a megtapasztals ltal knnyebben eredmnyre jutunk.

2.2.4.1 Tbbszint csapda


Az elbb ltott trap-eket (csapdkat) a szkriptnk brmelyik szintjn hasznlhatjuk: a globlis scope-ban, szkriptek vagy fggvnyek al-scope-jaiban is. Ha egy mlyebb szinten trap ltal lekezelt hibaesemny lp fel, akkor az bellthat mdon a magasabb szinteken is jelezhet hibt. Nzzk azt az esetet, amikor van egy szkriptem, benne egy f trap, egy fggvny s abban is egy trap, a vgn meg a fggvny segtsgvel nullval osztok:
trap { Write-Error "Kls trap" } function bels ($oszt) { trap { Write-Error "Bels trap" } 20/$oszt } bels 0

Nzzk, hogy mi trtnik, ha futtatom ezt:


[1] PS C:\powershell2\scripts> .\nestedtrap.ps1 bels : Bels trap At C:\powershell2\scripts\nestedtrap.ps1:16 char:6 + bels <<<< 0 Attempted to divide by zero. At C:\powershell2\scripts\nestedtrap.ps1:13 char:5 + 20/$ <<<< oszt

Ltszik, hogy a bels trap ledt fel, s mivel nem mondtuk, hogy folytathatja, ezrt ki is szll a futtatsbl a program, megkapjuk mg a PowerShell sajt hibajelzst is. Mdostsuk a bels trap-et, mondjuk neki, hogy folytathatja:
trap { Write-Error "Kls trap" } function bels ($oszt) { trap

257

Hibakezels
{ Write-Error "Bels trap" continue } 20/$oszt } bels 0

Nzzk ennek is a kimenett:


[5] PS C:\powershell2\scripts> .\nestedtrap.ps1 bels : Bels trap At C:\powershell2\scripts\nestedtrap.ps1:17 char:6 + bels <<<< 0

Itt ugye az trtnt, hogy a bels trap egy folytatssal (continue) zrult le, gy a kls krnyezet mr errl a hibrl nem is rteslt, azt hiszi, minden rendben. Zrjuk le akkor a bels trap-et egy break-kel:
trap { Write-Error "Kls trap" } function bels ($oszt) { trap { Write-Error "Bels trap" break } 20/$oszt } bels 0

Ennek kimenete:
[6] PS C:\powershell2\scripts> .\nestedtrap.ps1 bels : Bels trap At C:\powershell2\scripts\nestedtrap.ps1:17 char:6 + bels <<<< 0 C:\powershell2\scripts\nestedtrap.ps1 : Kls trap At line:1 char:16 + .\nestedtrap.ps1 <<<< Attempted to divide by zero. At C:\powershell2\scripts\nestedtrap.ps1:14 char:5 + 20/$ <<<< oszt

258

Gyakorlat
Itt mr mindkt szint trapje megjelenik, hiszen a bels trap rendhagy mdon, egy megtrssel (break) rt vget, ami kvlrl nzve is hibt jelez. Ezrt a kls trap is fellesedik s az is jelzi a hibt. Mindezek figyelembevtelvel el lehet dnteni, hogy hol rdemes, s a mkds szempontjbl hol kell trapet elhelyezni.

2.2.4.2 Dobom s elkapom


Gyakori hibakezelsi feladat, hogy a fggvnynk, szkriptnk hasznlata sorn nem ad meg valaki valamilyen ktelez paramtert. Ennek kezelsre mr lttuk a throw kulcsszt a 1.8 Fggvnyek fejezet 1.8.2.3 Hibajelzs alfejezetben1.8.2.3, de ennek hatsra megjelen hibajelzs nem annyira szp, mert nem csak az ltalunk megadott szveg kerl kirsra, hanem egyb szvegek is. Addik az tlet, hogy akkor kapjuk el egy trappel az ltalunk throw-val dobott hibajelzst, s szabjuk testre a trap kdjban a hibajelzst. Ksztettem egy jabb szkriptet az elzek alapjn:
trap { "Hibajelensg: $_" "-------- Rszletek --------------" $_.Exception.GetType().FullName $_.InvocationInfo "-------- Rszletek vge ---------" continue } function dupla ($v = $(throw "Adj meg paramtert!")) { $v*2 } dupla

A trap rsze nem nagyon vltozott, s ott van mellette a korbban mr ltott duplz fggvnyem, hibajelzssel a paramterhiny esetre. A szkript legvgn meghvom magt a dupla fggvnyt mindenfle paramter nlkl. Mindennek ez lesz az eredmnye:
[49] PS C:\powershell2\scripts> .\trap7.ps1 Hibajelensg: Adj meg paramtert! -------- Rszletek -------------System.Management.Automation.RuntimeException MyCommand ScriptLineNumber OffsetInLine ScriptName Line PositionMessage : : : : : :

11 29 C:\powershell2\scripts\trap7.ps1 function dupla ($v = $(throw "Adj meg paramtert!"))

259

Hibakezels
At C:\powershell2\scripts\trap7.ps1:11 char:29 + function dupla ($v = $(throw <<<< "Adj meg paramtert !")) InvocationName : throw PipelineLength : 0 PipelinePosition : 0 -------- Rszletek vge ---------

Tnyleg mkdik a throw elkapsa, csak az n ltalam megadott hibajelzs jelent meg, viszont elg ltalnosnak tnik a hiba tpusa: System.Management.Automation.RuntimeException. Ez nem tl specifikus, ltalnos futsi hiba. Viszont lehetnk specifikusabbak, adjunk a throw-val egy rtelmesebb hibaobjektumot a trap szmra, azaz ne csak egy egyszer szveget adjunk neki, hanem egy megfelel Exception objektumot!
trap { "Hibajelensg: $_" "-------- Rszletek --------------" $_.Exception.GetType().FullName $_.InvocationInfo "-------- Rszletek vge ---------" continue } function dupla ($v = $(throw ` (New-Object System.ArgumentException ` -arg "Adjl meg valamit, amit duplzni lehet!"))) { $v*2 } dupla

En gy gondoltam, hogy az ilyen jelleg hiba lersra a System.ArgumentException tpus lesz a legjobb, gy ennek egy objektumt hozom ltre a throw paramtereknt. Radsul ennek az objektumnak a konstruktora argumentumot is kpes fogadni, az ltalam megadott hibalerst szveggel. gy mr nagyon elegns s hiba specifikus lesz a kimenete is:
[50] PS C:\powershell2\scripts> .\trap8.ps1 Hibajelensg: Adjl meg valamit, amit duplzni lehet! -------- Rszletek -------------System.ArgumentException MyCommand ScriptLineNumber OffsetInLine ScriptName : : 11 : 29 : C:\powershell2\scripts\trap8.ps1

260

Gyakorlat
Line PositionMessage : function dupla ($v = $(throw ` : At C:\powershell2\scripts\trap8.ps1:11 char:29 + function dupla ($v = $(throw <<<< ` InvocationName : throw PipelineLength : 0 PipelinePosition : 0 -------- Rszletek vge ---------

gy mr specifikusabb trap-et is lehet kszteni, ami csak erre a hibatpusra led fel.

2.2.5 Nem megszakt hibk kezelse fggvnyeinkben


A trap trgyalsnak elejn mr lthattuk, hogy hibakezelst csak megszakt hibkra tudunk kszteni, legfeljebb a trap vgre tett continue kulcsszval talaktjuk a hibt nem megszaktra. De vajon hogyan tudunk nem megszakt hibkat kezelni? Erre nincs kln kulcssz, a tbbi PowerShelles nyelvi eszkzzel kell ezt megoldani. Az egyik ilyen helyzet, hogy a nem megszakt hibt nem akarom csak azrt megszaktv alaktani, hogy aztn egy continue-val elnyomhassam a hibajelzst, hanem eleve nem akarok ltni semmilyen hibainformcit a konzolon. Ehhez azt kell tudni, hogy kln outputja van a hibajelzseknek, gy lehet olyat is csinlni, hogy csak ezeket a hibajelzseket kldjk t egy fjlba, vagy akr a semmibe. Nzznk erre pldt:
[43] PS C:\> Remove-Item nemltezfjl.txt 2> $null

Ez teht a 2> opertor, ami a 2-es szm outputot, a hibajelzsek outputjt irnytja a semmibe. (Amgy 1> nem ltezik, csak a kettessel kezdd vltozat.) Ha pont ellenttes lenne a feladat, azaz valami egyedi, sajt hibajelzst szeretnnk adni a gyri jelzs helyett, arra kln write-... kezdet cmdletek llnak rendelkezsnkre. Ezekkel szintn nem a norml outputra, hanem erre a hibajelzsek szmra elklntett outputra kldhetjk a jelzst.
[67] PS C:\powershell2\scripts> filter bulk-remove >> { >> if (-not (Test-Path $_)) >> { Write-Warning "Nincs ilyen file: $_!" } >> else >> { Remove-Item $_ } >> } >>

A fenti filter kifejezssel definilok egy olyan fjltrl fggvnyt, amely elszr ellenrzi, hagy van-e ott tnylegesen fjl, amit megadott a felhasznl, s ha nincs, akkor nem csnya hibajelzst ad, hanem csak egy srga szn figyelmeztetst a writewarning cmdlet segtsgvel.

261

Hibakezels
[68] PS C:\powershell2\scripts> "nincs.txt", "file.txt" | bulk-remove WARNING: Nincs ilyen file: nincs.txt!

Ez azrt is j, mert ez nem kerl be a $error tmbbe, gy nem terheli azt. Termszetesen lehetne piros felirat write-error-t is hasznlni, ekkor olyan hibajelzst kapunk, ami bekerl az $error tmbbe. Nem csak ilyen kvetkezmnyei vannak a write-error s write-warning hasznlatnak. Ha tlltjuk a kvetkez automatikus vltozkat, akkor szablyozhatjuk fggvnynk, szkriptnk futst is:
[79] PS C:\powershell2\scripts> $WarningPreference Continue [80] PS C:\powershell2\scripts> $ErrorActionPreference Continue

Termszetesen a write-error mg profibb tehet az Exception objektumok hasznlatval:


filter bulk-remove { if (-not (Test-Path $_)) { Write-Error -Exception ` (New-Object System.IO.FileNotFoundException ` -arg "Nincs ilyen file!",$_) } else { Remove-Item $_ } }

s ennek kimenete hiba esetn:


[82] PS C:\powershell2\scripts> "semmi.txt" | bulk-remove bulk-remove : Nincs ilyen file! At line:1 char:25 + "semmi.txt" | bulk-remove <<<< [83] PS C:\powershell2\scripts> $error[0].exception.gettype() IsPublic IsSerial Name -------- -------- ---True True FileNotFoundException BaseType -------System.IO.IOE...

A [83]-as sorban lthatjuk, hogy ez a hiba mr igazi FileNotFoundException lett.

2.2.6 Hibakeress
Akrmennyire sok lehetsgnk van a hibk jelzsre (write-warning, writeerror s trap), kezelsre mgsem minden esetben elg ez. Fleg akkor, ha a

262

Gyakorlat
szkriptnk a maga mdjn jl mkdik, csak ppen mi rossz programot rtunk. Ilyenkor van szksg a dibggolsra, azaz a hibakeressre. Erre is lehetsget biztost a PowerShell, br valszn egy bizonyos bonyolultsg felett mr inkbb hasznlunk erre a clra valamilyen grafikus szkriptszerkesztt, mint pldul a PowerGUI Script Editora vagy a PowerShell Plus.

2.2.6.1 Sttusjelzs (write-verbose, write-debug)


Az egyik bogrtalantsi mdszer, hogy jl teletzdeljk a programunkat kiratsi parancsokkal, amelyek segtsgvel a vltozk aktulis llapott rhatjuk ki, illetve jelezhetjk, hogy ppen milyen gon fut a programon. Erre hasznlhatjuk akr a write-host cmdletet, csak az a baj ezzel, hogy a vgleges, kijavtott, telesztelt programbl elg nehz kiszedegetni ezeket. Ezrt talltak ki msfajta kiratsi lehetsgeket is: a write-verbose s a write-debug cmdleteket. Nzznk erre pldt. Van egy faktorilist szmol szkriptem, amit jl teletzdelek write-verbose helyzetjelentsekkel:
Write-Verbose "Eleje" $a = 10; $result = 1 Write-Verbose "Kzepe $a" for($i=1; $i -le $a; $i++) { $result = $result * $i Write-Verbose "`$i = $i, `$result = $result" } Write-Verbose "Vge" $result

Nzzk, mi trtnik, ha futtatom:


[7] PS C:\powershell2\scripts> .\verbose.ps1 3628800

Nem sok mindent ltunk ezen, mintha ott sem lennnek a write-verbose parancsok. Merthogy a write-verbose hatst egy globlis vltozval, a $VerbosePreference-szel lehet ki- s bekapcsolni:
[9] PS C:\powershell2\scripts> $verbosepreference = "continue" [10] PS C:\powershell2\scripts> .\verbose.ps1 VERBOSE: Eleje VERBOSE: Kzepe 10 VERBOSE: $i = 1, $result = 1 VERBOSE: $i = 2, $result = 2 VERBOSE: $i = 3, $result = 6 VERBOSE: $i = 4, $result = 24 VERBOSE: $i = 5, $result = 120 VERBOSE: $i = 6, $result = 720 VERBOSE: $i = 7, $result = 5040 VERBOSE: $i = 8, $result = 40320 VERBOSE: $i = 9, $result = 362880

263

Hibakezels
VERBOSE: $i = 10, $result = 3628800 VERBOSE: Vge 3628800

Sajnos a knyvben nem ltszik, de a VERBOSE: kimenetek szp srgk, hasonlan a Warning jelzsekhez. Ennek tovbbi rtkei lehetnek hasonlan az $ErrorActionPreference vltozhoz SilentlyContinue (alaprtk), Inquire, Stop. Ugyangy mkdik a write-debug cmdlet is, csak az hatst a $DebugPreference vltoz szablyozza. Azaz van kt, egymstl fggetlenl hasznlhat kirat cmdletnk, amelyekkel a szkriptjeink futsnak sttust rathatjuk ki a fejleszts sorn, majd ha kszen vagyunk s meggyzdtnk, hogy minden jl mkdik, akkor anlkl, hogy a szkriptbl ki kellene szedegetni ezeket a sttusjelzseket, egy globlis vltoz belltsval ezek hatst ki tudjuk kapcsolni.

2.2.6.2 Lpsenknti vgrehajts s szigor vltozkezels (set-psdebug)


A msik hibaz mdszer, ha lpsenknt hajtatjuk vgre a szkriptnket s gy jobban mg tudjuk figyelni, hogy merre jr. Azaz nem kell minden sor utn egy write-debug sort beiktatni. Erre is lehetsget biztost a PowerShell a Set-PSDebug cmdlettel. Nzzk meg a szintaxist:
[22] PS C:\powershell2\scripts> (get-help set-psdebug).syntax Set-PSDebug [-trace <int>] [-step] [-strict] [<CommonParameters>] Set-PSDebug [-off] [<CommonParameters>]

Az els vltozatban kapcsolhatjuk be a hibakeressi zemmdot. A trace paramter lehetsges rtkei: 0: kikapcsoljuk a nyomkvetst 1: csak a vgrehajts sorn az aktulis sor szmt jelzi 2: a sorok szma mellett a vltozk rtkadst is jelzi Az elz szkriptet fogom hasznlni, kicsit talaktva:
$a = 3; $result = 1 for($i=1; $i -le $a; $i++) { $result = $result * $i } $result

s akkor nzzk a Trace 1 opcival a futst:

264

Gyakorlat
[29] PS C:\powershell2\scripts> Set-PSDebug -Trace 1 [30] PS C:\powershell2\scripts> .\psdebug.ps1 DEBUG: 1+ .\psdebug.ps1 DEBUG: 1+ $a = 3; $result = 1 DEBUG: 1+ $a = 3; $result = 1 DEBUG: 2+ for($i=1; $i -le $a; $i++) DEBUG: 4+ $result = $result * $i DEBUG: 4+ $result = $result * $i DEBUG: 4+ $result = $result * $i DEBUG: 6+ $result 6

Lthatjuk, hogy szpen kirja az ppen vgrehajtott sorok szmt, meg az ottani parancssor tartalmt is. Nzzk a Trace 2 opci hatst:
[32] PS C:\powershell2\scripts> Set-PSDebug -Trace 2 [33] PS C:\powershell2\scripts> .\psdebug.ps1 DEBUG: 1+ .\psdebug.ps1 DEBUG: ! CALL script 'psdebug.ps1' DEBUG: 1+ $a = 3; $result = 1 DEBUG: ! SET $a = '3'. DEBUG: 1+ $a = 3; $result = 1 DEBUG: ! SET $result = '1'. DEBUG: 2+ for($i=1; $i -le $a; $i++) DEBUG: ! SET $i = '1'. DEBUG: 4+ $result = $result * $i DEBUG: ! SET $result = '1'. DEBUG: ! SET $i = '2'. DEBUG: 4+ $result = $result * $i DEBUG: ! SET $result = '2'. DEBUG: ! SET $i = '3'. DEBUG: 4+ $result = $result * $i DEBUG: ! SET $result = '6'. DEBUG: ! SET $i = '4'. DEBUG: 6+ $result 6

Lthatjuk, hogy az elzek mellett mg a szkripthvst is ltjuk, s minden egyes vltoz rtkadst is az j rtkekkel egytt. Ha mg a step paramtert is hasznljuk, akkor minden sor vgrehajtsra kln rkrdez:
[37] PS C:\powershell2\scripts> Set-PSDebug -Trace 1 -step [38] PS C:\powershell2\scripts> .\psdebug.ps1 Continue with this operation? 1+ .\psdebug.ps1 [Y] Yes [A] Yes to All [N] No (default is "Y"):y DEBUG: 1+ .\psdebug.ps1 Continue 1+ $a [Y] Yes (default with this operation? = 3; $result = 1 [A] Yes to All [N] No is "Y"):y

[L] No to All

[S] Suspend

[?] Help

[L] No to All

[S] Suspend

[?] Help

265

Hibakezels
DEBUG: Continue 1+ $a [Y] Yes (default 1+ $a = 3; $result = 1 with this operation? = 3; $result = 1 [A] Yes to All [N] No is "Y"):s

[L] No to All

[S] Suspend

[?] Help

Ekkor vlaszthatunk, hogy tovbb lpnk egy sorral (Yes), folytatjuk a futtatst vgig (Yes to All), megszaktjuk a futtatst (No s No to All). A Suspend nmn lltja meg a futtatst, nem lesz hibajelzs a rendkvli programmegszaktsrl. A strict kapcsol hasznlata utn csak olyan vltozkra hivatkozhatunk, amelynek korbban adtunk kezdrtket:
[41] PS C:\powershell2\scripts> Set-PSDebug -strict [42] PS C:\powershell2\scripts> $c=1 [43] PS C:\powershell2\scripts> $c 1 [44] PS C:\powershell2\scripts> $d The variable $d cannot be retrieved because it has not been set yet. At line:1 char:2 + $d <<<<

A fenti pldban a $c rtkads utn lekrdezhet volt, szemben a $d-vel, amire hibajelzst kaptunk, hiszen nem adtam neki kezdrtket. Ha mr nincs szksgnk a Set-PSDebug-gal belltott hibafeldert zemmdokra, akkor az Off kapcsolval kapcsolhatjuk ki ezekez:
[45] PS C:\powershell2\scripts> Set-PSDebug -off [46] PS C:\powershell2\scripts> $d [47] PS C:\powershell2\scripts>

Itt lthat, hogy mr nem okozott hibajelzst az rtkads nlkli $d-re val hivatkozs.

2.2.6.3 ssunk mg mlyebbre (Trace-Command)


Ha mg ez sem lenne elg, akkor mg mlyebbre shatunk a Trace-Command cmdlet segtsgvel. Igazbl ez nem biztos, hogy a rendszergazdk mindennapos eszkze lesz, inkbb azon fejlesztk tudnak profitlni hasznlatbl, akik cmdleteket fejlesztenek. Nzzk a szintaxist:
[5] PS I:\>(get-help trace-command).syntax Trace-Command [-name] <string[]> [-expression] <scriptblock> [[-option] {<N one> | <Constructor> | <Dispose> | <Finalizer> | <Method> | <Property> | <D elegates> | <Events> | <Exception> | <Lock> | <Error> | <Errors> | <Warning > | <Verbose> | <WriteLine> | <Data> | <Scope> | <ExecutionFlow> | <Assert> | <All>}] [-filePath <string>] [-debugger] [-pSHost] [-listenerOption {<No ne> | <LogicalOperationStack> | <DateTime> | <Timestamp> | <ProcessId> | <T

266

Gyakorlat
hreadId> | <Callstack>}] [-inputObject <psobject>] [-force] [<CommonParamet ers>] Trace-Command [-name] <string[]> [-command] <string> [[-option] {<None> | < Constructor> | <Dispose> | <Finalizer> | <Method> | <Property> | <Delegates > | <Events> | <Exception> | <Lock> | <Error> | <Errors> | <Warning> | <Ver bose> | <WriteLine> | <Data> | <Scope> | <ExecutionFlow> | <Assert> | <All> }] [-filePath <string>] [-debugger] [-pSHost] [-listenerOption {<None> | <L ogicalOperationStack> | <DateTime> | <Timestamp> | <ProcessId> | <ThreadId> | <Callstack>}] [-inputObject <psobject>] [-argumentList <Object[]>] [-for ce] [<CommonParameters>]

Huh, nem tl egyszer! Az lthat, hogy alapveten ktfajta dolgot lehet vele vizsglni: parancsokat s kifejezseket. Alapveten mi (rendszergazdk) kt esetben hasznlhatjuk: az els eset, amikor a parancsok, kifejezsek meghvsnak krlmnyeit szeretnnk tisztzni, a msik, amikor a paramterek tadsnak krlmnyeit. Nzznk pldt az elsre:
[9] PS I:\>Trace-Command commanddiscovery {dir i:\} -pshost DEBUG: CommandDiscovery Information: 0 : Looking up command: dir DEBUG: CommandDiscovery Information: 0 : Alias found: dir Get-ChildItem DEBUG: CommandDiscovery Information: 0 : Attempting to resolve function or filter: Get-ChildItem DEBUG: CommandDiscovery Information: 0 : Cmdlet found: Get-ChildItem Microsoft.PowerShell.Commands.GetChildItemCommand, Microsoft.PowerShell.Commands.Management, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 Directory: Microsoft.PowerShell.Core\FileSystem::I:\ Mode ---d---d---d---LastWriteTime ------------2006. 04. 24. 10:00 2007. 01. 18. 17:40 2005. 07. 07. 3:12 Length Name ------ ---2272 asi books

Itt a trace-command cmdletet a commanddiscovery nvvel hvtam meg. Mgtte ott van az a kifejezs szkriptblokk formban, amit elemeztetni szeretnk, majd megadom, hogy az eredmnyt a konzolra rja ki. Az elemzs felderti, hogy a PowerShell a dir lnevet hogyan prostja a Get-ChildItem cmdlettel, megnzi, hogy nem trfltuk-e meg, s nem ksztettnk-e ilyen nvvel valamilyen fggvnyt vagy szrt (filter). Ha nem, akkor kirja, hogy melyik PSSnapIn-ben van ez a cmdlet definilva s utna mr csak a futsnak eredmnyt ltjuk. A trace-command ezzel az zemmdjval teht akkor jn jl neknk, ha mindenfle aliast, fggvnyt, szkriptet s egyebeket definilunk, gyantjuk, hogy esetleg tbbszr is ugyanolyan nvvel, s amikor futtatunk valamit, nem rtjk, hogy mi is fut le valjban. Nzzk a paramtertads feldertst:

267

Hibakezels
[7] PS I:\>Trace-Command parameterbinding {get-process notepad} -pshost DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Get-Process] DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Get-Process] DEBUG: ParameterBinding Information: 0 : BIND arg [notepad] to parameter [Name] DEBUG: ParameterBinding Information: 0 : Binding collection parameter Name: argument type [String], parameter type [System.String[]], collection type Array, element type [System.String], no coerceElementType DEBUG: ParameterBinding Information: 0 : Creating array with element type [System.String] and 1 elements DEBUG: ParameterBinding Information: 0 : Argument type String is not IList, treating this as scalar DEBUG: ParameterBinding Information: 0 : Adding scalar element of type String to array position 0 DEBUG: ParameterBinding Information: 0 : Executing VALIDATION metadata: [System.Management.Automation.ValidateNotNullOrEmptyAttribute] DEBUG: ParameterBinding Information: 0 : BIND arg [System.String[]] to param [Name] SUCCESSFUL DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Get-Process] DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing DEBUG: ParameterBinding Information: 0 : CALLING ProcessRecord DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing Handles ------38 NPM(K) -----2 PM(K) ----1280 WS(K) VM(M) ----- ----3508 30 CPU(s) -----0,89 Id ProcessName -- ----------5372 notepad

Itt a trace-command nv paramtere parameterbinding, mgtte megint a vizsgland kifejezs, majd az, hogy a konzolra kldje az eredmnyt. Ltjuk, hogy a notepad karaktersorozatot a Name paramterhez fzte. Ez neknk termszetesnek tnik, de azrt ez nem ilyen trivilis. Nzzk, vajon mit is vr a get-process Name paramter gyannt:
[10] PS I:\>(get-help get-process).syntax Get-Process [[-name] <string[]>] [<CommonParameters>]

Lthatjuk a sgban, hogy egy sztringtmbt vr a get-process. Az elemzs tovbbi rsze annak lpseit mutatja, hogy hogyan csinl a PowerShell a sima sztringbl sztringtmbt, s hogy ezzel a paramterrel sikeresen vette a cmdlet mindhrom feldolgozsi fzist is, a begin, a process s az end rszt is. A msik eset, hogy nem rtjk, hogy egy cmdletnek vagy szkriptnek tadott paramter mirt nem j, mirt nem gy rtelmezi a kifejezs, mint ahogy mi szeretnnk. Ez utbbi demonstrlsra nzznk egy pldt, amelyben annak nznk utna, hogy ha egy gyjtemnyt adunk t a get-member-nek, akkor az vajon mirt a gyjtemny elemeinek tagjellemzit adja vissza, mirt nem a gyjtemnyt:
[15] PS I:\>Trace-Command parameterbinding {1, "kett" | gm} -pshost

268

Gyakorlat
DEBUG: ParameterBinding Information: 0 : BIND NAMED cmd line args [Get-Member] DEBUG: ParameterBinding Information: 0 : BIND POSITIONAL cmd line args [Get-Member] DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Get-Member] DEBUG: ParameterBinding Information: 0 : CALLING BeginProcessing DEBUG: ParameterBinding Information: 0 : BIND PIPELINE object to parameters: [Get-Member] DEBUG: ParameterBinding Information: 0 : PIPELINE object TYPE = [System.Int32] DEBUG: ParameterBinding Information: 0 : RESTORING pipeline parameter's original values DEBUG: ParameterBinding Information: 0 : Parameter [InputObject] PIPELINE INPUT ValueFromPipeline NO COERCION DEBUG: ParameterBinding Information: 0 : BIND arg [1] to parameter [InputObject] DEBUG: ParameterBinding Information: 0 : BIND arg [1] to param [InputObject] SUCCESSFUL DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Get-Member] DEBUG: ParameterBinding Information: 0 : CALLING ProcessRecord DEBUG: ParameterBinding Information: 0 : BIND PIPELINE object to parameters: [Get-Member] DEBUG: ParameterBinding Information: 0 : PIPELINE object TYPE = [System.String] DEBUG: ParameterBinding Information: 0 : RESTORING pipeline parameter's original values DEBUG: ParameterBinding Information: 0 : Parameter [InputObject] PIPELINE INPUT ValueFromPipeline NO COERCION DEBUG: ParameterBinding Information: 0 : BIND arg [kett] to parameter [InputObject] DEBUG: ParameterBinding Information: 0 : BIND arg [kett] to param [InputObject] SUCCESSFUL DEBUG: ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Get-Member] DEBUG: ParameterBinding Information: 0 : CALLING ProcessRecord DEBUG: ParameterBinding Information: 0 : CALLING EndProcessing ...

Lthatjuk, hogy a get-member hogyan dolgozza fel a csvezetken rkez klnbz objektumokat, hogyan emeldnek t az argumentumok InputObject-t. Elsknt a parancsrtelmez megnzi, hogy vannak-e nv szerinti paramterek a parancssorban, majd ellenrzi a pozci alapjn trtn paramtertadst. Ezutn ellenrzi, hogy a ktelez paramterek meg vannak-e adva, a get-member-nek nincs ilyenje. Mindezek utn veszi szre, hogy csvezetkben adom t a paramtereket, gy annak kezelse trtnik meg, elszr az 1 lesz behelyettestve InputObject paramterknt, majd a kett.

269

Hibakezels

2.2.7 A PowerShell esemnynaplja


A PowerShell szmra kln esemnynapl nylik teleptse utn. Ide nem az egyes parancsok, szkriptek futsnak eredmnye kerl be, hanem a konzol s a providerek betltsnek sttusinformcii:

48. bra A PowerShell esemnynaplja

Azaz itt akkor ltunk figyelmeztet vagy hibabejegyzseket, ha valami nagyon slyos hiba lp fel a PowerShell krnyezetben.

270

Gyakorlat

2.3 Fjlkezels
Mr tbbszr foglalkoztunk fjlokkal, hasznltuk a get-childitem, get-item, stb. cmdleteket, egy kicsit ssunk ebben a tmban mlyebbre.

2.3.1 Fjl s knyvtr ltrehozsa (new-item), ellenrzse (test-path)


j fjlt ltrehozni a new-item cmdlettel lehet:
[8] PS C:\scripts> new-item -Path . -Name szveg.txt -type file -Value "Ez e gy szveg" Directory: Microsoft.PowerShell.Core\FileSystem::C:\scripts Mode ----a--LastWriteTime ------------2008.04.22. 21:31 Length Name ------ ---14 szveg.txt

Termszeten nem csak a fjlt, hanem knyvtrt is kszthetnk, taln ez gyakoribb:


[9] PS C:\scripts> New-Item -Path . -Name "Alknyvtr" -type Directory Directory: Microsoft.PowerShell.Core\FileSystem::C:\scripts Mode ---d---LastWriteTime ------------2008.04.22. 21:33 Length Name ------ ---<DIR> Alknyvtr

Knyvtr ltrehozsa eltt rdemes megnzni, hogy ltezik-e esetleg mr a knyvtr. Erre a clra a Test-Path cmdlet ll rendelkezsnkre:
[12] PS C:\> Test-Path C:\scripts True

Feladat lehet mg a fjlok attribtumainak belltsa. Ezeket egyszeren llthatjuk be a fjlobjektumok tulajdonsgainak mdostsval:
[13] PS C:\> (Get-Item C:\scripts\alice.txt).attributes = "Archive, hidden"

De vajon milyen lehetsgek kzl vlogathatok az attribtumoknl? Ebben is a Reflector segt, de eltte meg kell nzni, hogy valjban milyen tpus adat a fjlok attribtuma:

271

Fjlkezels
[14] PS C:\> (Get-Item C:\scripts\alice.txt).attributes.gettype().fullname System.IO.FileAttributes

Nem meglep mdon ez System.IO.FileAttributes tpus, rkeresve erre a Reflectorban ezt lthatjuk:

49. bra A fjlok attribtumai a Reflectorban

A PowerShellben a tpuskonverzi annyira okos, hogy a *13+-as sorban sztringknt megadott fjl-attribtumokat (vesszvel elvlasztott kt attribtum egy sztringben) is kpes volt System.IO.FileAttributes tpusv konvertlni.

2.3.2 Rejtett fjlok


Nzzk meg a C: gykernek elemeit (fjlok, knyvtrak), amelyek p betvel kezddnek:
[12] PS C:\> Get-ChildItem p* Directory: Microsoft.PowerShell.Core\FileSystem::C:\ Mode ---d---d-r-d-r-LastWriteTime ------------2008.03.29. 20:47 2008.04.16. 23:03 2008.04.17. 22:48 Length -----<DIR> <DIR> <DIR> Name ---powershell2 Program Files Program Files (x86)

De hol van pldul a pagefile.sys? Alaphelyzetben a Get-ChildItem a rejtett fjlokrl nem vesz tudomst. Van neki egy force kapcsolja, amellyel a rejtett fjlokat is lttathatjuk:

272

Gyakorlat
[30] PS C:\> Get-ChildItem p* -force Directory: Microsoft.PowerShell.Core\FileSystem::C:\ Mode ---d---d-r-d-r--a-hs LastWriteTime ------------2008.03.29. 20:47 2008.04.16. 23:03 2008.04.17. 22:48 2008.04.18. 20:45 Length -----<DIR> <DIR> <DIR> 2145386496 Name ---powershell2 Program Files Program Files (x86) pagefile.sys

Ugyanezt a kapcsolt kell hasznlni a get-item cmdlet esetben is.

2.3.3 Szvegfjlok feldolgozsa (Get-Content, SelectString)


Szveges fjlok olvassra a Get-Content cmdlet szolgl, amint azt mr korbban is lthattuk. Paramterknt egy, vagy tbb fjl nevt kell megadnunk, a kimenetbe pedig a fjlok tartalma kerl soronknt egy-egy karakterlnc kpben.

Feladat: Keressk meg a Windows mappban azokat a naplfjlokat, amelyekben szerepel az error kifejezs. A listban szerepeljen a fjl neve, a megtallt sor szvege, s hogy az hnyadik sor az adott fjlon bell!

A feladatot kt klnbz mdon is meg fogjuk oldani, br az els prblkozs kzel sem ad majd tkletes eredmnyt. Ha megvizsgljuk a csben raml adatok termszett, akkor nyilvnvalv vlik, hogy ezzel a mdszerrel nem is lehetsges a tkletes megolds. Kezdjnk hozz! Az els megoldsban tulajdonkppen semmi klnleges nincsen, a Get-Content sorban megnyitja valamennyi logfjlt, az eredmnyt odaadjuk a Select-Stringnek, aki kivlogatja a megfelel sorokat. Kell mg egy kis formzgats s kszen is vagyunk.
PS C:\> Get-Content $env:windir\*.log | select-string -pattern "error" | f ormat-list filename,line,linenumber Filename Line : InputStream : COM+[7:32:26]: Warning: error 0x800704cf in IsWin2001Primary DomainController LineNumber : 260 ...

Sajnos azonban ezzel a mdszerrel tkzben olyan informcit is eldobltunk, amire felttlenl szksgnk lenne a helyes eredmny ellltshoz. Vizsgljuk meg, milyen kimenetet produkl a fenti esetben a Get-Content! A fjlok tartalma jelenik meg a

273

Fjlkezels
kimeneten, soronknt egy-egy karakterlnc kpben, de mindenfle strukturltsg nlkl. A Select-String mr semmifle informcit nem kap arrl, hogy melyik karakterlnc melyik fjlhoz tartozott eredetileg, s mg kevsb tudhatja azt, hogy hnyadik sor volt az a fjlban. Mi kerlt akkor a Select-String kimenetbe? A fjlnv helyn mindenhol az InputStream kifejezs tallhat, a LineNumber pedig azt mutatja, hogy az adott karakterlnc hnyadik volt a teljes bemenetben, vagyis az egyms mg illesztett naplfjlokban. Ht ez nem az igazi! A Select-String azonban bemenetknt nem csak karakterlncokat, hanem kzvetlenl szveges fjlokat is fogadhat, a kvetkez megoldsban ezt a tulajdonsgot fogjuk felhasznlni. Ebben az esetben a Get-ChildItem cmdlettl nem a fjlok tartalmt, hanem csak egy FileInfo objektumokbl ll gyjtemnyt kap a Select-String, a fjlok tartalmt mr maga fogja kiolvasni.
PS C:\> Get-ChildItem $env:windir\*.log | select-string -pattern "error" list | format-list filename,line,linenumber Filename Line : comsetup.log : COM+[7:32:26]: Warning: error 0x800704cf in IsWin2001Primary DomainController LineNumber : 220 ...

Ebben az esetben minden szksges informci rendelkezsre ll, s helyesen kerl be a Select-String kimenetbe, gy helyesen jelenhet meg a tblzatban is. A -list paramter arra utastja a cmdletet, hogy csak az els tallatig olvasson minden egyes fjlt, gy a kapott lista mr nem lesz olyan hossz, mint korbban.

Feladat: Ksztsnk tartalmrl!

statisztikt

az

about_signing.help.txt

fjl

Kezdjk a legegyszerbb, mr ismert mdszerrel, hasznljuk a Measure-Object cmdletet!


PS C:\> Get-Content $pshome\about_signing.help.txt | Measure-Object -line word -character Lines ----219 Words ----1571 Characters Property ---------- -------11266

Eddig rendben is van, de mit kell tennnk, ha arra is kvncsiak vagyunk, hogy egy adott sz hnyszor szerepel a fjlban, vagy pldul arra, hogy melyik sz fordul el benne a legtbbszr. A Get-Content soronknt trdelt kimenetet ad, elszr is trdeljk ezt tovbb szavakk:

274

Gyakorlat
PS C:\> [string[]]$szavak = Get-Content $pshome\about_signing.help.txt | foreach-object {$_.Split(" `t",[stringsplitoptions]::RemoveEmptyEntries)}

Azt hiszem, a fenti parancs azrt ignyelhet nmi magyarzatot. Elszr is ksztnk egy tmbt, ami karakterlnc vltozkat tud majd fogadni, ebbe kell majd beledoblni a szveg szavait. A Get-Content szlltja a szveget soronknt, a Foreach-Object pedig minden egyes sort szavakk trdel a String osztly Split() fggvnynek hasznlatval. A Split() minden sort a szavaibl ll karakterlnc-tmb kpben ad vissza, ezeket adjuk hozz egyesvel a $szavak tmbhz. A Split() els paramtereknt azokat a karaktereket kell megadnunk, amelyek mentn trdelni szeretnnk a szveget, a szavakat egymstl a megadott szkz s tabultor karakterek vlaszthatjk el. A msodik paramterrel arra utastjuk a Split() fggvnyt, hogy a trdels kzben tallt res karakterlncokat s hasonl haszontalansgokat eldobja (ezt is pldul a Reflector program hasznlatval lehet felderteni). Nzzk mi lett ebbl!
PS C:\> $szavak.length 1571

Remek! A szavak szma pontosan megegyezik azzal, amit a Measure-Object adott vissza, valsznleg minden rendben van. A statisztika most mr nem gond, a Group-Object csoportost, a Sort-Object pedig az elfordulsok szma szerint sorba rendez:
PS C:\> $szavak | group-object | sort-object count -descending Count ----110 46 44 42 31 27 25 ... Name ---the a You to and certificate PowerShell Group ----{the, the, the, the...} {a, a, a, a...} {You, you, you, you...} {to, to, To, to...} {and, and, and, and...} {certificate, certificate, certificate,... {PowerShell, PowerShell, PowerShell, Po...

Nem problma az sem, ha egy adott sz elfordulsainak szmra vagyunk kvncsiak, a sorba rendezs helyett egyszeren a csoportostott listbl ki kell vlasztanunk a megfelel sort. A scripts sz elfordulsainak szmt pldul a kvetkez parancs rja ki:
PS C:\> $szavak | group-object | where-object {$_.Name -eq "scripts"} Count Name ----- ---23 scripts Group ----{scripts, scripts, scripts, Scripts...}

275

Fjlkezels
Az egyszersg kedvrt egyetlen sorba is belesrthetjk a feladat teljes megoldst, ebben az esetben nincs szksg a vltozra csak a kvetkez parancsot kell begpelnnk:
PS C:\> (Get-Content $pshome\about_signing.help.txt | foreach-object {$_.Split(" `t",[stringsplitoptions]::RemoveEmptyEntries)}) | group-object | sort-object count descending

2.3.4 Sortrs kezelse szvegfjlokban


Gyakran elfordulnak olyan szveges fjlok, amelyekben az informciblokkok nem korltozdnak egy-egy sorra, hanem tnylnak sorvgeken. Ez specilis odafigyelst s feldolgozsi mdot ignyel, hiszen ahogy lttuk pldul a get-content is soronknt dolgozza fel a szveges llomnyokat. Pldaknt nzznk egy olyan szveges llomnyt, amelyet maga a PowerShell hoz ltre a start-transcript cmdlet segtsgvel:
[33] PS C:\> Start-Transcript C:\powershell2\scripts\transforregex.txt Transcript started, output file is C:\powershell2\scripts\transforregex.txt [34] PS C:\> "Ez egy rvid sor" Ez egy rvid sor [35] PS C:\> "Ez egy hossz sor igazi sortrs nlkl, viszont tnylik kt sorba" Ez egy hossz sor igazi sortrs nlkl, viszont tnylik kt sorba [36] PS C:\> "Ez egy ktsoros >> szveg" >> Ez egy ktsoros szveg [37] PS C:\> Stop-Transcript Transcript stopped, output file is C:\powershell2\scripts\transforregex.txt

A fenti pldban indtott transcript tartalmaz mindenfle hosszsg sort, mestersgesen nyitott j sort alprompttal. Az elkszlt fjl a kvetkezkppen nz ki notepaddal nzve:

50. bra Transcript fjl

276

Gyakorlat
Lthatjuk, hogy csak ott tett a fjlba sortrst, ahol tnyleg Entert tttnk. Olvassuk be ezt a fjlt:
[41] PS C:\> $text = get-content C:\powershell2\scripts\transforregex.txt

Az gy kapott $text vltoz egy sztringtmbt eredmnyez, amelynek egyes elemei a fjl sorai:
[42] PS C:\> $text[8] Ez egy rvid sor

Hogy lehetne ebbl egy olyan sztringet kszteni, amely tartalmazza az sszes sort? Szerencsre a .NET Framework itt is a segtsgnkre siet:
[43] PS C:\> $text = [string]::join("`r`n",$text)

A [string] osztlynak teht van egy join statikus metdusa, amellyel ilyen szszefzseket lehet vgezni. Paramterknt t kell adni egy olyan karaktert (vagy karaktersorozatot), amelyet az sszefzsek helyre beilleszt, meg az sszefzend szveget. Hogy az eredeti informcitartalmat megrizzk, n egy kocsivissza-jsor kombincival fztem ssze a szvegem darabjait, merthogy a Windowsban ez a hivatalos sortrs. Msik lehetsg az, hogy eleve a beolvasst ms mdszerrel vgezzk, szintn a .NET keretrendszer segtsgvel, a File objektumtpus ReadAllText statikus metdusnak segtsgvel:
[44] PS C:\> $text2 = [System.IO.File]::ReadAllText("c:\powershell2\scripts\ transforregex.txt")

Akrmelyik mdszert is vlasztjuk, ugyanolyan eredmnyt kapunk, gy immr egyszerbben tudunk akr soron tnyl regex kifejezssel keresni.

2.3.5 Fjl hozzfrsi listja (get-acl, set-acl)


A fjlrendszer s a registry objektumainl kiolvashat a hozzfrsi lista a get-acl cmdlet segtsgvel:
[87] PS C:\> get-acl C:\powershell2\scripts\1.txt | fl Path Owner Group Access : : : : Microsoft.PowerShell.Core\FileSystem::C:\powershell2\scripts\1.txt ASUS\Administrator ASUS\None BUILTIN\Administrators Allow FullControl NT AUTHORITY\SYSTEM Allow FullControl ASUS\Administrator Allow FullControl BUILTIN\Users Allow ReadAndExecute, Synchronize

277

Fjlkezels
Audit Sddl : : O:LAG:S-1-5-21-2919093906-1695458891-47906081-513D:(A;ID;FA;;;BA)( A;ID;FA;;;SY)(A;ID;FA;;;LA)(A;ID;0x1200a9;;;BU)

Az gy visszakapott objektum egy FileSecurity tpus objektum, melynek a fent lthat tulajdonsgai kzl az Sddl elg rmisztnek nz ki, de szerencsre nem muszj azzal foglalkozni, emberi fogyasztsra jobban alkalmas hozzfrsi szablyok segtsgvel is lehet belltani a hozzfrst a fjlokhoz, knyvtrakhoz. A hozzfrsi lehetsgeket a kvetkez tblzat tartalmazza: Hozzfrsi jogok (FileSystemRights) ListDirectory WriteAttributes ReadData Write WriteData Delete CreateFiles ReadPermissions CreateDirectories Read AppendData ReadAndExecute ReadExtendedAttributes Modify WriteExtendedAttributes ChangePermissions Traverse TakeOwnership ExecuteFile Synchronize DeleteSubdirectoriesAndFilesReadAttributes FullControl Ezek kzl lehet sszerakni a kvnt hozzfrsi lehetsgeket a kvetkez mdon:
[17] PS C:\> $Acl = Get-Acl C:\scripts [18] PS C:\> $entry = New-Object System.Security.AccessControl.FileSystemAcc essRule("Szkriptelk","Read","Allow") [19] PS C:\> $entry FileSystemRights AccessControlType IdentityReference IsInherited InheritanceFlags PropagationFlags : : : : : : Read, Synchronize Allow Szkriptelk False None None

[20] PS C:\> $acl.AddAccessRule($entry) [21] PS C:\> set-acl C:\scripts $acl [22] PS C:\> (Get-Acl C:\scripts).Access FileSystemRights AccessControlType IdentityReference IsInherited InheritanceFlags PropagationFlags ... : : : : : : Read, Synchronize Allow ASUS\Szkriptelk False None None

278

Gyakorlat
A fenti pldban a c:\scripts knyvtrhoz szeretnm adni a Szkriptelk csoportot olvassi jogosultsggal. Ehhez a *17+-es sorban kiolvasom a meglev hozzfrsi listt, a [18]-as sorban definilom az j hozzfrsi bejegyzst. Ezt ellenrzskppen kiratom a [19]-es sorban. A [20]-as sorban hozzadom ezt a bejegyzst a hozzfrsi listhoz. Mivel ezt egyelre csak a memriban trolt $acl objektum tartalmazza, ezrt ezt ki is kell rni a knyvtrobjektumra, amit a [21]-es sorban teszek meg a set-acl cmdlettel. Vgezetl, a *22+-es sorban ellenrzskppen kiolvasom az j hozzfrsi listt, amelyben ott szerepel az imnt hozzadott bejegyzs. Megjegyzs: A registry elemeinek hozzfrsi jogosultsgait hasonl mdon, RegistryAccessRule osztly objektumainak segtsgvel llthatjuk be. de a

2.3.5.1 Fjlok tulajdonosai


Az elzekben lttuk, hogy a get-acl kimentben a fjl vagy knyvtr tulajdonosa is kiolvashat. Nzznk ennek felhasznlsra egy kis szkriptet, mely segtsgvel a tulajdonosok szerint szortrozom szt a fjlokat:
Set-Location C:\fjlok Get-ChildItem | Where-Object {-not $_.PSIsContainer} | ForEach-Object { $d = (Get-Acl $_).Owner.Split("\")[1] if(-not (Test-Path ((get-location).path + '\' + $d))) { new-item -path (get-location).path -name $d ` -type directory | Out-Null } Move-Item -path $_.pspath ` -destination ((get-location).path + '\' + $d +'\') }

Az elejn belltom az aktulis knyvtrat, majd kilistztatom az sszes fjljt s alknyvtrt. Mivel nekem csak a fjlok kellenek, ezrt a where-object-tel kiszrm a PSIsContainer tpus objektumokat. Az gy megmaradt objektumokon egy foreach-object ciklussal vgigszaladok. Kpzem egy $d vltozba a fjl tulajdonosnak a nevt. Itt egy kis trkkzsre van szksg, hiszen a felhasznl neve tartomny\felhasznlnv vagy gpnv\felhasznlnv formtum. Nekem csak a felhasznlnv kell, gy split()-tel ketttrm s veszem a 2. elemet ([1]-es index), ami a felhasznli nv. Ezutn megvizsglom a Test-Path cmdlettel, hogy van-e mr a nvnek megfelel alknyvtr. Ha nincs, akkor a new-item cmdlettel ltrehozom. Mire a move-item

279

Fjlkezels
cmdlethez rnk, addigra mr biztos van a felhasznlnvnek megfelel alknyvtr, gy t tudom mozgatni oda a fjlt.

2.3.6 Ideiglenes fjlok ltrehozsa


Gyakran elfordul nagyobb adatfeldolgozssal jr feladatoknl, hogy ki kell rni az tmeneti adatokat ideiglenes fjlokba, hiszen a rendelkezsre ll memria nem biztos, hogy elegend. A .NET egyik osztlya, a System.IO.Path ebben is segtsgnkre van. A GetTempFileName() statikus metdusa a temp krnyezeti vltoz ltal meghatrozott knyvtrba ltrehoz egy res fjlt, mely neve tmp karaktersorozattal kezddik, majd jn egy sorszm, s a kiterjesztse tmp:
[95] PS C:\> [System.IO.Path]::GetTempFileName() C:\Documents and Settings\Administrator\Local Settings\Temp\tmp16.tmp

rdekes, hogy ezzel a kifejezssel nem csak megkapjuk a lehetsges kvetkez ideiglenes fjl nevt (mint ahogy a metdus neve sugalln), hanem ltre is hozza az ideiglenes fjlt:
[104] PS C:\Documents and Settings\Administrator\Local Settings\Temp> dir tm p*.tmp Directory: Microsoft.PowerShell.Core\FileSystem::C:\Documents and Setti ngs\Administrator\Local Settings\Temp Mode ----a---a--LastWriteTime ------------2008.04.20. 11:46 2008.04.24. 23:36 Length -----0 0 Name ---tmp15.tmp tmp16.tmp

Az gy ltrehozott res fjlba tirnythatjuk a PowerShell kifejezseink kimenett, s felhasznlhatjuk majd azt ksbbi feldolgozsra. Ha mr nincs szksgnk mr az ideiglenes fjlunkra, akkor ne feledkezznk meg trlskrl.

2.3.7 XML fjlok kezelse


Korbban lttuk, hogy a PowerShell kpes XML formtumban exportlni objektumait. Nzzk, hogy hogyan lehet egyb forrsbl szrmaz XML llomnyokkal dolgozni. Pldmban egy nagyon egyszer Access adatbzist exportltam XML formtumba. Vigyzni kell, hogy megfelel kdols legyen az XML fjl, mert az kezetes betket UTF-8 kdolssal nem fogja tudni rtelmezni a PowerShell. Az XML fjl tartalmt a kvetkez kifejezssel tudjuk vltozba tlteni:

280

Gyakorlat
[9] PS C:\> $xml = [xml] (get-content c:\powershell2\munka\emberek.xml)

Ha megnzzk ennek az $xml vltoznak a tartalmt, akkor mr nem a fjlban trolt karaktersorozatot kapjuk vissza, hanem az XML adatformtumnak megfelel adattartalmakat, s ebbl a 1.10.11 Kirs fjlba (Out-File, Export-) fejezetben ltottaknak megfelelen lehet az adatokat kiolvasni:
[22] PS C:\> $xml xml --[23] PS C:\> $xml.root xsd od schema --------http://www.w3.o... urn:schemas-mic... schema [24] PS C:\> $xml.root.dataroot xsi generated Emberek ----------------http://www.w3.o... 2008-08-10T08:3... {1, 2, 3} [25] PS C:\> $xml.root.dataroot.emberek ID -1 2 3 Nv --Sos Tibor Fjdalom Csilla Beld Mrton Mellk -----1234 1230 1299 VrosID ------1 1 2 Vrosok ------{1, 2} dataroot -------dataroot root ---root

[26] PS C:\> $xml.root.dataroot.vrosok ID -1 2 Nv --Budapest Debrecen

Vajon hogyan lehetne a nyers XML llomnny visszaalaktani az $xml vltoznkat? Ebben az [XML] adattpus Save metdusa segthet. Alapveten ez a ments fjlba irnyulna, egy elrsi utat vr paramterknt. Ha a kpernyre akarjuk kiratni, akkor t kell verni, a ments helynek a konzolt kell megadni a kvetkez mdon:
[26] PS C:\> $xml.save([console]::out) <?xml version="1.0" encoding="ibm852"?> <root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-mic rosoft-com:officedata"> <xsd:schema> <xsd:element name="dataroot">

281

Fjlkezels
<xsd:complexType> <xsd:sequence> <xsd:element ref="Emberek" minOccurs="0" maxOccurs="unbounded" /> ...

2.3.8 Megosztsok s webmappk elrse


A megosztsok elrse nagyon egyszer a PowerShellbl: egyszeren a UNC nvvel kell hivatkozni a megosztott knyvtrakra s az ott tallhat fjlokra:
[2] PS C:\> Get-ChildItem \\asus\powershell Directory: Microsoft.PowerShell.Core\FileSystem::\\asus\powershell Mode ---d---d---d---LastWriteTime ------------2008.05.04. 12:55 2008.07.15. 20:01 2008.02.28. 21:14 Length -----<DIR> <DIR> <DIR> Name ---cd Copy of scripts demo

St! A TAB-kiegszts is mkdik! Valamint az ebben a fejezetben lert sszes cmdlet is mkdik az UNC nevekkel is, pldul:
[4] PS C:\> get-acl \\asus\powershell\munka\tmbk.txt Directory: Microsoft.PowerShell.Core\FileSystem::\\asus\powershell\munk a Path ---tmbk.txt Owner ----ASUS\Administrator Access -----BUILTIN\Administrator...

Megosztsok ltrehozsa mr nem ilyen egyszer, de ehhez is van megolds, melyet a 2.6.8 WMI objektumok metdusainak meghvsa fejezetben mutatok egy WMI kifejezs segtsgvel. Mindezen kvl a weben megosztott mappk is elrhetk ezekkel a cmdletekkel:
[5] PS C:\> get-childitem \\live.sysinternals.com\Tools Directory: Microsoft.PowerShell.Core\FileSystem::\\live.sysinternals.co m\Tools Mode LastWriteTime ---------------d---- 2008. 06. 02. 1:16 Length Name ------ ---<DIR> WindowsInternals

282

Gyakorlat
-a---a---a---a---a---a---a---a---a---a---a--... 2008. 2008. 2006. 2006. 2007. 2007. 2007. 2007. 2006. 2006. 2008. 05. 07. 11. 11. 07. 11. 11. 11. 11. 11. 08. 30. 15. 01. 01. 12. 26. 07. 20. 01. 01. 20. 17:55 17:39 14:06 22:05 7:26 13:21 10:13 13:25 14:05 14:06 15:18 668 229928 174968 121712 50379 422952 401616 1049640 150328 154424 48986 About_This_Site.txt accesschk.exe AccessEnum.exe accvio.EXE AdExplorer.chm ADExplorer.exe ADInsight.chm ADInsight.exe adrestore.exe Autologon.exe autoruns.chm

283

Az Esemnynapl feldolgozsa (Get-Eventlog)

2.4 Az Esemnynapl feldolgozsa (Get-Eventlog)


Az Esemnynapl bejegyzseinek kiolvassra a Get-Eventlog cmdletet hasznlhatjuk, ami EventLogEntry (vagy EventLog) tpus objektumokat ad vissza. Elszr is tudjuk meg, hogy milyen naplk vannak a gpnkn:
[3] PS C:\> Get-EventLog -list Max(K) Retain OverflowAction ------ ------ -------------8 192 0 OverwriteAsNeeded 512 7 OverwriteOlder 16 384 0 OverwriteAsNeeded 16 384 0 OverwriteAsNeeded 8 192 0 OverwriteAsNeeded 8 192 0 OverwriteAsNeeded 16 384 0 OverwriteAsNeeded 15 360 0 OverwriteAsNeeded Entries ------2 595 0 8 858 4 486 10 965 617 5 504 Name ---Application Internet Explorer Microsoft Office Diagnostics Microsoft Office Sessions Security System Virtual Server Windows PowerShell

A fenti parancs EventLog objektumokat ad vissza, ezektl lekrdezhetk az adott napl klnfle tulajdonsgai, maximlis mrete, bejegyzseinek szma, stb.
[4] PS C:\> (get-eventlog -list)[0] | Format-List * Entries : {MACHINENAME, MACHINENAME, MACHINENAME, ASUS...} LogDisplayName : Application Log : Application MachineName : . MaximumKilobytes : 8192 OverflowAction : OverwriteAsNeeded MinimumRetentionDays : 0 EnableRaisingEvents : False SynchronizingObject : Source : Site : Container : [5] PS C:\> (get-eventlog -list)[0].entries.count 2595

Ha egy konkrt napl bejegyzseire vagyunk kvncsiak, akkor a napl nevt kell megadnunk paramterknt, a -newest paramter utn ll szm pedig a listba kerl bejegyzsek szmt korltozza. Az kvetkez parancs a rendszernapl legutbbi tz bejegyzst fogja kiolvasni:

284

Gyakorlat
PS C:\> Get-EventLog system -newest 10 Index ----13237 13236 ... Time ---aug. 02 08:14 aug. 02 08:14 Type ---Info Info Source -----Service Control M... Service Control M... EventID ------7036 7035 Message ------A(z) Tvelrsi ... A(z) Tvelrsi ...

Az elz kt parancs kombinlsval valamennyi napl legfrissebb bejegyzseit is knnyen lekrdezhetjk egyetlen paranccsal. A bal oldali Get-Eventlog szlltja a naplk objektumait, az innen szrmaz adatokat fogjuk odaadni paramterknt a Foreach-Object belsejben elindul Get-Eventlog-nak, gy szp sorban valamennyi napl bejegyzsei el fognak kerlni. (Kzben mg kirjuk a napl nevt is, hogy tudjuk hol jrunk.)
PS C:\> Get-Eventlog -list | Foreach-Object {Write-Host $_.LogDisplayName; Get-Eventlog $_.Log -newest 10} Alkalmazs Index Time ----- ---18387 aug. 18386 aug. ... Rendszer 13237 aug. 13236 aug. ... Type ---02 15:22 Info 02 14:18 Info Source -----MSSQL$SQLEXPRESS MSSQL$SQLEXPRESS EventID ------17896 17896 Message ------The time stamp c... The time stamp c...

02 08:14 Info Service Control M... 02 08:14 Info Service Control M...

7036 A(z) Tvelrsi ... 7035 A(z) Tvelrsi ...

Termszetesen a megszokott eszkzk segtsgvel tetszs szerint szrhetjk s formzhatjuk is a naplkbl nyert objektumokat. Kivlogathatjuk pldul csak a hibkat vagy a figyelmeztetseket, s vlogathatunk a kirand jellemzk kztt.

Feladat: Listzzuk ki a rendszernaplbl az utols hten keletkezett Error tpus bejegyzseket idrend szerint!

A Where-Object szrjn teht azoknak a bejegyzseknek kellene tjutniuk, amelyekben az EntryType tulajdonsg rtke Error, a TimeGenerated rtk pedig ksbbi az egy httel ezeltti dtumnl. A lenti parancs Where-Object rszben ppen ezt a logikai kifejezst lthatjuk. Ezutn mr csak a sorba rendezs valamint egy kis alaktgats van htra, s el is kszlt a tblzat.
PS C:\> Get-Eventlog system | Where-Object {$_.EntryType -eq "Error" and $_.timegenerated -ge (Get-Date).AddDays(-7)} | Sort-Object -descending timegenerated | Format-Table timegenerated, message -autosize TimeGenerated ------------2007.07.11. 16:50:23 2007.07.07. 10:39:29 Message ------A szolgltats (Conexant's BtPCI WDM Video Captur... A(z) SQL Server Reporting Services (SQLEXPRESS) s...

285

Az Esemnynapl feldolgozsa (Get-Eventlog)


2007.07.07. 9:41:20 2007.07.07. 9:35:17 A(z) SQL Server Reporting Services (SQLEXPRESS) s... A(z) SQL Server Reporting Services (SQLEXPRESS) s...

Rakjuk ssze ismt az elz kt utastst! Listzzuk ki valamennyi naplbl az elz heti Error tpus bejegyzseket! Az albbi hossz, de mg mindig egysoros parancs a megolds:
PS C:\> Get-Eventlog -list | Foreach-Object {Write-Host $_.LogDisplayName; Get-Eventlog $_.Log | Where-Object {$_.EntryType -eq "Error" -and $_.timegenerated -ge (Get-Date).AddDays(-7)} | Sort-Object -descending timegenerated | Format-Table timegenerated, message -autosize} Alkalmazs TimeGenerated ------------2007.08.01. 15:17:46 2007.07.31. 14:05:58 2007.07.31. 14:05:39 Internet Explorer Biztonsg Rendszer TimeGenerated ------------2007.07.06. 9:03:50 2007.07.06. 9:03:48 2007.07.06. 9:03:48 Virtual Server Windows PowerShell ... Message ------Az I/O alrendszertl rkezett illesztprogram-csom... Az I/O alrendszertl rkezett illesztprogram-csom... Az I/O alrendszertl rkezett illesztprogram-csom... Message ------Nem vlaszol alkalmazs: wmplayer.exe, verzi: 11... Accepted Safe Mode action : Microsoft Outlook. Rejected Safe Mode action : Microsoft Outlook.

Tvoli gpeken lv Esemnynaplk elrshez s naplbejegyzsek ksztshez nincs cmdlet-tmogats, ezeket a feladatokat pldul a megfelel WMI komponensek felhasznlsval lehet elvgeznnk (lsd 2.6.9 Fontosabb WMI osztlyok fejezet), vagy kzvetlenl a megfelel .NET osztlyok megszltsval:
[6] PS C:\> $eventlogs = [System.Diagnostics.EventLog]::GetEventLogs("asus") [7] PS C:\> $eventlogs Max(K) Retain OverflowAction ------ ------ -------------8 192 0 OverwriteAsNeeded 512 7 OverwriteOlder 16 384 0 OverwriteAsNeeded 16 384 0 OverwriteAsNeeded 8 192 0 OverwriteAsNeeded 8 192 0 OverwriteAsNeeded 16 384 0 OverwriteAsNeeded 15 360 0 OverwriteAsNeeded Entries ------2 595 0 8 858 4 486 10 965 617 5 504 Name ---Application Internet Explorer Microsoft Office Diagnostics Microsoft Office Sessions Security System Virtual Server Windows PowerShell

286

Gyakorlat
A [6]-os sorban lthat, hogy a GetEventLogs statikus metdusnak paramterknt tadhat a gpnv, gy akr tvoli gp esemnynapli is lekrdezhetk ezzel a mdszerrel.

287

Registry kezelse

2.5 Registry kezelse


Amikor a PowerShell egyszersgt demonstrljk klnbz szakmai rendezvnyeken, akkor gyakran a registry kezelst is bemutatjk, hiszen jl rzkeltethet az, hogy a fjlok kezelsvel kapcsolatos cmdletek legtbbje a registryre is hasznlhat, mivel a fjlok s a registry is u.n. PSDrive-knt rhet el. A szemlyes tapasztalatom az, hogy azrt viszonylag ritkn kell a registryt szkriptbl machinlni, de azrt foglalkozzunk ezzel is.

2.5.1 Olvass a registrybl


Elsknt nzzk meg, hogy hogyan lehet olvasni a registrybl. Pldul listzzuk ki a registry alapjn a szmtgpre teleptett alkalmazsok nevt! Miutn a registryt is egy PSDrive-on keresztl rhetjk el, rdemes lehet akr j, a minket rdekl informcikat tartalmaz gra j shortcut PSDrive-ot definilni, hogy ksbb mr rvidebb elrsi ttal is hivatkozhatk legyenek az egyes elemek:
[1] PS I:\>New-PSDrive -Name Uninstall -PSProvider Registry -Root HKLM:\SOFT WARE\Microsoft\Windows\CurrentVersion\Uninstall Name ---Uninstall Provider -------Registry Root ---HKEY_LOCAL_MACHINE\SOFTWARE\Micr... CurrentLocatio n --------------

A mostani feladatunkban pldul az Uninstall registry kulcsot egy j, Uninstall nev meghajtn keresztl lehet elrni. Erre mr nagyon egyszeren vgezhetnk szoksos fjlmveleteket, pldul kilistzhatjuk az itt tallhat kulcsokat a Get-ChildItem cmdlet segtsgvel:
[2] PS I:\>Get-ChildItem uninstall: Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Mi crosoft\Windows\CurrentVersion\Uninstall SKC --0 0 0 0 0 0 ... VC -16 1 13 12 2 2 Name ---123 DVD Converter_is1 AddressBook Adobe Flash Player ActiveX Adobe SVG Viewer Branding Burn4Free Property -------{Inno Setup: Setup Version, Inno ... {(default)} {DisplayName, DisplayVersion, Pub... {DisplayName, DisplayVersion, Dis... {QuietUninstallString, RequiresIE... {DisplayName, UninstallString}

Nzzk meg ugyanezt a regedittel:

288

Gyakorlat

51. bra Uninstall registry-g

Lthat, hogy amit mi a Regeditben ltunk fjlknt, azaz az Adobe Flash Playernl mint DisplayName, az a PowerShell-ben nem fjl, hanem az mr a fjlnak a tulajdonsga (property). Ez egy kicsit zavarnak tnhet, hiszen a szemnk eltt az Adobe Flash Player mint mappa lebeg, holott a PowerShellben az maga a fjlszint objektum a hierarchiban. De akkor hogyan jutunk hozz az egyes tulajdonsgokhoz egyszeren? Erre is van cmdlet, a Get-ItemProperty:
[3] PS I:\>cd Uninstall: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ [4] PS Uninstall:\>Get-ItemProperty "Adobe Flash Player ActiveX" PSPath PSParentPath PSChildName PSDrive PSProvider DisplayName DisplayVersion Publisher URLInfoAbout VersionMajor VersionMinor HelpLink URLUpdateInfo DisplayIcon : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Ado be Flash Player ActiveX : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall : Adobe Flash Player ActiveX : Uninstall : Microsoft.PowerShell.Core\Registry : Adobe Flash Player ActiveX : 9.0.115.0 : Adobe Systems Incorporated : http://www.adobe.com/go/getflashplayer : 9 : 0 : http://www.adobe.com/go/flashplayer_support/ : http://www.adobe.com/go/flashplayer/ : C:\WINDOWS\system32\Macromed\Flash\uninstall_activeX.ex e

289

Registry kezelse
UninstallString : C:\WINDOWS\system32\Macromed\Flash\uninstall_activeX.ex e RequiresIESysFile : 4.70.0.1155 NoModify : 1 NoRepair : 1

A [4]-es sorban lekrdezem az Adobe Flash Player elem tulajdonsgait. Egy kicsit tbbet is visszaad nekem a PowerShell, mint ami tnylegesen a registryben tallhat: PSPath, PSPartentPath, stb. Ezek termszetesen nincsenek benne a registryben, ezeket a PowerShell tpusadaptcis rtege teszi hozz. Sajnos ezeket a plusz adatokat akkor is hozzbiggyeszti, ha csak mondjuk a DisplayName paramtert akarjuk kiolvasni:
[14] PS Uninstall:\>Get-ItemProperty "Adobe Flash Player ActiveX" -name Disp layName PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTW ARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash P layer ActiveX PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTW ARE\Microsoft\Windows\CurrentVersion\Uninstall PSChildName : Adobe Flash Player ActiveX PSDrive : Uninstall PSProvider : Microsoft.PowerShell.Core\Registry DisplayName : Adobe Flash Player ActiveX

Szval trkkzni kell, ha tnyleg csak az adott kulcs rtkt akarom megtekinteni:
[24] PS Uninstall:\>(Get-ItemProperty "Adobe Flash Player ActiveX").DisplayN ame Adobe Flash Player ActiveX

Azaz kln hivatkozni kell az adott kulcs nevre, nem igazn j a name paramter hasznlata. Ez fggvnyrt kilt, de ennek megvalstst az olvasra bzom. Mg kt lehetsgre hvnm fel a figyelmet a registry kulcsok olvassval kapcsolatban. Az egyik GetValueNames() metdus, amellyel az adott kulcs tnyleges rtkeinek neveit lehet kiolvasni. A nevek birtokban aztn pldul valamelyik ciklussal lehet mveleteket vgezni az rtkekkel. Erre pldaknt nzznk egy szkriptet, amely sszeszmolja, hogy gpnkre hny font van teleptve, s abbl mennyi a TrueType tpus:
[15] PS C:\> $ttf=0; (get-item "hklm:\\Software\Microsoft\Windows NT\Current Version\Fonts").GetValueNames() | Where-Object {$_.contains("TrueType")} | F orEach-Object {$ttf++}; $ttf 277

Ugyanezt a funkcit valstottam meg kvetkez szkriptben is, csak itt nem a GetValueNames() metdust alkalmaztam, hanem a PowerShell Select-Object cmdletjt, az ExtendProperty paramterrel, mellyel egy adott objektum egy adott, tmbt tartalmaz tulajdonsgnak rtkeit lehet kifejteni:

290

Gyakorlat
[22] PS C:\> $ttf=0; Get-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVe rsion\Fonts" | Select-Object -ExpandProperty Property | where-object {$_.con tains("TrueType")} | ForEach-Object {$ttf++}; $ttf 277

2.5.2 Registry elemek ltrehozsa, mdostsa


Ezek utn nem meglep, hogy a registry elemek ltrehozsa is hasonl mdon trtnik, mint a fjlok ltrehozsa. Megint fontos tudatostani, hogy mi a fjlszint objektum a registryben, s mi a tulajdonsg. Nzzk egy j tulajdonsg ltrehozst, hozzunk ltre az Outlook trlt elemek viszszallthatsgt megknnyt kulcsot:
[2] PS I:\>Set-Location HKLM:\SOFTWARE\Microsoft\Exchange\Client\Options [3] PS HKLM:\SOFTWARE\Microsoft\Exchange\Client\Options>New-ItemProperty . Name DumpsterAlwaysOn -Value 1 -type DWORD PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\S OFTWARE\Microsoft\Exchange\Client\Options PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\S OFTWARE\Microsoft\Exchange\Client PSChildName : Options PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry DumpsterAlwaysOn : 1

A [2]-es sorban az aktulis helynek belltom az a registry mappt, ahol j rtket akarok felvenni, majd a new-itemproperty cmdlettel hozom ltre az j rtket. Ennek paramterei a path (nincs kirva, rtke egy darab pont, azaz az aktulis elrsi t), a kulcs neve s tpusa. Tpusknt az albbi tblzat lehetsgeit hasznlhatjuk fel a registryben: Property tpus Binary DWord ExpandString MultiString String QWord Lers binris adat UInt32 egsz Krnyezeti vltzkat kifejt szveg Tbbsoros szveg Szveg 8 bjtos binris adat

Meglev kulcsok mdostsra a set-itemproperty cmdlet ll a rendelkezsnkre:


[9] PS HKLM:\SOFTWARE\Microsoft\Exchange\Client\Options>set-ItemProperty . Name DumpsterAlwaysOn -Value 0

291

Registry kezelse
Ha esetleg j kulcsot kellene ltrehoznunk, arra a new-item cmdletet hasznlhatjuk:
[14] PS HKLM:\SOFTWARE>New-Item SoosTibor Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE SKC --0 VC Name -- ---0 SoosTibor Property -------{}

Ezutn ehhez a new-itemproperty cmdlettel lehet felvenni rtkeket.

2.5.3 Registry elemek hozzfrsi listjnak kiolvassa


A registry kulcsok is rendelkeznek hozzfrsi listval, itt is tetten rhet a fjlokkal val analgia, azaz a registry esetben is a get-acl cmdlettel lehet a hozzfrsi listt kiolvasni, illetve a set-acl cmdlettel mdostani. Miutn ez tnyleg a fjlokkal teljesen azonos mdon trtnik, gy csak a kiolvassra mutatok egy pldt:
[84] PS HKCU:\Software> get-acl -path hklm:\system\currentcontrolset\ | fl Path : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\system\curr entcontrolset Owner : BUILTIN\Administrators Group : NT AUTHORITY\SYSTEM Access : BUILTIN\Users Allow ReadKey BUILTIN\Users Allow -2147483648 BUILTIN\Power Users Allow ReadKey BUILTIN\Power Users Allow -2147483648 BUILTIN\Administrators Allow FullControl BUILTIN\Administrators Allow 268435456 NT AUTHORITY\SYSTEM Allow FullControl NT AUTHORITY\SYSTEM Allow 268435456 CREATOR OWNER Allow 268435456 Audit : Sddl : O:BAG:SYD:AI(A;ID;KR;;;BU)(A;CIIOID;GR;;;BU)(A;ID;KR;;;PU)(A;CIIOI D;GR;;;PU)(A;ID;KA;;;BA)(A;CIIOID;GA;;;BA)(A;ID;KA;;;SY)(A;CIIOID; GA;;;SY)(A;CIIOID;GA;;;CO)

Megjegyzs: Itt jhetnk r, hogy vajon mirt nem az rtkek a fjlszint objektumok a registry PSDrive-ban. Azrt, mert ACL-t lltani csak a kulcsokon lehet, a tulajdonsgokon (property) nem. gy a fjlrendszerrel val analgia a kulcs mappa, fjl megfeleltetssel a legoptimlisabb.

292

Gyakorlat

2.6 WMI
A WMI technolgia biztostja a hlzatfelgyeleti szoftverek (gy pldul a Microsoft Systems Management Server) szmra szksges infrastruktrt. Kifejlesztsnek clja elssorban az volt, hogy egysges keretet (s felletet) biztostson a mr ltez felgyeleti technolgiknak (SNMP, DMI, stb.). A WMI els verzija a Windows NT SP4 CD-n jelent meg (Option Pack), de az SMS 2.0 verzija mr teljes egszben erre pl. Jelents klnbsgek vannak azonban a Windows 2000-ben, az XP-ben s a Windows Server 2003-ban tallhat vltozatok kztt. A legfontosabb klnbsg az, hogy a ksbbi WMI vltozatok egyre tbb rhat tulajdonsgot tartalmaznak, vagyis lehetsget adnak nem csak a rendszerjellemzk lekrdezsre, hanem belltsra is. A WMI tartozka a WMI Tools nev csomag, de ez nem rsze a Windows teleptsnek, kln kell letlteni s telepteni a Microsoft downloads weboldalrl. A csomag tartalmazza tbbek kztt a CIM Studio s az Object Browser nev alkalmazsokat; ezekkel a ksbbiekben mg fogunk tallkozni. WMI-re alapul rendszerfelgyeleti megoldsokat termszetesen nem csak a Microsoft, hanem szmos ms szoftvercg palettjn is tallhatunk.

2.6.1 A WMI ttekintse


Mieltt belemerlnnk a WMI technolgia rszleteibe, rdemes tisztzni, hogy mire is j ezek ismerete, hiszen a szoftvercgek j pnzrt megrjk neknk a kivl felgyeleti alkalmazsokat, mi kattintgathatunk a remek felleten. A WMI technolgia pedig legyen csak a szoftvercgek fejlesztinek problmja, k azrt kapjk a fizetsket, hogy ilyesmit megtanuljanak s hasznljanak. Nagyjbl hrom olyan ok van, ami miatt mgsem kerlhetjk el a WMI megismerst: Egyedi ignyek: Br a rendszerfelgyeleti szoftverek meglehetsen sokfle feladat megoldsra kpesek, specilis, egyedi funkcik mgis hinyozhatnak bellk. Ilyenkor kt dolgot tehetnk: kivrjuk azt a nhny vet, amg a kvetkez verzi megjelenik (taln abban benne lesz), vagy elkapjuk a Notepadot, s nhny sorban megrjuk magunk a hinyz funkcit, WMI-t hasznl PowerShell script segtsgvel. Kltsgek: A szoftvercgek kivl termkei sajnos pnzbe kerlnek, mghozz rendszer-felgyeleti szoftver esetben (nagyon) sok pnzbe. Egy Microsoft Systems Center Configuration Manager vagy IBM Tivoli megvsrlsa nhny tucat gp esetben szinte remnytelen (s teljesen flsleges is), de mg pr szz gp esetn sem biztos, hogy kifizetd. A nhny valban szksges funkci (pldul hardver s szoftverleltr, szmtgpek monitorozsa, riasztsok, stb.) WMI segtsgvel egszen knnyen megvalsthat. WMI-szrk: A Windows Server 2003 jdonsga, hogy a csoporthzirend (Group Policy) hatkrt WMI-szrk segtsgvel mdosthatjuk. Mit is jelent ez? Tegyk fel, hogy

293

WMI
csoporthzirend segtsgvel szoftvert tertnk a hlzaton (300 klnfle szmtgp). A teleptend szoftvernek viszont megvan az az elgg el nem tlhet tulajdonsga, hogy csak olyan gpen mkdik megfelelen, amelyben legalbb 128 MB RAM van. Ha ezek a gpek nem egy kln OU-ban vannak (mirt is lennnek?), akkor vagy krbejrjuk a 300 gpet a manulis teleptshez, vagy felkszlnk r, hogy az automatikus telepts valamilyen hibazenettel megszakad. A harmadik megolds a WMI-szr hasznlata. Ekkor az adott szmtgp a szr hatsra nyilatkozik a benne lv memria mennyisgrl, s a telepts csak megfelel eredmny esetn indul el.

2.6.2 A WMI felptse


A WMI a CIM (Common Information Model) segtsgvel jelenti meg az opercis rendszer felgyelt objektumait. Felgyelt objektum lehet brmelyik szoftver, hardvereszkz, logikai vagy fizikai komponens, amelynek llapota a rendszergazdt rdekelheti. A WMI hrom elklnthet rtegbl ll, a kvetkezkben ezekrl lesz sz.

(fogyasztk)

Consumers

.NET alkalmazs
C/C++ alkalmazs PowerShell szkript

CIM (Common Information Model)

COM

CIM Repository

Windows Management Service WinMgmt.exe

MOF

(szolgltatk)

Providers

Win32 API

SNMP

WDM

Exchange

Registry

52. bra A WMI rtegei

294

Gyakorlat
Consumers (fogyasztk) Fogyasztknak nevezzk azokat az alkalmazsokat, amelyek felhasznljk a WMI ltal biztostott adatokat. Fogyasztk lehetnek pldul szkriptek, Active X vezrlk, .NET alap programok, vagy vllalati rendszerfelgyeleti eszkzk (MOM, SMS, stb.). Valamennyi fogyaszt a Windows Management Service (WinMgmt.exe) ltal megvalstott COM csatolfelleten keresztl fr hozz az adatokhoz. Az alkalmazsoknak termszetesen nem kell tudniuk, hogy az egyes rendszerkomponensekre vonatkoz adatok valjban honnan s milyen mdon szrmaznak; nekik csak a COM csatolfellet ltal nyjtott lehetsgeket kell felhasznlniuk. CIM A CIM rtegben tallhatk a WMI kzponti komponensei. A CIM Repository tartalmazza azokat az osztlydefincikat, amelyekre a rendszer felgyelt objektumainak megjelentshez szksg van, a Windows Management Service pedig a CIM Repository alapjn tovbbtja a providerektl kapott adatokat a fogyaszt alkalmazsok fel. A MOF (Management Object Format) fjlok a CIM Repository bvtst teszik lehetv. Ilyen fjlokat a WMI rszeknt kapott MOF compiler (mofcomp.exe) segtsgvel kszthetnk. Maga a CIM Repository is tbb ilyen mdon lefordtott .mof fjlbl tevdik ssze. Providers (szolgltatk) a szolgltatk feladata a felgyelt objektumokkal val kzvetlen kommunikci, azok sajt API-jnak felhasznlsval. A klnfle rendszerkomponens-csoportok adatainak lekrdezst nll szolgltatk vgzik. A WMI csomag maga is szmos szolgltatt tartalmaz (a ksbbi Windows verzik egyre tbbet), de termszetesen sok alkalmazs hozza a sajt szolgltatjt, amelynek segtsgvel az alkalmazs adatai elrhetv vlnak WMI-n keresztl Az adatok tovbbtsa a kvetkez mdon trtnik: az alkalmazs a COM fellet hasznlatval brmely felgyelt objektum tetszleges adatra rkrdezhet. A WinMgmt.exe a CIM Repository adatainak felhasznlsval meghatrozza, hogy az adott informcit melyik providertl, s milyen mdon kell elkrnie. Ezutn megszltja a providert, az pedig lekrdezi az objektum megfelel adatt. Ezt azutn a WinMgmt.exe tovbbtja a fogyaszt alkalmazs fel. Vagyis mondhatjuk azt, hogy a CIM Repository tulajdonkppen egy egysges nyilvntarts, amelynek segtsgvel a klnbz providerek kezelse azonos mdon trtnhet. Minden adatot, amelyet a WMI-n keresztl el szeretnnk rni, tartalmaznia kell a CIM Repository objektummodelljnek, s regisztrlnunk kell a hasznlni kvnt providereket is.

2.6.3 A WMI objektummodellje


A WMI mkdsnek megrtshez mindenkppen szksges az objektummodell, s az ezzel kapcsolatos fogalmak ismerete; a kvetkezkben errl lesz sz. Osztlyok (Classes) A WMI objektummodellje osztlyokon alapul. Az osztly a rendszer valamely felgyelt objektumnak tpuslersa, amely tartalmazza az adott objektum tulajdonsgait s az ltala tmogatott metdusokat. A Win32_NetworkAdapter osztly pldul a szmtgpben lv hlzati adapterek tpuslerst tartalmazza. Az osztlyok kztt termszetesen rklds is ltezik. A szoksos felgyeleti szkriptek (programok) ltalban az rklsi lnc legvgn lv (levl) objektumokkal foglalkoznak, de termsze-

295

WMI
tesen lehetsg van arra is, hogy feljebb menjnk a hierarchiban, s egy adott kezdpont alatt lv osztlyok hasznos adatait nyerjk ki, anlkl, hogy pontosan tudnnk azok nevt. Absztrakt osztlynak nevezzk azokat az osztlyokat, amelyekbl nem lehet pldnyt ltrehozni; kizrlag rktsi clokat szolglnak. Tulajdonsgok (Properties) Az osztlyokhoz tulajdonsgok tartoznak, amelyek az osztly ltal meghatrozott objektumok lersra szolglnak. Termszetesen minden osztlyban olyan tulajdonsgok vannak definilva, amelyek az adott tpus objektum lershoz szksgesek. Szmos osztlyban tallkozhatunk kulcs (key) tulajdonsggal, ezek (az adatbzisokhoz hasonlan) az adott osztly pldnyainak egyedi azonostsra hasznlhatk. A Win32_NetworkAdapter osztly kulcstulajdonsga pldul a DeviceID. Pldnyok (Instances) Mg a Win32_NetworkAdapter osztly brmilyen hlzati adapter lersra kpes, az osztly pldnya egy bizonyos, fizikailag is ltez adapter reprezentcija. Az egyes pldnyokat az adott osztly kulcs tulajdonsgnak ismeretben szlthatjuk meg. Az objektum pldnyokat a WMI Object Browser segtsgvel jelenthetjk meg (az eszkz a WMI Tools csomag rsze).

53. bra WMI Object Browser

2.6.4 Smk
A Common Information Model smkbl pl fel, amelyek egymssal kapcsolatban ll osztlyokat tartalmaznak. Jelenleg a CIM hrom smt tartalmaz, az albbi brnak megfelelen:

296

Gyakorlat

Core schema

CIM_ManagedSystemElement

CIM_LogicalElement

CIM_LogicalDevice Common schema

CIM_MediaAccessDevice

CIM_DiskDrive Extensible schema Win32_DiskDrive

CIM_CDRomDrive

Win32_CDRomDrive

54. bra A CIM smk

A core smhoz tartoz absztrakt osztlyok kevs konkrtumot tartalmaznak, cljuk az, hogy jabb osztlyokat rkthessnk bellk. Ezen a szinten tulajdonkppen mg az sem biztos, hogy az rktett osztlyoknak brmi kze is lesz a szmtgpes rendszerekhez; modellezhetnek akr pleteket, vagy berendezsi trgyakat is. A common sma viszont mr hatrozottan szmtgprendszerek modellezsre szolgl. Az emltett kt smt a WBEM szabvny definilja, gy azok gyrt- s platformfggetlenek. Az extensible smk viszont mr az egyes szoftvergyrtk hatskrbe tartoznak; ide kerlhetnek az adott platformra vonatkoz specilis osztlyok. A WMI a Win32_ smt hasznlja a felgyelt objektumok modellezsre; az itt megtallhat osztlyok a common sma osztlyainak bvtett (rktett) vltozatai, gy megjelenthetik a Windows opercis rendszerekre jellemz specilis tulajdonsgokat is.

2.6.5 Nvterek
A WMI osztlyai klnbz nvterekhez tartoznak annak megfelelen, hogy melyik rendszerterletet jelentik meg. A nvterek szervezse hierarchikus, a fa gykere a root nvtr. Az egyes osztlyok tvonalnak megadsakor elszr is meg kell hatroznunk azt

297

WMI
a szmtgpet, amelyik a CIM Repositoryt tartalmazza, majd sorban meg kell adnunk a hozz vezet nvtr-hierarchia elemeit:
\\Gep\Root\Cimv2:Win32_LogicalDisk.DeviceID=C:

55. bra A nvterek szervezse hierarchikus

Amint az brn is lthat, minden szmtgpen szmos klnbz nvteret tallhatunk, de a szmtgp hardverelemeivel s az opercis rendszerrel kapcsolatos objektumokat ler osztlyok szinte kivtel nlkl a Cimv2 nvtrben tallhatk, gy termszetesen a rendszerfelgyeleti szkriptekben ez lesz a legtbbet hasznlt nvtr. A WMI CIM Studio (WMI Tools) segtsgvel a smt s a nvtereket jelenthetjk meg. Felhasznlhatjuk osztlyok, illetve ezek tulajdonsgainak s metdusainak megkeressre (erre gyakran lesz szksg), s az osztlyok kztti kapcsolatok feltrkpezsre is.

56. bra WMI CIM Studio

298

Gyakorlat

2.6.6 A legfontosabb providerek


A WMI providerek kt forrsbl szrmazhatnak; vannak alkalmazs specifikus (ezeket egyes alkalmazsok teleptik), s vannak beptett (ezeket a Windows rszeknt kapjuk) providerek. A kvetkezkben ttekintjk az opercis rendszer rszeknt rkez legfontosabb providereket: Win32 a Win32 provider a szmtgp hardver elemeihez s az opercis rendszer legfontosabb komponenseihez tartoz osztlyok kiszolglst vgzi. A provider az adatok sszegyjtshez a Win32 API-t s klnfle registry rtkeket hasznl. A root/cimv2 nvtr osztlyainak dnt tbbsgt ez a provider szolglja ki. SNMP A provider a meglv SNMP infrastruktra s a WMI lehetsgeinek egyttes hasznlatt teszi lehetv. A Windows Server 2003-bl ez a provider mr hinyzik. Performance Counter A WMI legjabb verzijban a Windows Management Service a Performance Monitor ltal is hasznlt adatfjlok alapjn felpti a teljestmnyobjektumokat reprezentl osztlyokat a CIM Repositoryban. Az alkalmazsok a tbbi WMI osztlyhoz hasonlan krdezhetik le a teljestmnyadatokat. Registry A registry providert felhasznl osztlyok lehetv teszik, hogy az alkalmazsok rhassk s olvashassk a registryben szerepl rtkeket. A RegistryEvent provider (regevent.mof) segtsgvel pedig alkalmazsunk rtestst kaphat a kivlasztott registry rtkek mdosulsrl. Windows Driver Model A Windows Driver Model lehetv teszi, hogy az eszkzvezrl programok adatokat szolgltassanak az ltaluk vezrelt eszkzzel kapcsolatban .A provider ezekhez az adatokhoz biztost hozzfrst a root/wmi nvtrben ltrehozott osztlyok segtsgvel. Directory Services a DS provider az Active Directory osztlyait s objektumait teszi elrhetv a WMI-t hasznl alkalmazsok szmra. A provider az AD smt kpezi le a WMI smba. A DS provider ADSI segtsgvel csatlakozik az Active Directoryhoz. Event Log a provider a Windows Esemnynapl szolgltatshoz biztost hozzfrst, s lehetv teszi azt is, hogy programunk rtestst kapjon az j naplbejegyzsek keletkezsrl. Windows Installer a provider a root/cimv2 nvtrben ltrehozott osztlyok segtsgvel biztostja a hozzfrst a Windows Installer szolgltats ltal teleptett csomagokkal kapcsolatos adatokhoz. A provider lehetv teszi az MSI csomagok teleptst, eltvoltst s belltst is. Security A provider lehetv teszi a Windows rendszer biztonsgi belltsainak kiolvasst s mdostst. Bellthatjuk a fjlok s mappk tulajdonost, naplzst, s a hozzfrsi jogokat is.

2.6.7 WMI objektumok elrse PowerShell-bl


A PowerShell 1.0-ban egyetlen egy cmdletbe srtettk az alkotk a WMI-vel kapcsolatos funkcikat, ez a Get-WMIObject. Nzzk meg a lehetsges szintaxisokat:

299

WMI
[5] PS I:\>(get-help Get-WmiObject).syntax Get-WmiObject [-class] <string> [[-property] <string[]>] [-namespace <strin g>] [-computerName <string[]>] [-filter <string>] [-credential <PSCredentia l>] [<CommonParameters>] Get-WmiObject [-namespace <string>] [-computerName <string[]>] [-credential <PSCredential>] [-list] [<CommonParameters>] Get-WmiObject -query <string> [-namespace <string>] [-computerName <string[ ]>] [-credential <PSCredential>] [<CommonParameters>]

Elsknt prbljuk meg kilistzni a klnbz WMI osztlyokat. Ehhez a hrom lehetsges szintaxis kzl a msodik hasznlata szksges, ahol meghatrozhatunk egy nvteret a listnk szktse cljbl:
[7] PS I:\>get-wmiobject -namespace "root/CIMV2" -list __SecurityRelatedClass __PARAMETERS __NotifyStatus Win32_PrivilegesStatus Win32_TSRemoteControlSettingError Win32_TSSessionDirectoryError Win32_TerminalError ... Win32_Product Win32_ImplementedCategory Win32_SoftwareElementAction CIM_ReplacementSet CIM_ActsAsSpare CIM_PhysicalElementLocation __NTLMUser9X __SystemSecurity __ExtendedStatus Win32_TSNetworkAdapterSettingError Win32_TSEnvironmentSettingError Win32_TSLogonSettingError Win32_JobObjectStatus Win32_ComputerSystemProduct CIM_SoftwareElementActions CIM_ToDirectorySpecification CIM_Configuration CIM_FRUIncludesProduct

Ha nem hasznljuk a list kapcsolt, akkor az els szintaxis hasznlatra gondol s bekri az abban hasznlatos -class paramtert. Ha mr tudjuk, hogy milyen osztly objektumait keressk, akkor hasznlhatjuk az els szintaxist. Pldul keressk az adott gpre teleptett klnbz szoftvereket:
[11] PS I:\>get-wmiobject Win32_Product IdentifyingNumber Name Vendor Version Caption IdentifyingNumber Name Vendor Version Caption ... : : : : : : : : : : {121634B0-2F4B-11D3-ADA3-00C04F52DD52} Windows Installer Clean Up Microsoft Corporation 3.00.00.0000 Windows Installer Clean Up {EA1E2517-9281-4684-93B2-460530295ED3} PowerShellScriptOMatic v.1.0 MrEdSoftware 1.0.0 PowerShellScriptOMatic v.1.0

300

Gyakorlat
Gyakran nem az adott osztly sszes objektumra van szksgnk, hanem valamilyen szempont szerint kivlasztott pldnyokra. Erre a clra a WMI-ben az SQL nyelvhez nagyon hasonl WQL (WMI Query Language) nyelvet lehet hasznlni. Ilyen lekrdezseket a Get-WMIObject harmadik szintaxisa szerint lehet a parancssorunkba begyazni:
[14] PS I:\>Get-WmiObject -Query 'select * from Win32_Product where Vendor=" Microsoft Corporation"' IdentifyingNumber Name Vendor Version Caption IdentifyingNumber Name Vendor Version Caption ... : : : : : : : : : : {121634B0-2F4B-11D3-ADA3-00C04F52DD52} Windows Installer Clean Up Microsoft Corporation 3.00.00.0000 Windows Installer Clean Up {90120000-0010-0409-0000-0000000FF1CE} Microsoft Software Update for Web Folders Microsoft Corporation 12.0.6215.1000 Microsoft Software Update for Web Folders (English) 12 (English) 12

Megjegyzs Vigyzni kell az idzjelezsre, hiszen a WQL kifejezst idzjelezni kell, amin bell szintn idzjel szerepel ltalban a where felttelnl. Ezt legegyszerbben a ktfajta idzjel hasznlatval oldhatjuk meg, mint ahogy a fenti pldban tettem, s akkor nem kell az escape (` Alt Gr+7) karaktert hasznlni. Ha nagyon egyszer a kivlasztsi kritriumunk, akkor hasznlhatjuk az els szintaxis -filter opcijt is:
[20] PS I:\>Get-WmiObject Win32_Product -filter 'Vendor="Microsoft Corporati on"'

A filter paramterrel gyakorlatilag a lekrdezs where rszt adhatjuk meg. A WMI-ben az mg a nagyszer, hogy tvoli gpekre is kiadhatk lekrdezsek. Magnak a PowerShellnek ilyen jelleg tvfuttatsa csak a 2.0 verziban fog megjelenni, azaz jelenleg a get-service cmdlet csak sajt gpre adhat ki, de az albbi paranccsal hasonl informcikhoz juthatunk a WMI segtsgvel tvoli gpre vonatkozlag is:
[21] PS I:\>get-wmiobject win32_service -credential IQJB\soostibor -computer J-CRM

A computer s credential paramterek meghatrozsval adhatjuk meg, hogy melyik gpre s kinek a nevben akarunk csatlakozni. Termszetesen a parancs sikeres futtatshoz biztostani kell a Windows tzfalon a megfelel portok megnyitst, hogy a kommunikci sikeres legyen.

301

WMI
A WMI osztlyok bngszsben, s az osztlyok pldnyainak kilistzshoz szksges PowerShell parancs sszelltsban segt a PowerShellScriptOMatic ingyenesen letlthet apr kis eszkz:

57. bra PowerShellScriptOMatic

2.6.8 WMI objektumok metdusainak meghvsa


A WMI objektumok is rendelkeznek metdusokkal. Ezek feldertsre hasznlhatjuk a PowerShell get-member cmdletjt. Pldul nzzk a Win32_Share WMI osztly elemeinl milyen metdusok llnak rendelkezsnkre:
[23] PS I:\>Get-WmiObject Win32_Share Name ---IPC$ _download DVD DVD2 ADMIN$ C$ Path ---C:\_download E:\ D:\ C:\WINDOWS C:\ Description ----------Remote IPC

Remote Admin Default share

[24] PS I:\>Get-WmiObject Win32_Share | Get-Member TypeName: System.Management.ManagementObject#root\cimv2\Win32_Share Name ---GetAccessMask SetShareInfo AccessMask AllowMaximum MemberType ---------Method Method Property Property Definition ---------System.Management.ManagementBaseObject ... System.Management.ManagementBaseObject ... System.UInt32 AccessMask {get;set;} System.Boolean AllowMaximum {get;set;}

302

Gyakorlat
Caption Description InstallDate MaximumAllowed Name Path Status Type __CLASS __DERIVATION __DYNASTY __GENUS __NAMESPACE __PATH __PROPERTY_COUNT __RELPATH __SERVER __SUPERCLASS PSStatus ConvertFromDateTime ConvertToDateTime Delete GetType Put Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property PropertySet ScriptMethod ScriptMethod ScriptMethod ScriptMethod ScriptMethod System.String Caption {get;set;} System.String Description {get;set;} System.String InstallDate {get;set;} System.UInt32 MaximumAllowed {get;set;} System.String Name {get;set;} System.String Path {get;set;} System.String Status {get;set;} System.UInt32 Type {get;set;} System.String __CLASS {get;set;} System.String[] __DERIVATION {get;set;} System.String __DYNASTY {get;set;} System.Int32 __GENUS {get;set;} System.String __NAMESPACE {get;set;} System.String __PATH {get;set;} System.Int32 __PROPERTY_COUNT {get;set;} System.String __RELPATH {get;set;} System.String __SERVER {get;set;} System.String __SUPERCLASS {get;set;} PSStatus {Status, Type, Name} System.Object ConvertFromDateTime(); System.Object ConvertToDateTime(); System.Object Delete(); System.Object GetType(); System.Object Put();

Pldul rendelkezsnkre ll a Delete() metdus, amellyel az adott megosztst tudjuk megszntetni:


[25] PS I:\>$shares = Get-WmiObject Win32_Share [26] PS I:\>$shares Name ---IPC$ _download DVD DVD2 ADMIN$ C$ Path ---C:\_download E:\ D:\ C:\WINDOWS C:\ Description ----------Remote IPC

Remote Admin Default share

[27] PS I:\>$shares[3].Delete() [28] PS I:\>Get-WmiObject Win32_Share Name ---IPC$ _download DVD ADMIN$ C$ Path ---C:\_download E:\ C:\WINDOWS C:\ Description ----------Remote IPC Remote Admin Default share

A fenti pldban a *27+-es sorban trltem a DVD2 nev megosztsomat.

303

WMI
De vajon hogyan lehet j megosztst ltrehozni? Nagyon egyszer, egy j Win32_Share objektumot kell definilni, s annak van Create() metdusa:
[31] PS I:\>$newshare = [wmiclass] "Win32_Share" [32] PS I:\>$newshare | Get-Member TypeName: System.Management.ManagementClass#ROOT\cimv2\Win32_Share Name ---Name Create __CLASS ... MemberType ---------AliasProperty Method Property Definition ---------Name = __Class System.Management.ManagementBaseObj... System.String __CLASS {get;set;}

Ennek paramterezst a kvetkez mdon tudjuk megnzni, a tnyleges paramterezs a Value mellett lthat:
[33] PS I:\>$newshare.create MemberType : Method OverloadDefinitions : {System.Management.ManagementBaseObject Create(System .String Path, System.String Name, System.UInt32 Type, System.UInt32 MaximumAllowed, System.String Descript ion, System.String Password, System.Management.Manage mentObject#Win32_SecurityDescriptor Access)} TypeNameOfValue : System.Management.Automation.PSMethod Value : System.Management.ManagementBaseObject Create(System. String Path, System.String Name, System.UInt32 Type, System.UInt32 MaximumAllowed, System.String Descripti on, System.String Password, System.Management.Managem entObject#Win32_SecurityDescriptor Access) Name : Create IsInstance : True

Szerencsre nem minden paramtert ktelez kitlteni, gy egy egyszer megoszts a kvetkez kifejezssel is ltrehozhat:
[34] PS I:\>$newshare.create("c:\old","OldShare",0) __GENUS __CLASS __SUPERCLASS __DYNASTY __RELPATH __PROPERTY_COUNT __DERIVATION __SERVER __NAMESPACE __PATH ReturnValue : : : : : : : : : : : 2 __PARAMETERS __PARAMETERS 1 {}

304

Gyakorlat
Lthatjuk a 0-s visszatrsi rtkbl, hogy a mvelet sikeres volt, gy kilistzhatjuk az aktulis megosztsokat, melynek vgn ott az j megosztsunk:
[35] PS I:\>Get-WmiObject Win32_Share Name ---IPC$ _download DVD ADMIN$ C$ OldShare Path ---C:\_download E:\ C:\WINDOWS C:\ c:\old Description ----------Remote IPC Remote Admin Default share

A metdusok bngszsre is alkalmas msik eszkz a PowerShell WMI Browser, vagy ms nven WMIExplorer.ps1:

58. bra PowerShell WMI Browser

Ez az eszkz azrt is rdekes, mert szntisztn PowerShellben van megrva! rdemes belenzni a szkript forrskdjba, lthat benne, hogy hogyan szltja meg a .NET keretrendszer grafikus osztlyait, melyek segtsgvel felpti a fenti kpen lthat ablakot a sok vezrlelemmel egytt. Persze a PowerShellt nem grafikus alkalmazsok rsra talltk ki, gy ilyeneket nem tl egyszer ltrehozni. A PowerShell WMI Browser alkotja, a The PowerShell Guy sem Notepad eltt lve ptygte be a programsorokat, hanem egy C#-ban megrt programot a forrskd alapjn egy szkript segtsgvel alaktott t szntiszta PowerShell szkriptt.

305

WMI

2.6.9 Fontosabb WMI osztlyok


A kvetkezkben nhny egyszerbb pldt vlogattam ssze a WMI legklnbzbb terleteirl. Alapvet szmtgp-informcik kijelzse:
[45] PS I:\>get-wmiobject -class "Win32_ComputerSystem" -namespace "root\CIM V2"

BIOS informcik:
[46] PS I:\>get-wmiobject -class "Win32_BIOS" -namespace "root\CIMV2"

Alaplap informcik:
[47] PS I:\>get-wmiobject -class "Win32_BaseBoard" -namespace "root\CIMV2"

Szmtgp hznak informcii (pl. sorozatszm):


[48] PS I:\>get-wmiobject -class "Win32_SystemEnclosure" -namespace "root\CI MV2"

Processzor informcik:
[53] PS I:\>get-wmiobject -class "Win32_Processor" -namespace "root\CIMV2"

Rszletes memriainformcik (blokkok szintjn is):


[55] PS I:\>get-wmiobject -class "Win32_PhysicalMemory" -namespace "root\CIM V2"

PlugnPlay eszkzk:
[59] PS I:\>get-wmiobject -class "Win32_PnPEntity" -namespace "root\CIMV2"

Videokrtya informcik:
[61] PS I:\>get-wmiobject -class "Win32_DisplayConfiguration" -namespace "ro ot\CIMV2"

Eventlog llomnyok:
[64] PS I:\>get-wmiobject -class "Win32_NTEventlogFile" -namespace "root\CIM V2"

Eventlog llomnyok tvoli gprl (lsd 2.4 Az Esemnynapl feldolgozsa (GetEventlog) fejezet):

306

Gyakorlat
[64] PS I:\>get-wmiobject -class "Win32_NTEventlogFile" -namespace "root\CIM V2" -credential IQJB\soostibor -computer J-CRM

Hlzati adapterek konfigurcija:


[66] PS I:\>get-wmiobject -class "Win32_NetworkAdapterConfiguration" -namesp ace "root\CIMV2"

Login informcik:
[68] PS I:\>get-wmiobject -class "Win32_NetworkLoginProfile" -namespace "roo t\CIMV2"

A Windows verzinformcii:
[69] PS I:\>get-wmiobject -class "Win32_OperatingSystem" -namespace "root\CI MV2"

Page-file informcik:
[70] PS I:\>get-wmiobject -class "Win32_PageFile" -namespace "root\CIMV2"

Gp helyi ideje:
[73] PS I:\>get-wmiobject -class "Win32_LocalTime" -namespace "root\CIMV2"

Idzna:
[74] PS I:\>get-wmiobject -class "Win32_TimeZone" -namespace "root\CIMV2"

Printer-informcik:
[76] PS I:\>get-wmiobject -class "Win32_Printer" -namespace "root\CIMV2"

Teleptett javtcsomagok:
[77] PS I:\>get-wmiobject -class "Win32_QuickFixEngineering" -namespace "roo t\CIMV2"

Partcik:
[78] PS I:\>get-wmiobject -class "Win32_DiskPartition" -namespace "root\CIMV 2"

Logikai meghajtk:
[79] PS I:\>get-wmiobject -class "Win32_LogicalDisk" -namespace "root\CIMV2"

307

WMI
Meghajtk:
[80] PS I:\>get-wmiobject -class "Win32_DiskDrive" -namespace "root\CIMV2"

308

Gyakorlat

2.7 Rendszerfolyamatok s szolgltatsok


Korbban mr tallkozhattunk a Get-Process s a Get-Service cmdlettel, amelyek segtsgvel a rendszerfolyamatok s a szolgltatsok listjt krhetjk le. A folyamatokkal s szolgltatsokkal kapcsolatban azonban nem csak listzst, hanem brmilyen ms feladatot is elvgezhetnk a PowerShell cmdletjeivel, illetve ha minden ktl szakad, kzvetlenl a megfelel .NET komponensek segtsgvel.

?
re:

Feladat: Indtsuk el, majd lltsuk le a notepad.exe-t!

Elszr is nzzk meg, hogy milyen cmdleteket hasznlhatunk a folyamatok kezelsPS C:\> get-help process Name ---Get-Process Stop-Process Category -------Cmdlet Cmdlet Synopsis -------Gets the processes th... Stops one or more run...

Mindssze kt cmdlet kerlt a listba, a mr ismert Get-Process s a StopProcess. Nincsen Start-Process!? Mindegy, szerencsre mr minden eszkznk megvan a helyes megoldshoz, csak annyit kell tudnunk, hogy a .NET System.Diagnostics.Process osztlyban van egy statikus Start() metdus. Teht:
PS C:\> [System.Diagnostics.Process]::Start("notepad") Handles ------0 NPM(K) -----0 PM(K) ----140 WS(K) VM(M) ----- ----92 1 CPU(s) -----0,02 Id ProcessName -- ----------2980 notepad

A megjelen tblzat egy kicsit furcsa lehet, mg visszatrnk r, hogy mi is ez. Persze lehetne egy kiss egyszerbben is, hiszen brmilyen vgrehajthat fjlt kzvetlenl is elindthatunk a PowerShellbl:
PS C:\> notepad

Ez a megolds valban egyszer, azonban korntsem egyenrtk az elzvel. A notepad persze gy is elindul, majd csak a lelltsnl lesznek kisebb problmk. Nzzk meg jobban a korbban hasznlt Start() metdust:
PS C:\> [System.Diagnostics.Process] | get-member static | format-table -wrap TypeName: System.Diagnostics.Process

309

Rendszerfolyamatok s szolgltatsok
Name ---... Start MemberType Definition ---------- ---------Method static System.Diagnostics.Process Start(Strin g fileName, String userName, SecureString pas sword, String domain), static System.Diagnost ics.Process Start(String fileName, String arg uments, String userName, SecureString passwor d, String domain), static System.Diagnostics. Process Start(String fileName), static System .Diagnostics.Process Start(String fileName, S tring arguments), static System.Diagnostics.P rocess Start(ProcessStartInfo startInfo)

Lthatjuk, hogy ez fggvny; mghozz egy Process objektumot ad vissza (ennek szveges reprezentcija jelent meg a konzolon a korbbi parancs hatsra!), amelynek segtsgvel ksbb is kapcsolatban maradhatunk az elindtott folyamattal. Lekrdezhetjk pldul, hogy mennyi processzoridt, vagy memrit hasznl, mikor indult el, stb. s, termszetesen, le is llthatjuk, mghozz nem csak gy tallomra, hanem pontosan azt a notepadot, amelyet korbban elindtottunk. Adjuk ki a kvetkez utastst:
PS C:\> stop-process -name "notepad"

Mi fog trtnni? Lelltjuk a notepad nev folyamatot, de kiss nagyvonal mdszerrel nem csak azt az egyet, amit elindtottunk, hanem az sszest. Persze nem csak nv, hanem Process ID (PID) is megadhat a pontos clzshoz, csak sajnos az egyszerbb indts esetn semmit nem tudunk a folyamatrl, teht a PID-jt sem. A feladat teljesen korrekt megoldsa teht a kvetkez: Indts (a visszaadott Process objektum referencija belekerl a $notepad vltozba):
PS C:\> $notepad = [System.Diagnostics.Process]::Start("notepad")

Lellts:
PS C:\> stop-process inputobject $notepad

Feladat: lltsuk le gpnkn az sszes lellthat szolgltatst!

Elszr is krnnk kell egy listt a szolgltatsokrl, s ki kell vlogatnunk kzlk azokat, amelyek lellthatk, vagyis a CanStop tulajdonsguk igaz rtket ad vissza:
PS C:\> get-service | where-object {$_.CanStop} Status -----Running Running Name ---ALG AudioSrv DisplayName ----------Alkalmazsi rteg tjrszolgltatsa Windows audi

310

Gyakorlat
Running Running ... BITS Browser Httrben fut intelligens tviteli... Szmtgp-tallz

A kirt tblzatban nem szerepel a CanStop rtk, gy ha nem vagyunk biztosak a dolgunkban, rdemes lehet egy olyan listt krni, amelyben sajt szemnkkel is meggyzdhetnk a helyes eredmnyrl:
PS C:\> get-service | where-object {$_.CanStop} | format-table name, canstop -autosize Name ---ALG AudioSrv BITS Browser ... CanStop ------True True True True

Ezutn mr csak vgig kell lpkednnk a gyjtemny valamennyi elemn, s mindegyikre meghvni a Stop() metdust:
PS C:\> get-service | where-object {$_.CanStop} | foreach-object {$_.Stop()}

Vigyzat! A szolgltatsok lelltsa utn valsznleg jra kell indtanunk a szmtgpet. Amint a bevezetben mr emltettk a PowerShell jelenlegi verzija kzvetlenl nem tmogatja tvoli gpek elrst. Elrhetek azonban ezek a gpek is, ha kls segtsget vesznk ignybe: WMI hasznlatval lekrdezhetk s felgyelhetk a tvoli gpeken fut folyamatok s szolgltatsok is. Pldaknt nzznk egy szkriptet, amellyel akr tvoli gpeken is meghvhatunk WMI metdusokat, jelenleg a szolgltatsok StopService metdust hvja. Ez a szkript a 2.6.8 WMI objektumok metdusainak meghvsa fejezet vgn mr ltott WMI Explorer segtsgvel kszlt eredetileg, egy kicsit javtottam s optimalizltam rajta:
# # # # # Win32_Service. StartService-Method Template Script" Created by PowerShell WmiExplorer /\/\o\/\/ 2006 www.ThePowerShellGuy.com

$Computer = "." $Class = "Win32_Service" $Method = "StopService" # Win32_Service. Key Properties : $Name = [string] "Browser" $filter="Name = '$Name'"

311

Rendszerfolyamatok s szolgltatsok
$MC = get-WMIObject $class -computer $Computer -Namespace "ROOT\CIMV2" filter $filter "Calling $Class:$Name : $Method " $R = $mc.PSBase.InvokeMethod($Method,$Null) "Result :" $R | Format-list

A $Computer vltozba a cl gp nevt kell berni, a $Name vltozba a lelltani kvnt szolgltats nevt.

2.7.1.1 Szolgltatsok Startup tulajdonsga


Ha mr get-service, akkor nzzk meg, hogy az elbb ltott hasznos CanStop tulajdonsg mellett, vajon van-e StartupType, vagy valami hasonl tulajdonsga a szolgltats-objektumoknak? Nzzk meg a tulajdonsg jelleg tagjellemzket:
[13] PS C:\> get-service alerter | get-member -MemberType properties TypeName: System.ServiceProcess.ServiceController Name ---Name CanPauseAndContinue CanShutdown CanStop Container DependentServices DisplayName MachineName ServiceHandle ServiceName ServicesDependedOn ServiceType Site Status MemberType ---------AliasProperty Property Property Property Property Property Property Property Property Property Property Property Property Property Definition ---------Name = ServiceName System.Boolean CanPauseAndContinue {get;} System.Boolean CanShutdown {get;} System.Boolean CanStop {get;} System.ComponentModel.IContainer Conta... System.ServiceProcess.ServiceControlle... System.String DisplayName {get;set;} System.String MachineName {get;set;} System.Runtime.InteropServices.SafeHan... System.String ServiceName {get;set;} System.ServiceProcess.ServiceControlle... System.ServiceProcess.ServiceType Serv... System.ComponentModel.ISite Site {get;... System.ServiceProcess.ServiceControlle...

Engem igazbl az indulsi llapot rdekelne (Automatic, Manual, Disabled). Nzzk meg, hogy pl. a sokat sejtet ServiceType vajon ezt rejti-e?
[14] PS C:\> get-service alerter | Format-Table -Property Name, Status, Serv iceType -auto Name Status ServiceType ------------------Alerter Stopped Win32ShareProcess

Sajnos nem. Ht ez bosszant! Annl is inkbb, mert a set-service cmdlet vidman tartalmaz erre a tulajdonsgra vonatkoz belltsi lehetsget:

312

Gyakorlat
[15] PS C:\> get-help Set-Service NAME Set-Service SYNOPSIS Changes the display name, description, or starting mode of a service. SYNTAX Set-Service [-name] <string> [-displayName <string>] [-description <str ing>] [-startupType {<Automatic> | <Manual> | <Disabled>}] [-whatIf] [confirm] [<CommonParameters>] ...

Na de WMI-bl a StartupType adathoz is hozzfrhetnk, ugyan ott StartMode-nak hvjk:


PS I:\> $service=[WMI] "Win32_Service.Name=""Alerter""" PS I:\> $service.StartMode Disabled

Hogyan lehetne azt elrni, hogy ne kelljen kt menetben kiszedni egy szolgltats adatait (egy get-service PowerShell cmdlet s egy WMI lekrdezs), hanem valahogy ezeket egyben ltni? Szerencsre a PowerShell annyira rugalmas, hogy mg ezt is meg lehet tenni az 1.5.10 Objektumok testre szabsa, kiegsztse fejezetben ltott mdon,
types.ps1xml fjl ltrehozsval. Ltrehoztam egy soost.service.ps1xml fjlt ugyanazon elrsi ton, mint ahol az eredeti types.ps1xml is van. <Types> <Type> <Name>System.ServiceProcess.ServiceController</Name> <Members> <ScriptProperty> <Name>StartupType</Name> <GetScriptBlock> ([Wmi] "Win32_Service.Name=""$($this.Name)""").StartMode </GetScriptBlock> </ScriptProperty> </Members> </Type> </Types> A szerkezet majdnem magrt beszl. Egyrszt a "GetScriptBlock" szorul magyarzatra. ltalban egy tulajdonsgot kiolvashatunk, esetleg rtket is adhatunk neki. n itt ebben a fjlban csak kiolvassi viselkedst definiltam, az rtkadsit nem. (Az egybknt a SetScriptBlock lenne.) Msrszt itt nem $_ vltozval hivatkozunk magunkra, hanem a $this vltozval. Most mr csak be kell etetni a rendszerbe az n tpusmdostsomat s mr nzhetjk is az eredmnyt:

313

Rendszerfolyamatok s szolgltatsok
PS C:\> Update-TypeData soost.service.ps1xml PS C:\> (Get-Service alerter).StartupType Disabled

314

Gyakorlat

2.8 Teljestmny-monitorozs
nmagban a PowerShell teljestmnyt sem tud monitorozni, jelenleg nincsenek specifikusan ilyen jelleg cmdletek, viszont a .NET keretrendszer erre a clra is nyjt osztlyokat szmunkra. A legpraktikusabb osztly a System.Diagnostics.PerformanceCounter. Ennek egy ltalunk felptett objektuma fogja a teljestmnyszmllkat generlni szmunkra a kvetkez mdon:
[32] PS C:\>$perfobj="Processor" [33] PS C:\>$perfcounter="% Processor Time" [34] PS C:\>$perfinstance="_Total" [35] PS C:\>$perftarget="soostibor" [36] PS C:\>$perfdata = New-Object System.Diagnostics.PerformanceCounter( $p erfobj, $perfcounter, $perfinstance, $perftarget) [37] PS C:\>$perfdata.NextValue() 0 [38] PS C:\>$perfdata.NextValue() 1,367338

Gyakorlatilag a fenti pldban a grafikus Performace Monitor alkalmazs albbi dialgusablaknak adatait rakom be klnbz vltozkba:

59. bra Performance Monitor adatai

Majd a [36]-os sorban hozom ltre a teljestmnyszmllt. A mintavtel a NextValue() metdus meghvsra trtnik, els esetben ez mg nem ad igazi eredmnyt, csak indtja a mrst, a tovbbi hvsokkal mr az aktulis rtkeket kapjuk meg. A New-Object meghvsnl nem ktelez az sszes argumentumot megadni, elg a teljestmny-objektum s -szmll definilsa, s a tbbpldnyos szmllknl a pldny (instance) megadsa. Ha a clszmtgpet nem definiljuk, akkor az az aktulis gp megfelel paramtert fogja mrni.

315

Felhasznl-menedzsment, Active Directory

2.9 Felhasznl-menedzsment, Active Directory


2.9.1 Mi is az ADSI?
Az ADSI segtsgvel a klnfle cmtrakat egysges formban kezelhetjk, mivel az ltala biztostott csatolfelletek felhasznlsval alkalmazsunk a klnfle szerkezet cmtrakat is azonos mdon rheti el. Az ADSI hasonl szerepet tlt be a cmtrak elrsben, mint az ODBC a klnfle adatbzis-kiszolglk esetben. Segtsgvel a cmtrakkal kapcsolatos gyakori feladatok felhasznlk kezelse, klnfle erforrsok keresse az elosztott, tbb cmtrmegoldst hasznl krnyezetekben is knnyen elvgezhetek. Az ADSI objektumai valjban COM objektumok, amelyek a kezelni kvnt cmtr objektumait jelentik meg, s COM csatolfelleteken keresztl rhetek el. Az objektumok kt csoportba sorolhatk; a kontner tpus objektumok ms kontnereket, s levl tpus objektumokat tartalmazhatnak.

2.9.2 ADSI providerek


Az ADSI providerek valstjk meg a konkrt cmtrtpus elrshez szksges funkcikat. Amint az albbi brn is lthat, az ADSI-t hasznl gyfeleknek (gy szkriptjeinknek, vagy a .NET Framework komponenseinek is) csak az ADSI provider ltal biztostott csatolfellet megfelel hasznlatval kell trdnik, a httrben lv cmtr egyedi adottsgainak megfelel mveletek kezdemnyezse mr a provider feladata.
ADSI provider Kontner komponens objektum
COM objektum

Cmtr

komponensek

.NET

Levl komponens objektum


COM objektum

Active Directory A cmtrszolgltats Services Interfaces sajt protokollja (pldul LDAP)

60. bra Cmtr elrse ADSI provideren keresztl

Az ADSI ltal biztostott legfontosabb providerek a kvetkezk:

316

Gyakorlat
WinNT:// a provider segtsgvel a Windows NT 4.0 tartomnyokhoz frhetnk hozz, s ez teszi lehetv az nll (Windows NT, 2000, XP) szmtgpeken lev helyi cmtr-adatbzisokhoz (SAM) val hozzfrst is. Meg kell jegyeznnk, hogy a WinNT provider kompatibilitsi okokbl hasznlhat Active Directory esetben is, de ez szmos korltozssal jr (a keress nem tmogatott, szervezeti egysgek megadsa nem lehetsges, stb.) ezrt hasznlata nem clszer. LDAP:// ez a provider az LDAP protokoll segtsgvel elrhet cmtrak (pldul az Active Directory) kezelsre szolgl. NDS:// segtsgvel a Novell Directory Services szolgltatshoz frhetnk hozz.

2.9.3 Az ADSI gyorsttr


Minden ADSI objektum gyfloldali attribtum-gyorsttrral rendelkezik, amelyben ideiglenesen troldnak az objektumhoz tartoz tulajdonsgok nevei s rtkei. A gyorsttr jelentsen nveli az attribtumokkal vgzett klnfle mveletek teljestmnyt, mivel nlkle programunknak minden egyes attribtum rtknek belltsa utn a cmtrhoz kne fordulnia.

2.9.4 Active Directory informcik lekrdezse


Az elmleti ttekints utn nzzk lesben a cmtrak elrst PowerShell segtsgvel, mellyel az Active Directory-val kapcsolatos felgyeleti tevkenysgek is hatkonyan automatizlhatk. De mg mieltt ebbe belesnnk magunkat, nzznk pr elkszt tevkenysget. Miutn a PowerShell alatt a .NET keretrendszer tallhat, gy fontos ismerni a cmtrak elrsnek problmit diagnosztizlni kpes fontosabb osztlyokat. Miutn az Active Directory hibk 110%-a () valamilyen DNS hibra vezethet vissza, gy elsknt ellenrizzk a nvfeloldst. Az ezzel kapcsolatos .NET osztly a System.Net.Dns, melynek GetHostEntry statikus metdusval tudjuk ellenrizni pldul a tartomnyvezrlnk nevnek feloldst:
PS C:\Users\Administrator> [System.Net.Dns]::GetHostEntry("adds.iqjb.w08") HostName -------adds.iqjb.w08 Aliases ------{} AddressList ----------{192.168.1.2}

Ha ez helyes eredmnyt ad, akkor folytathatjuk az AD feldertst, ellenrzst az erd legfontosabb objektumaival. Erre a clra a System.DirectoryServices.ActiveDirectory.Forest osztly alkalmas, annak is a GetCurrentForest statikus metdusa:
PS C:\Users\Administrator> [System.DirectoryServices.ActiveDirectory.Forest] ::getcurrentforest()

317

Felhasznl-menedzsment, Active Directory

Name Sites Domains GlobalCatalogs ApplicationPartitions ForestMode RootDomain Schema SchemaRoleOwner NamingRoleOwner

: : : : : : : : : :

iqjb.w08 {Default-First-Site-Name} {iqjb.w08} {adds.iqjb.w08} {DC=ForestDnsZones,DC=iqjb,DC=w08, DC=DomainDnsZone s,DC=iqjb,DC=w08} Windows2008Forest iqjb.w08 CN=Schema,CN=Configuration,DC=iqjb,DC=w08 adds.iqjb.w08 adds.iqjb.w08

Lthatjuk, hogy ez a metdus a legfontosabb adatokat megadja az erdrl: a root tartomny s a tbbi tartomny nevt, a globlis katalgusok listjt, az erd mkdsi szintjt s az erdszint egyedi szerepeket hordoz tartomnyvezrlk neveit. Hasonl mdon megvizsglhatjuk az aktulis tartomny adatait is a System.DirectoryServices.ActiveDirectory.Domain osztly getcurrentdomain statikus metdusa segtsgvel:
PS C:\Users\Administrator> [System.DirectoryServices.ActiveDirectory.Domain] ::getcurrentdomain() Forest DomainControllers Children DomainMode Parent PdcRoleOwner RidRoleOwner InfrastructureRoleOwner Name : : : : : : : : : iqjb.w08 {adds.iqjb.w08} {} Windows2008Domain adds.iqjb.w08 adds.iqjb.w08 adds.iqjb.w08 iqjb.w08

Itt a legfontosabb plusz informci a tartomnyi szint egyedi szerepeket hordoz tartomnyvezrlk nevei. Nem mellkes, hogy milyen AD site (telephely) belltsokkal dolgozunk, hiszen ez befolysolja az gyfl gpek tartomnyvezrl vlasztst s a cmtr replikcit. A telephely informcik kiolvassra a System.DirectoryServices.ActiveDirectory.ActiveDirectorySite osztly GetComputerSite statikus metdusa hasznlhat:
PS C:\> [System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetC omputerSite() Name Domains Subnets Servers AdjacentSites : : : : : Default-First-Site-Name {iqjb.w08} {192.168.112.0/24} {w2k8.iqjb.w08} {}

318

Gyakorlat
SiteLinks InterSiteTopologyGenerator Options Location BridgeheadServers PreferredSmtpBridgeheadServers PreferredRpcBridgeheadServers IntraSiteReplicationSchedule : : : : : : : : {DEFAULTIPSITELINK} w2k8.iqjb.w08 None Budapest {} {} {} System.DirectoryServices.ActiveDirectory.A ctiveDirectorySchedule

Ezzel a nhny kifejezssel teht elg jl t lehet tekinteni, hogy milyen az AD infrastruktrnk, fjlba trtn tirnytssal akr az AD rendszernk dokumentlshoz is segtsget kapunk.

2.9.5 Csatlakozs az Active Directory-hoz


Az elzekben a .NET keretrendszer osztlyainak statikus metdusaival dolgoztam, melyek segtsgvel ltalnos informcikat lehetett kinyerni az Active Directory krnyezetrl. Ha konkrt, adott tartomnyra vagy cmtrelemre vonatkoz informcikhoz akarunk hozzjutni, akkor csatlakozni kell az adott cmtr objektumhoz. Az elzekben lertuk, hogy a cmtr kezelsben fontos szerepe van a gyorsttrnak, azaz egy ilyen csatlakoztats elkszti a memriban az adott cmtr objektum egy reprezentcijt. Ha ezek utn vltoztatunk az objektum valamely tulajdonsgn, akkor ez csak a memriban hajtdik vgre, kln metdussal kell ezt a vltozst a cmtrba visszarni, mint ahogy ezt ltni fogjuk. Elsknt azonban nzzk meg a legegyszerbb csatlakoztatst:
PS C:\> $domain = [ADSI] ""

Az [ADSI] tpusjellvel hivatkozunk a cmtras elrsre, s ha egy res sztiringet adunk meg a konstruktor paramtereknt, akkor az aktulis tartomnyi objektumhoz csatlakozunk. Ez a tpusjell a System.DirectoryServices.DirectoryEntry .NET osztly rvidtett neve. Ezt akr ki is rhatjuk, s ekkor tovbbi paramtereket is megadhatunk, ha szksges:
PS C:\> $domain = new-object DirectoryServices.DirectoryEntry("","iqjb\Admin istrator", "Password1")

Olvassuk ki, hogy mi kerlt a $domain vltoznkba:


PS C:\> $domain distinguishedName ----------------{DC=iqjb,DC=w08}

Ez mg nem tl sok, nzzk meg a tagjellemzit:

319

Felhasznl-menedzsment, Active Directory


PS C:\> $domain | Get-Member TypeName: System.DirectoryServices.DirectoryEntry Name ---auditingPolicy creationTime dc distinguishedName dSCorePropagationData forceLogoff fSMORoleOwner gPLink instanceType isCriticalSystemObject lockoutDuration lockOutObservationWindow ... uSNChanged uSNCreated wellKnownObjects whenChanged whenCreated MemberType ---------Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Property Definition ---------System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro... System.DirectoryServices.Pro...

Kicsit megvgtam, de ebbl is ltszik, hogy j nhny tulajdonsga van egy ilyen objektumnak. Nzzk, hogy hogyan tudunk egy nevestett objektumhoz, mondjuk egy felhasznli fikhoz csatlakozni:
PS C:\> $user = [ADSI] "LDAP://cn=Jnos Vegetri,ou=Dem,dc=iqjb,dc=w08" PS C:\> $user distinguishedName ----------------{CN=Jnos Vegetri,OU=Dem,DC=iqjb,DC=w08}

Fontos! Az [ADSI] utni sztringben csupa nagybets az LDAP, s norml perjelek vannak utna. Ha nem csupa nagybets az LDAP, vagy fordtott perjelet hasznlunk, akkor nem rgtn kapunk hibajelzst, hanem akkor, amikor elszr hasznljuk az objektumot. A ksbbiekben majd azt is megnzzk, hogy egy ilyen felhasznli fiknak milyen tulajdonsgai vannak s hogyan lehet azokat mdostani.

2.9.6 AD objektumok ltrehozsa


AD objektumokat ltrehozni a VBScriptben megszokott (mr aki programozott VBScriptben) ADSI szintaxishoz nagyon hasonl mdon lehet. Elszr egy AD kontnerre

320

Gyakorlat
kell csatlakozni, ahova ltre szeretnnk hozni az j objektumot. Ez a csatlakozs az elz fejezetben ltott mdon megy, ezzel ugye temeljk a PowerShellbe az adott kontnert, mint objektumot. Az gy temelt AD objektum Create metdusval lehet ltrehozni az j AD elemet. A Create paramtereknt meg kell adni a ltrehozand objektum tpust s az u.n. relative distinguished name nevt, azaz az adott kontneren belli megklnbztet nevt. Az albbi pldban magn a tartomnyvezrln (localhost), kzvetlenl a tartomny objektum al hozok ltre egy szervezeti egysget (organizational unit):
PS PS PS PS C:\> C:\> C:\> C:\> $kontner = [adsi] "LDAP://localhost:389/dc=iqjb,dc=w08" $adObj = $kontner.Create("OrganizationalUnit", "OU=Emberek") $adObj.Put("Description", "Norml felhasznlk") $adObj.SetInfo()

Ebben ugye az az jdonsg, hogy az LDAP kifejezsbe beillesztettem a tartomnyvezrl nevt s a portszmot, ahol a cmtrszolgltats elrhet. A szemlltets kedvrt mg a Description attribtumt is kitltttem. Vigyzat, amit idig tettem azt mind a memriban trold gyorsttrban vgeztem el, ahhoz, hogy mindez tnylegesen bekerljn a cmtr adatbzisba meg kell hvni a SetInfo metdust!

2.9.7 AD objektumok tulajdonsgainak kiolvassa, mdostsa


Ha PowerShell, akkor objektumok. Az elzekhez hasonlan csatlakozzunk a most ltrehozott szervezeti egysg objektumhoz, s nzzk meg a tagjellemzit a get-member cmdlet segtsgvel:
PS C:\> $adou = [ADSI] "LDAP://OU=Emberek,DC=iqjb,DC=w08" PS C:\> $adou distinguishedName ----------------{OU=Emberek,DC=iqjb,DC=w08} PS C:\> $adou | get-member TypeName: System.DirectoryServices.DirectoryEntry Name ---description distinguishedName dSCorePropagationData instanceType name MemberType ---------Property Property Property Property Property Definition ---------System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC...

321

Felhasznl-menedzsment, Active Directory


nTSecurityDescriptor objectCategory objectClass objectGUID ou uSNChanged uSNCreated whenChanged whenCreated Property Property Property Property Property Property Property Property Property System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC... System.DirectoryServices.PropertyValueC...

Ht elg furcsa, amit kaptunk. Ltjuk a szervezeti egysgnk tulajdonsgait, de hol vannak a metdusok? Hol a Create? Sajnos a PowerShell 1.0-ba mg nincsen 100%-ban adaptlva a System.DirectoryServices osztly. Ennek tbb oka van. Az egyik, hogy valjban itt nem szntiszta .NET osztlyrl van sz, hanem COM objektum is meghzdik a felszn alatt, s annak metdusait nem olyan egyszer temelni. Gondoljunk csak arra, hogy egy ilyen DirectoryEntry tpus objektum lehet felhasznli fik, szmtgp fik, telephely, csoport, stb., ezeknek mind ms s ms metdusuk van, ezeknek az adaptlsa a PowerShell krnyezetbe nem olyan egyszer. Ebbl szrmazik a msodik ok, ami miatt ez nincs adaptlva, az pedig az, hogy a fejlesztk az 1.0 megjelenst nem akartk ezzel ksleltetni, vrhatan a 2.0 verzi mr preczebb AD tmogatst fog nyjtani. Szerencsre van egy kis menekvsi svnynk, azaz kikapcsolhatjuk a PowerShell adaptcis rtegt, s megnzhetjk a szntiszta .NET objektumot is, ha a psbase nzeten keresztl nzzk az objektumunkat:
PS C:\> $adou.psbase | get-member TypeName: System.Management.Automation.PSMemberSet Name ---... MoveTo RefreshCache remove_Disposed Rename ... ToString AuthenticationType Children Container Guid Name NativeGuid NativeObject ObjectSecurity Options Parent Password Path MemberType Definition ---------- ---------Method Method Method Method Method Property Property Property Property Property Property Property Property Property Property Property Property System.Void System.Void System.Void System.Void MoveTo(DirectoryEntry n... RefreshCache(), System.... remove_Disposed(EventHa... Rename(String newName)

System.String ToString() System.DirectoryServices.Authentica... System.DirectoryServices.DirectoryE... System.ComponentModel.IContainer Co... System.Guid Guid {get;} System.String Name {get;} System.String NativeGuid {get;} System.Object NativeObject {get;} System.DirectoryServices.ActiveDire... System.DirectoryServices.DirectoryE... System.DirectoryServices.DirectoryE... System.String Password {set;} System.String Path {get;set;}

322

Gyakorlat
Properties SchemaClassName SchemaEntry Site UsePropertyCache Username Property Property Property Property Property Property System.DirectoryServices.PropertyCo... System.String SchemaClassName {get;} System.DirectoryServices.DirectoryE... System.ComponentModel.ISite Site {g... System.Boolean UsePropertyCache {ge... System.String Username {get;set;}

A fenti, kicsit megvgott, de mg gy is hossz listbl ltszik, hogy az objektumot valjban lehet pldul mozgatni, tnevezni, s nhny jabb tulajdonsg is feltrul a szemnk eltt. De pldul mg mindig nem ltjuk a SetInfo s a Create metdust, mert ezek az ADSI COM interfszbl jnnek, s a .NET nem krdezi ezeket le, gy nem is mutatja meg, viszont meghvni, hasznlni lehet ket. Vagy nzzk a kvetkezket:
PS C:\> $d = [ADSI] "" PS C:\> $d distinguishedName ----------------{DC=iqjb,DC=w08}

A fenti mdon pldul nagyon egyszeren lehet az aktulis tartomnyunkhoz csatlakozni. Prbljuk meg ennek megnzni a rejtett children tulajdonsgt:
PS C:\> $adou = [ADSI] "LDAP://OU=Dem,DC=iqjb,DC=w08" PS C:\> $adou.psbase.Children distinguishedName ----------------{CN=Csilla Fjdalom,OU=Dem,DC=iqjb,DC=w08} {CN=Csoport,OU=Dem,DC=iqjb,DC=w08} {CN=group1,OU=Dem,DC=iqjb,DC=w08} {CN=Jnos Vegetri,OU=Dem,DC=iqjb,DC=w08} {CN=Mrton Beld,OU=Dem,DC=iqjb,DC=w08}

Hiszen ez megadta az adott kontner objektumban tallhat al-objektumokat! Megjegyzs A loklis gp esetben a PSBase egszen extrm informcikat rejt el:
[40] PS C:\> $computer = [ADSI]"WinNT://." [41] PS C:\> $v = $computer.psbase.children | ForEach-Object {$_} [42] PS C:\> $v[0].name; $v[0].psbase.schemaclassname Administrator User [43] PS C:\> $v[30].name; $v[30].psbase.schemaclassname BITS Service

323

Felhasznl-menedzsment, Active Directory


A [40]-es sorban hozzkapcsoldom a helyi gphez egy $computer vltozn keresztl. Majd betltm egy $v vltozba ennek a psbase ltal feltrt children tulajdonsgnak elemeit egy ciklussal. Ennek 0. elemnek name tulajdonsgt nzve kiderl, hogy ez egy helyi felhasznl, az Administrator. Ennek tpust is ki lehet olvasni egy jabb psbase feltrs utn a schemaclassname tulajdonsggal. A meglepets akkor jn, ha egy jval ksbbi elemet nznk meg, mondjuk a 90.-et. Nlam ez meg egy szolgltats volt, a BITS (a kedves olvasnl lehet, hogy ez valami ms). Azaz a loklis gp esetben a children a gpnek nagyon sok jellemzjt megadja. Az eligazodst segti a Find metdus:
[47] PS C:\> $service = $computer.psbase.Children.Find("Alerter") [48] PS C:\> $service.serviceaccountname NT AUTHORITY\LocalService

Miutn itt vegyes elemekkel dolgozunk, itt klnsen jl jn a get-member cmdlet. Mindebbl az kvetkezik, hogy nem rdemes mg kidobni korbbi ADSI ismereteinket, illetve ismernnk kell az AD objektumok tulajdonsgainak neveit, hogy ezeket a tulajdonsgokat mdosthassuk. Nzznk ez utbbira pldt egy felhasznli fikkal kapcsolatban. Van egy mr ltez felhasznlm, annak szeretnm kiolvasni s belltani a telefonszm tulajdonsgt. Ehhez kell neknk az, hogy tudjuk, hogy az AD-ben a telefonszm tulajdonsgnak mi is a bels elnevezse. Ennek feldertsre tbb mdszer van, nzznk egy PowerShell-est:
PS C:\> $user = [ADSI] "LDAP://cn=Jnos Vegetri,OU=Dem,DC=iqjb,DC=w08" PS C:\> $user.psbase.properties PropertyName -----------objectClass cn sn telephoneNumber givenName distinguishedName ... Value ----{top, person, o... Jnos Vegetri Vegetri 2008 Jnos CN=Jnos Veget... Capacity -------4 4 4 4 4 4 Count ----4 1 1 1 1 1

A fenti listban ltjuk, hogy a telefonszm attribtum neve - meglep mdon telephoneNumber. Vagy a Windows Server 2008 esetben az Active Directory Users and Computers eszkz szerencsre mr tartalmaz egy Attribute Editor flet, a korbbi Windows vltozatoknl az ADSIEdit eszkzzel rhetjk el ugyanezt:

324

Gyakorlat

61. bra A Windows Server 2008 ADUC j Attribute Editor-a

Nzzk meg, hogyan lehet ezt a telefonszmot kiolvasni, majd trni. Az els megolds a PowerShell-es:
PS C:\> 1234 PS C:\> PS C:\> PS C:\> 2008 $user.telephoneNumber $user.telephoneNumber=2008 $user.setinfo() $user.telephoneNumber

Ebben az a furcsa, hogy a Get-Member-rel nem lehetett kiolvasni, hogy a $usernek van telephoneNumber tulajdonsga, mgis lehet hasznlni. A msodik megolds a hagyomnyos, ADSI-stlus:
PS C:\> 1234 PS C:\> PS C:\> PS C:\> 9876 $u.Get("telephoneNumber") $u.Put("telephoneNumber",9876) $u.SetInfo() $u.Get("telephoneNumber")

A Get metdussal tudjuk az adott tulajdonsgot kiolvasni, a Put-tal trni. Egyik esetben sem szabad megfeledkezni a SetInfo-rl, ami az objektum memriabeli reprezentcijt rja be tnylegesen az AD-ba. A Get s a Put is rejtett metdus, a paramterezsk a pldban lthat. Az SD attribtumok LDAP nevre kell hivatkozni mindkettnl.

325

Felhasznl-menedzsment, Active Directory

Megjegyzs Sajnos nem minden attribtum kezelhet a PowerShell-es mdszerrel. Ilyen pldul a Company attribtum:
PS C:\> $u.company PS C:\> $u.get("company") Cg

Az els esetben nem kaptam semmilyen vlaszt az attribtum kiolvassra, de get-tel mgis mkdtt. Mi van akkor, ha kiolvastuk egy felhasznl adatait egy vltozba, majd ezutn valaki egy msik gprl vagy egy msik alkalmazssal mdostja a felhasznlnk valamely attribtumt. Ilyenkor a getinfo metdussal lehet frissttetni az adatokat a memriban:
PS C:\> $u.get("company") Egyik PS C:\> $u.getinfo() PS C:\> $u.get("company") Msik

A fenti pldban az els kiolvass utn az ADUC eszkzzel az els get utn trtam a felhasznl Company attribtumt, s a getinfo-val ezt frisstettem a memriban, gy az j rtk mr a PowerShell-bl is ltszik.

2.9.7.1 Munka tbbrtk (multivalued) attribtumokkal


Az Active Directory egyik jellegzetes attribtuma az u.n. multivalued property. Ez olyan tulajdonsg, ahova az rtkek listjt, tmbjt tehetjk. Legtipikusabb ilyen attribtum az Exchange Server bevezetse utn a felhasznlk e-mail cmeit tartalmaz ProxyAddresses, vagy a csoportok Member attribtuma, de errl majd kln rtekezek. Marad mondjuk az other... kezdet klnbz telefonszmok trolsra szolgl attribtumok, mint pldul az otherMobile vagy az otherTelephone. Ezeket ki lehet olvasni az eddig megismert mdszerekkel is, de nzzk, hogy milyen problmkkal szembeslhetnk. Ha a get metdust hasznlom, s csak egy rtket trol a multivalued propery, akkor nem egy elem tmbt kapok, hanem sima skalris rtket:
PS C:\> $user.get("otherMobile") othermobil1234 PS C:\> $user.get("otherMobile").gettype() IsPublic IsSerial Name -------- -------- ---True True String BaseType -------System.Object

Ezzel szemben, ha tbb rtket trolunk, akkor mr tmbt kapunk:

326

Gyakorlat
PS C:\> $user.getinfo() PS C:\> $user.get("otherMobile") othermobil2345 othermobil1234 PS C:\> $user.get("otherMobile").gettype() IsPublic IsSerial Name -------- -------- ---True True Object[] BaseType -------System.Array

Ez nem biztos, hogy j neknk, mert gy a szkriptnket ktfajta esetre kell felksztennk: kln arra az esetre, ha csak egy rtket trolunk s kln arra az esetre is, ha tbbet. Ez bonyoltja a programjainkat. Ha konzisztensen, mindig tmbknt akarjuk kezelni az ilyen multivalued propertyket, akkor vagy hasznljuk a PowerShell-es stlust:
PS C:\> $user.otherMobile othermobil1234 PS C:\> $user.otherMobile[0] othermobil1234 PS C:\> $user.otherMobile.gettype() IsPublic IsSerial Name -------- -------- ---True False PropertyValueCollection BaseType -------System.Collec...

Vagy hasznljuk a GetEx metdust:


PS C:\> $user.getex("otherMobile") othermobil1234 PS C:\> $user.getex("otherMobile").gettype() IsPublic IsSerial Name -------- -------- ---True True Object[] BaseType -------System.Array

Az ilyen multivalued property-k rsa sem egyrtelm, hiszen tbb lehetsgem is van: a meglev rtkekhez akarok egy jabbat hozzfzni, a meglev rtkek helyett akarok egy jat betlteni.

Ezeket a lehetsgeket n magam is le tudom programozni a szkriptemben. Ha az els vltozatra van szksgem, akkor elbb kiolvasom az attribtum aktulis tartalmt egy vltozba, hozzrakom az j rtket s gy rakom vissza a put-tal, vagy egyszer rtkadssal. Ha pedig a msodik vltozatra van szksgem, akkor egyszeren fellrom az attribtumot az j rtkkel. Sokkal elegnsabb, ha ezt mr maga az objektum tudn egy okosabb metdussal. Ilyen ltezik, ez pedig a PutEx:

327

Felhasznl-menedzsment, Active Directory


PS C:\> $user.getex("otherMobile") othermobil1234 PS C:\> $user.putex(3,"otherMobile",@("othermobilPutEx2"));$user.setinfo() PS C:\> $user.getex("otherMobile") othermobilPutEx2 othermobil1234 PS C:\> $user.putex(2,"otherMobile",@("othermobilPutEx3"));$user.setinfo() PS C:\> $user.getex("otherMobile") othermobilPutEx3

A fenti pldban a kiindul llapotban egy mobilszmunk van. Ezutn hozzfzk egy jabbat a putex hasznlatval, a hozzfzst az els paramterknt szerepl 3-as jelzi. Fontos, hogy a hozzfzend rtket tmbknt kell kezelni, ezrt van ott a kukaczrjelpr! Ezutn egy jabb putex-et hvok meg, immr 2-es paramterrel, ez a fellrs mvelete, ennek hatsra mr csak ez a legjabb mobilszm lesz az attribtumban. Hasznlhatom mg az 1-es paramtert is, ez ekvivalens az attribtum rtkeinek trlsvel, vagy hasznlhatom a 4-es paramtert, ez a paramterknt megadott elemet trli az rtkek kzl:
PS C:\> $user.putex(3,"otherMobile",@("Append"));$user.setinfo() PS C:\> $user.getex("otherMobile") Append othermobilPutEx3 PS C:\> $user.putex(4,"otherMobile",@("Append"));$user.setinfo() PS C:\> $user.getex("otherMobile") othermobilPutEx3

A fenti pldban elsknt hozzfzk egy rtket, majd ugyanezt eltvoltom.

2.9.7.2 Specilis tulajdonsgok kezelse


Van nhny attribtum, amelyek az eddig megismert mdszerek egyikvel sem kezelhetk:
PS C:\> $user.AccountDisabled PS C:\> $user.get("AccountDisabled") Exception calling "get" with "1" argument(s): "The directory property canno t be found in the cache. " At line:1 char:10 + $user.get( <<<< "AccountDisabled")

A PowerShelles szintaxis meg se nyikkan, a get meg mg hibt is jelez. Ilyen esetekben hasznlhatjuk a psbase nzeten keresztl az InvokeGet s InvokeSet metdusokat:
PS C:\> $user.psbase.invokeget("AccountDisabled") False PS C:\> $user.psbase.invokeset("AccountDisabled","TRUE") PS C:\> $user.SetInfo()

328

Gyakorlat
PS C:\> $user.psbase.invokeget("AccountDisabled") True

2.9.8 Jelsz megvltoztatsa


Specilis attribtum a jelsz, hiszen tudjuk, hogy valjban nem (felttlenl) trolja a cmtr a jelszavakat, hanem csak a bellk kpzett hasht. gy a jelsz kezelsekor nem egyszeren egy attribtumot kell belltani, hanem ezt a hasht kell kpezni. Szerencsre erre a clra rendelkezsnkre ll kt metdus, a SetPassword, illetve a ChangePassword:
PS C:\> $user.SetPassword("UjPass2") PS C:\> $user.ChangePassword("UjPass2","MgjabbPass3")

A SetPassword felel meg a Reset Password mveletnek. Ezt ugye csak megfelel rendszergazda jogosultsgok birtokban tudjuk megtenni. A ChangePassword a meglev jelsz birtokban mdostja a jelszt, ehhez mr nem kell kln rendszergazda jogosultsg.

2.9.9 Csoportok kezelse


Az Active Directory-ban csoportokat leginkbb a rendszer zemeltetsnek megknynytsre vesznk fel. Segtsgkkel osztunk ki hozzfrsi jogokat, felhasznli jogokat, de mg a csoportos hzirendek rvnyre jutst is szablyozhatjuk csoportokkal. Miutn ilyen szleskr a felhasznlsuk, gy fontos lehet a csoportok kezelsnek automatizlsa. Erre is kivlan alkalmas a PowerShell, nzzk meg a leggyakoribb mveleteket. Csoportot ltrehozni a mr ltott mdszerrel lehet:
PS C:\> $target = [ADSI] "LDAP://ou=Dem,DC=iqjb,DC=w08" PS C:\> $group = $target.create("group","CN=Csoport") PS C:\> $group.setinfo()

Ez alaphelyzetben globlis biztonsgi csoportot hoz ltre. A ksbbi, sszetett pldban majd bemutatom, hogy hogyan lehet msfajta csoportokat ltrehozni. Ezutn ktflekppen lehet tagokat adni a csoportokhoz. Az els mdszer a hagyomnyos ADSI-s mdszer, ahol a csoport Add metdust hvom meg, paramtereknt a berakni kvnt felhasznl LDAP-os szintaxis elrsi tjt kell megadni. Vagy, ha mr megragadtam a felhasznli fikot, akkor vissza kell alaktani az LDAP-os elrsi tt, mint ahogy ebben a pldban tettem:
PS C:\> $user = [ADSI] "LDAP://CN=Jnos Vegetri,OU=Dem,DC=iqjb,DC=w08" PS C:\> $group.add("LDAP://$($user.distinguishedname)") PS C:\> $group.setinfo()

329

Felhasznl-menedzsment, Active Directory


Hasonlan lehet tagot eltvoltani, csak az Add helyett a Remove metdust kell meghvni. A msodik mdszer kicsit PowerShell-szerbb, itt nem kell ide-oda alaktgatni, elg a felhasznl distinguishedname tulajdonsgt hasznlni:
PS C:\> $user = [ADSI] "LDAP://CN=Csilla Fjdalom,OU=Dem,DC=iqjb,DC=w08" PS C:\> $group.member += $user.distinguishedname PS C:\> $group.setinfo()

Termszetesen a kt megolds egyenrtk, csak stlusbeli klnbsg van kzttk. A msodik mdszer htrnya taln, hogy egyszeren nem lehet csoporttagot eltvoltani, kln kpezni kellene a nemkvnatos tag nlkli tmbt, s azt betlteni a csoport member tulajdonsgba.

2.9.10 Keress az AD-ben


A kvetkez gyakori feladat a keress az AD-ben. Az els mdszer a Find metdus hasznlata, ami szintn a PSBase nzetben rhet el:
PS C:\> $ou = [ADSI] "LDAP://ou=Dem,dc=iqjb,dc=w08" PS C:\> $ou.psbase.children.find("cn=Csilla Fjdalom") distinguishedName ----------------{CN=Csilla Fjdalom,OU=Dem,DC=iqjb,DC=w08}

Ez a keress azonban csak az adott kontnerobjektum gyerekei kztt keres, gy nem biztos, hogy igazn j segtsg ez neknk Az igazn profi kereshz a .NET keretrendszer egyik osztlyt, a System.DirectoryServices.DirectorySearcher-t hvjuk segtsgl, ennek egy objektuma lesz a keresnk, s ennek klnbz tulajdonsgait belltva adjuk meg a keressnk mindenfle felttelt. Elsknt nzznk egy nagyon egyszer feladatot, egy konkrt felhasznli fikra keressnk r:
[6] PS I:\>$objRoot = [ADSI] "LDAP://OU=IQJB,DC=dom" [7] PS I:\>$objSearcher = New-Object System.DirectoryServices.DirectorySearc her [8] PS I:\>$objSearcher.SearchRoot = $objRoot [9] PS I:\>$objSearcher.Filter = "(&(objectCategory=user)(displayName=Sos Tibor))" [10] PS I:\>$objSearcher.SearchScope = "Subtree" [11] PS I:\>$colResults = $objSearcher.FindAll() [12] PS I:\>$colresults Path Properties ------------LDAP://CN=Sos Tibor,OU=Normal,OU=... {homemdb, distinguishedname, count...

330

Gyakorlat
Elsknt definilom, hogy az AD adatbzis-elemek fastruktrjban, hol is keresek majd ($objRoot). Majd elksztem a kerest ($objSearcher), aminek SearchRoot tulajdonsgaknt az elbb ltrehozott keressi helyet adom meg. Majd definilom az LDAP formtum szrt, amely ebben az esetben a Sos Tibor nev felhasznlkat jelenti, s ezt betltm a keres Filter tulajdonsgaknt. LDAP szrben a kvetkez sszehasonlt opertorokat hasznlhatok: Opertor = ~= <= >= & | ! Jelents Egyenl Kzel egyenl Kisebb egyenl Nagyobb egyenl s Vagy Nem

Vgl meghatrozom a keress mlysgt, ami itt Subtree, azaz mlysgi, mert nem pont kzvetlenl a kiindulpontknt megadott helyen van a keresett objektum. Nincs ms htra, ezek alapjn ki kell listzni a feltteleknek megfelel objektumokat a FindAll metdussal. A $colResult vltozban trolt eredmny nem kzvetlenl DirectoryEntry tpus elemek tmbje! Hanem tulajdonkppen egy hashtbla-szersg, ahol a Path oszlop tartalmazza a megtallt objektum LDAP formtum elrsi tjt, a Properties meg a kiolvashat tulajdonsgait. Azaz ahhoz, hogy kiolvassuk pldul az n nevemet s beosztsomat egy kicsit trkkzni kell:
[25] PS I:\>"$($colResults[0].properties.displayname) az n nevem, beoszt som $($colResults[0].properties.title)" Sos Tibor az n nevem, beosztsom mszaki igazgat

Megjegyzs A PowerShell tnykedsem sorn ez a msodik eset, amikor kis-nagybet rzkenysget tapasztaltam! (Az els az LDAP:: kifejezsnl volt, de ez flig-meddig betudhat az ADSI rksgnek.) A msodik ez: ha $colResults[0].properties.displayName-et rok (nagy N az utols tagban), akkor nem kapok semmit. Ez azrt is furcsa, mert eredetileg a cmtrban nagy az N. A kvetkez pldban kikeresem a smbl az sszes olyan tulajdonsg smaelemet, amely a globlis katalgusba replikldik:
$strFilter = "(&(objectCategory=attributeSchema)(isMemberOfPartialAttributeSet=TRUE))"

331

Felhasznl-menedzsment, Active Directory

$objRoot = [ADSI] "LDAP://CN=Schema,CN=Configuration,DC=iqjb,DC=w08" $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objRoot $objSearcher.PageSize = 1000 $objSearcher.Filter = $strFilter $objSearcher.SearchScope = "Subtree" $colProplist = "name" foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)} $colResults = $objSearcher.FindAll() foreach ($objResult in $colResults) { $objItem = $objResult.Properties "$($objItem.item('name'))" } $objSearcher.Dispose() $colResults.Dispose()

Itt annyival gazdagtottam a keresm tulajdonsgait, hogy meghatroztam a maximlis tallatok szmt (PageSize) s a tallati listba betlttt elemek tulajdonsgainak listjt (PropertiesToLoad), ami itt most csak az elem neve. A szkriptemben az els foreach ciklust tulajdonkppen feleslegesen hasznltam, hiszen csak egy tulajdonsgot (name) tltttem a keres PropertiesToLoad kpessgbe, de n ezt a szkriptet sokszor olyankor is fel akarom hasznlni kevs vltoztatssal, amikor tbb tulajdonsgot is meg akarok kapni a keress eredmnyben. A kiratsnl most a hashtbls stlussal hivatkoztam a name tulajdonsgra, s a folyamat vgn, memriatakarkossgi okokbl, eldobom a keres s a tallati lista objektumokat. A kvetkez plda fggvnyvel felhasznli fikok tetszleges attribtumt lehet tmegesen lecserlni valami msra. A kd megfejtst az elzek ismeretben az olvasra bzom. Csak egy kis segtsget adok: a kzprszen tallhat If vizsglat Else gban azt rem el, hogy ha a kicserlend attribtum rtk res, azaz azt szeretnnk, hogy a ki nem tlttt attribtumokat tltsk ki, akkor ez az LDAP filterben a !$Attr=* kifejezst kell szerepeltetni, ennek az a jelentse, hogy az $Attr vltoz ltal jelzett attribtum nem egyenl akrmi, azaz van rtke.
function ModifyUserAttrib { param ( $domain = [System.DirectoryServices.ActiveDirectory.Domain]::getcurrentdomain( ).Name, $Attr = $(throw "Melyik attribtumot?"), $sValue = $null, $cValue = $(throw "Mire vltoztassam?") )

332

Gyakorlat

$root= [ADSI] "LDAP://$domain" $Searcher = New-Object DirectoryServices.DirectorySearcher $Searcher.SearchRoot = $root if($sValue) { $buildFilter = "(&(objectClass=user)($Attr=$sValue))" } else { $buildFilter = "(&(objectClass=user)(!$Attr=*))" } $Searcher.Filter = $buildFilter $users = $searcher.findall() Foreach ($i in $users) { $dn=$i.path $user = [ADSI] $dn write-host $dn $user.Put($Attr,$cValue) $user.SetInfo() } }

2.9.10.1 Keress id tpus adatokra


A cmtrban nem csak szveges adatok vannak, hanem pldul dtum tpusak is. Ezekre nem trivilis a keress. Pldul keresem az utbbi 2 napban mdostott AD felhasznli objektumokat:
PS C:\> $tl=get-date ((get-date).AddDays(-2)) -Format yyyyMMddHHMMss.0Z PS C:\> $tl 20080530110514.0Z PS C:\> $searcher = New-Object directoryservices.directorysearcher PS C:\> $searcher.searchroot = [ADSI] "" PS C:\> $searcher.filter = "(&(objectCategory=person)(objectClass=User)(when Changed>=$tl))" PS C:\> $result = $searcher.findall() PS C:\> $result Path Properties ------------LDAP://CN=Jnos Vegetri,OU=Dem,D... {samaccounttype, lastlogon, dscore...

Az egszben a lnyeg a $tl vltoz generlsa. Ltjuk, hogy egy specilis formtumra kell hozni a dtumot: HHNNPPMM.0Z. Ilyen formzst szerencsre a get-date format paramtervel knnyen elvgezhetnk. Sajnos nem mindig ilyen egyszer a helyzetnk, hiszen nhny dtumot jelz attribtum nem ilyen formtumban trolja az idt, hanem u.n. tick-ekben, ketyegsekben. Ez 1600. janur 1. 0:00 idponttl eltelt 100 nanoszekundumokat jelenti, mindez longinteger formtumban. Ilyen attribtum pldul a lastLogon, lastLogonTimestamp,

333

Felhasznl-menedzsment, Active Directory


lastLogoff, pwdLastSet. Ha ilyen attribtumok valamely rtkre akarunk rkeresni, akkor el kell tudnunk lltani ezt az rtket. Szerencsre a .NET keretrendszer ebben is segt. Elsknt nzzk, hogy dtumbl hogyan tudunk ilyen long-integer-t ellltani:
[5] PS C:\> $most = get-date [6] PS C:\> $most 2008. jnius 1. 20:49:41 [7] PS C:\> $most.ticks 633479501812656250

Ltjuk, hogy elg a ticks tulajdonsgt meghvni a dtumnak. Nzzk visszafele, azaz long-integer-bl hogyan kapunk dtumot? Ez sem nagyon bonyolult:
[8] PS C:\> $MyLongDate = 633479501812656250 [9] PS C:\> $mydate = New-Object datetime $MyLongDate [10] PS C:\> $mydate 2008. jnius 1. 20:49:41

Egyszeren kell krelni egy dtum tpus objektumot, az objektum konstruktornak kell tadni ezt a szmot s ebbl a .NET ltrehozza a dtumot.

2.9.10.2 Keress bitekre


A msik nem trivilis eset, hogy bizonyos attribtumokban trolt szm egyes bitjei jelentenek valamit. Pldul a felhasznli fik userAccountControl attribtumnak klnbz bitjei a kvetkezket jelentik: Jellemz ACCOUNT DISABLED PASSWORD NOT REQUIRED PASSWORD NEVER EXPIRES SMARTCARD REQUIRED ACCOUNT TRUSTED FOR DELEGATION ACCOUNT CANNOT BE DELEGATED userAccountControl bit 2 32 65536 262144 524288 1048576 2^x 1 5 16 18 19 20

Itt a feladat az, hogy olyan vizsglatot vgezznk a szrben, amellyel csak egy adott bit rtkre keresnk r. Szerencsre van erre a clra kt u.n. vezrl (control) az AD-ben, ami ezt a clt szolglja: 1.2.840.113556.1.4.803 bit szint AND szably 1.2.840.113556.1.4.804 bit szint OR szably Hogyan kell ezeket hasznlni? Nzzk pldul a hatstalantott felhasznli fikokat:
(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.11355 6.1.4.803:=2))

334

Gyakorlat
Ebben a pldban az utols felttel azt jelenti, hogy a userAccountControl 2-es bitje helyn 1 van. Azaz sszeselem 2-vel az attribtum rtkt, a tbbi bit nem rdekel engem, gy az adott felttel akkor rtkeldik ki igazz, ha ott 1-es szerepel. Nzznk egy olyan pldt, hogy keresem a Global s Domain Local biztonsgi csoportokat:
(&(groupType:1.2.840.113556.1.4.804:=6)(groupType:1.2.840.113556.1.4.803:=21 47483648))

Itt az els felttelelem akkor rtkeldik igazz, ha vagy a 2-es, vagy a 4-es bit helyn szerepel 1-es, ez a kt bit jelzi a Globlis s Domain Local csoporttpust. A msodik felttel az mr egy AND szably, az azt vizsglja, hogy a csoport biztonsgi tpus.

2.9.11 Objektumok trlse


Az objektumok trlsnek menete nagyon hasonlatos a ltrehozsukhoz. Egy felhasznl trlse pldul gy nz ki, ha mr megragadtuk a felhasznli fikot a $user vltozba:
PS C:\> $user.psbase.parent.delete("user","cn=$($user.cn)")

A $user.psbase.parent megadja a szl kontnert, ezen bell most a Create helyett a Delete metdust kell meghvni. Miutn mr van $user, ezrt legegyszerbb, ha rgtn ebbl olvassuk ki a relative distinguished nevt. Ha nincs megragadva a felhasznl, akkor r is kereshetnk, s utna trlhetjk:
PS PS PS PS PS PS PS C:\> C:\> C:\> C:\> C:\> C:\> C:\> $t = "tt" $searcher = New-Object directoryservices.directorysearcher $searcher.searchroot = [ADSI] "" $searcher.filter = "(&(objectclass=user)(sAMAccountName=$t))" $tuser = $searcher.findone() $user=$tuser.getdirectoryentry() $user.psbase.parent.delete("user","cn=$($user.cn)")

Itt most a pre-Windows 2000 nv, azaz a samaccountname (tt) alapjn kerestem r a felhasznlra. Megint oda kell figyelni, hogy a keress eredmnye mg nem kzvetlenl DirectoryEntry tpus objektum, ezrt kell az utols eltti sorban a tallatbl igazi felhasznli fikot konvertlni. A trls maga mr a megismert mdon megy.

2.9.12 AD objektumok hozzfrsi listjnak kezelse


Miutn jelenleg az AD adatbzisa PSDrive-knt nem elrhet a PowerShell 1.0-ban, gy kicsit krlmnyesebb a hozzfrsi lista kezelse. Radsul az ADSI objektumoknl lttuk, hogy a PowerShell adaptcis rtege sok tulajdonsgot s metdust elrejt, pldul

335

Felhasznl-menedzsment, Active Directory


pp a hozzfrsi listval kapcsolatos adatokat, gy itt is szksgnk van a PSBase nzet hasznlatra. Elsknt nzzk, hogy egy konkrt AD objektum, jelen esetben egy felhasznl hozzfrsi listjt hogyan lehet kiolvasni:
[PS] C:\>$u= [ADSI] "LDAP://cn=Jnos Vegetri,OU=Dem,DC=adatum,DC=com" [PS] C:\>$acl = $u.psbase.objectsecurity [PS] C:\>$acl.GetAccessRules($true,$true,[System.Security.Principal.Security Identifier]) ActiveDirectoryRights InheritanceType ObjectType InheritedObjectType ObjectFlags AccessControlType IdentityReference IsInherited InheritanceFlags PropagationFlags ... : : : : : : : : : : GenericRead None 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000 None Allow S-1-5-10 False None None

A $acl vltoz tartalmazn a hozzfrsi listt, de valjban ezt nem tudjuk kzvetlenl kiolvasni egy propertybl, hanem egy metdust kell meghvni (GetAccessRules), hogy emberi fogyasztsra alkalmas informcikhoz jussunk. Ezen metdusnak paramtereket kell tadni a kvetkezk szerint:
PS C:\> $acl.GetAccessRules.Value MemberType : Method OverloadDefinitions : {System.Security.AccessControl.AuthorizationRuleColle ction GetAccessRules(Boolean includeExplicit, Boolean includeInherited, Type targetType)} TypeNameOfValue : System.Management.Automation.PSMethod Value : System.Security.AccessControl.AuthorizationRuleCollec tion GetAccessRules(Boolean includeExplicit, Boolean includeInherited, Type targetType) Name : GetAccessRules IsInstance : True

Az els bool paramterrel lehet szablyozni, hogy kvncsi vagyok-e az explicit hozzfrsi bejegyzsekre, a msodik bool paramter szablyozza, hogy kvncsi vagyok-e az rklt hozzfrsi bejegyzsekre. A harmadik paramter a zrsebb, azzal lehet szablyozni, hogy a metdus kimenete milyen formtum legyen. n a fenti pldban SID-ekre krtem, hogy fordtsa le a bejegyzseket. Ez nem biztos, hogy jl rtelmezhet, gy hasznlhatunk egy msik paramterezsi formt is, amellyel a felhasznli fikok neveit kapjuk vissza a hozzfrsi bejegyzsekben:

336

Gyakorlat
[PS] C:\>$acl.GetAccessRules($true,$true,[System.Security.Principal.NTAccoun t]) ActiveDirectoryRights InheritanceType ObjectType InheritedObjectType ObjectFlags AccessControlType IdentityReference IsInherited InheritanceFlags PropagationFlags ... : : : : : : : : : : GenericRead None 00000000-0000-0000-0000-000000000000 00000000-0000-0000-0000-000000000000 None Allow NT AUTHORITY\SELF False None None

A tulajdonosra is szksgnk lehet, ahhoz a GetOwner metdussal juthatunk hozz, szintn hasznlhatnnk akr a SID-es formtumot is, de taln itt is gyakoribb az olvasmnyosabb nevek hasznlata:
[PS] C:\>$acl.GetOwner([System.Security.Principal.NTAccount]) Value ----ADATUM\Judy

Azrt lljon itt emlkeztetl a SID-es formtum listzsa is:


[PS] C:\>$acl.GetOwner([System.Security.Principal.SecurityIdentifier]) BinaryLength AccountDomainSid Value ------------ -------------------28 S-1-5-21-150787130-28... S-1-5-21-150787130-28...

A hozzfrsi listk mdostshoz szintn szmos metdust tudunk segtsgl hvni:


ModifyAccessRule ModifyAuditRule PurgeAccessRules PurgeAuditRules RemoveAccess RemoveAccessRule RemoveAccessRuleSpecific RemoveAudit RemoveAuditRule RemoveAuditRuleSpecific ResetAccessRule SetAccessRule SetAccessRuleProtection SetAuditRule SetAuditRuleProtection SetGroup SetOwner Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method System.Boolean ModifyAcce... System.Boolean ModifyAudi... System.Void PurgeAccessRu... System.Void PurgeAuditRul... System.Void RemoveAccess(... System.Boolean RemoveAcce... System.Void RemoveAccessR... System.Void RemoveAudit(I... System.Boolean RemoveAudi... System.Void RemoveAuditRu... System.Void ResetAccessRu... System.Void SetAccessRule... System.Void SetAccessRule... System.Void SetAuditRule(... System.Void SetAuditRuleP... System.Void SetGroup(Iden... System.Void SetOwner(Iden...

337

Felhasznl-menedzsment, Active Directory


A knyv keretein tlmutat, hogy mindegyiket kln bemutassam, de ezen informcik alapjn azt hiszem, el lehet indulni.

2.9.13 sszetett feladat ADSI mveletekkel


Vgezetl nzznk egy sszetettebb feladatot a Windows Server 2008 tartomnyi krnyezetben felmerl problmra. Egy j lehetsg itt az u.n. Fine grained password policy, azaz a tartomnyi szintnl alacsonyabb szinten bellthat jelsz hzirendek ltrehozsnak lehetsge. Ezzel csak egy problma van: nem szervezeti egysgekre, hanem biztonsgi csoportokra tudjuk ezeket kiosztani. Ha konzisztensek szeretnnk maradni a hzirendek tekintetben, akkor rdemes rnykcsoportokat ltrehozni, azaz olyan csoportokat, amelyek egy adott szervezeti egysg sszes felhasznljt tartalmazzk. Erre ksztettem ezt a fggvnyt, amely automatikusan ltrehozza shadow nveltaggal s az OU nevvel mint uttaggal a csoportot az adott OU-ban, ha mg nincs ilyen. Belerakja az sszes olyan felhasznlt ebbe a csoportba, akik mg nem tagjai. Paramterknt egy OU distinguished name adatt kell megadni. Ha egy felhasznlt kitrlnk az adott OUbl, akkor azt az AD automatikusan kiszedi a shadowgroup-bl, viszont ha csak tmozgatjuk a felhasznlt egy msik trolba, akkor annak a csoport tagjaibl val eltvoltsrl neknk kell gondoskodni. Ezt hajtja vgre a szkript vge. Rendszeresen futtatva szinkronban tarthatjuk az rnykcsoportok tagsgt az OU felhasznli objektumaival.
function update-shadowgroup ([string] $ou = "OU=Dem 2,DC=iqjb,DC=w08") { $adou = [ADSI] "LDAP://$ou" $query = new-object system.directoryservices.directorysearcher $query.SearchScope = "OneLevel" $query.SearchRoot = $adou $query.filter = "(&(objectCategory=group)(name=shadow$($adou.name)))" $sg = $query.FindOne() if(-not $sg) { $ADS_GROUP_TYPE_GLOBAL_GROUP = 0x00000002 $ADS_GROUP_TYPE_DOMAIN_LOCAL_GROUP = 0x00000004 $ADS_GROUP_TYPE_LOCAL_GROUP = 0x00000004 $ADS_GROUP_TYPE_UNIVERSAL_GROUP = 0x00000008 $ADS_GROUP_TYPE_SECURITY_ENABLED = 0x80000000 $groupType = $ADS_GROUP_TYPE_SECURITY_ENABLED -bor $ADS_GROUP_TYPE_GLOBAL_GROUP $sg = $adou.Create("Group", "CN=shadow-$($adou.name)") Write-Host "Creating group: shadow-$($adou.name)..." $sg.Put("groupType", $groupType) $sg.SetInfo() } else {

338

Gyakorlat
$sg = [ADSI] $sg.Path } $query.SearchScope = "OneLevel" $query.SearchRoot = $adou $query.filter = "(objectCategory=user)" $users = $query.FindAll() foreach($user in $users) { if($user.properties.memberof -notcontains $sg.distinguishedname) { $sg.member += $user.properties.distinguishedname write-host "Inserting $($user.properties.name)..." } } $sg.setinfo() $members = $sg.member foreach($member in $members) { if(-not $member.Contains(",OU=$($adou.name),")) { write-host "Removing $member..." $sg.Remove("LDAP://$member") $sg.setinfo() } } }

339

.NET Framework hasznos osztlyai

2.10 .NET Framework hasznos osztlyai


Az eddigiekben is lthattunk mr j nhny olyan problmt, amelyben a .NET keretrendszer osztlyai nyjtottak segtsget, mert a PowerShell sajt cmdletjei, tpusai nem voltak elegendek. Ebben a fejezetben nhny tovbbi nagy tuds .NET osztlybl szemezgetek, ezzel kvnok mindenkit arra bztatni, hogy nyugodtan bngszgessen a .NET osztlyok kztt a Reflector program vagy az MSDN weboldal segtsgvel, htha olyanra bukkan, amely ksz megoldst nyjt valamely sszetettebb feladatra.

2.10.1 Levlklds
Szkriptekben gyakori feladat a levlklds, hiszen egy temezett szkript eredmnyrl legknyelmesebben e-mailben kaphatunk visszajelzst. A PowerShell nem rendelkezik e-mailkldsre kpes cmdlettel, de szerencsre a .NET keretrendszer igen. Erre a clra a System.Net.Mail nvtr klnbz osztlyait hasznlhatjuk fel. Elsknt a levelet kell sszeraknunk egy MailMessage tpus segtsgvel. Az albbi szkript ezt a feladatot vgzi el:
$mail = New-Object System.Net.Mail.MailMessage $mail.From = New-Object System.Net.Mail.MailAddress("soost@iqjb.hu") $mail.To.Add("soostibor@citromail.hu") $mail.Subject = "Haliho" $mail.Body = "Ez itt a levl."

A $mail vltoz tartalmaz egy levlobjektumot, melynek feladja soost@iqjb.hu, cmzettje soostibor@citromail.hu, trgya Haliho, szvege Ez itt a levl. Ezutn mr csak el kell kldeni ezt. Ehhez egy erre alkalmas SMTP kiszolglt kell tallni. Ezt az SMTP kiszolglt megszltani kpes SmtpClient .NET tpus segtsgvel el is tudjuk kldeni a levelet:
$smtp = New-Object System.Net.Mail.SmtpClient -argumentList "mail.iqjb.corp" $smtp.Credentials = New-Object System.Net.NetworkCredential ` -argumentList "soost@iqjb.hu","password" $smtp.Send($mail)

Ez a tpus rendelkezik minden olyan funkcival, ami az SMTP kiszolglkkal val kommunikciban szksges lehet. Pldul kezeli a hitelestsi informcikat s termszetesen tadja a levlobjektumot kzbestsre.

2.10.2 Bngszs
A kvetkez gyakori feladat a weben tallhat informcik letltse. Erre a clra a .NET keretrendszerben a System.Net.WebClient osztly ll rendelkezsre. Itt nem egy emberi fogyasztsra sznt webbngszt kell elkpzelni, hanem egy olyan alapszol-

340

Gyakorlat
gltatst, ami csatlakozik egy adott URL segtsgvel a webkiszolglhoz s kiolvassa az adott weboldalt:
[2] PS C:\> $client = New-Object System.Net.WebClient [3] PS C:\> $client.DownloadString("http://www.geocaching.hu") <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859 -2"> <title>geocaching.hu</title> <meta name="description" content="A magyar geocaching kzpontja, geo ldk koodinti, lersok, fnykpek, letlts, frum."> <meta name="keywords" content="kincskeress, geocaching, geochaching , geoc ashing, geokesing, gps, kincs, kincsvadszat, keress, lda, geolda, koord inta, koordintk, letlts, kincseslda, cache"> <link rel="stylesheet" href="style.css" type="text/css"> ...

A [3]-as sorban a DownloadString metdussal indtom a bngszst. Az eredmny mivel nem rendelkeztem rla a konzolra kerlt ki. Lthat, hogy a teljes HTML tartalmat megkaptam. Termszetesen szkriptjeimben ezt nem a kpernyre fogom kifolyatni, hanem egy vltozba tltk be s valamilyen elemzs, talakts (pldul a HTML cmkktl val megszabadts) utn adom csak vissza az engem tnylegesen rdekl informcikat. A DonwloadString metdus olvashat karaktereket vr azon a weboldalon, amelyre rirnytjuk. Ha azonban egy binris llomnyt, pldul egy ZIP fjlt akarunk letlteni, akkor ez nem lesz neknk j. Ilyen letltsekre egy msik metdust, a DownloadFile-t hasznlhatjuk:
[5] [6] [7] [8] [9] PS PS PS PS PS I:\>$client = New-Object System.Net.WebClient I:\>$url= "http://www.xs4all.nl/~hneel/software/bytecount.zip" I:\>$filename = "c:\bytecount.zip" I:\>$client.DownloadFile($url, $filename) I:\>Get-ChildItem c:\b*

Directory: Microsoft.PowerShell.Core\FileSystem::C:\ Mode ----a--LastWriteTime ------------2008. 04. 22. 9:53 Length Name ------ ---419660 bytecount.zip

A fenti pldban lthat, hogy ennek a metdusnak az URL-en kvl egy fjl elrsi tja is paramtere, ahova majd letlti a binris llomnyt.

341

.NET Framework hasznos osztlyai

2.10.3 Felhasznli informcik


A felhasznli informcikat is egyszeren sszegyjthetjk WindowsIdentity osztly GetCurrent metdusval: az albbi

[1] PS I:\>[System.Security.Principal.WindowsIdentity]::GetCurrent() AuthenticationType ImpersonationLevel IsAuthenticated IsGuest IsSystem IsAnonymous Name Owner User Groups Token : : : : : : : : : : : Kerberos None True False False False IQJB\soostibor S-1-5-21-861567501-1202660629-1801674531-6051 S-1-5-21-861567501-1202660629-1801674531-6051 {S-1-5-21-861567501-1202660629-1801674531, , , ...} 904

A kimenetben lthatak a legfontosabb adatok: a felhasznli nv, a csoporttagsgra utal SID-ek, az autentikci mdja, stb. Miutn SID-ekkel nem annyira knny dolgozni, ezrt egy msik osztllyal, a WindowsPrincipal-lal tovbbi szolgltatsokhoz jutunk. Nagyon egyszeren le lehet krdezni pldul, hogy vajon az ppen aktulis felhasznl rendszergazda jogosultsgokkal br-e, azaz tagja-e az Administrators csoportnak:
[6] PS C:\> $u = [System.Security.Principal.WindowsIdentity]::GetCurrent() [7] PS C:\> $principal = New-Object Security.principal.windowsprincipal($u) [8] PS C:\> $principal.IsInRole("Administrators") True

Ezekkel nagyon hatkonyan lehet megvizsglni az ppen aktulis felhasznl klnbz jellemzit akr tartomnyi, akr helyi gpes krnyezetben.

2.10.4 DNS adatok lekrdezse


A DNS adatokrl volt mr sz a 2.9.4 Active Directory informcik lekrdezse fejezetben, de ott az Active Directory szempontjait vettem eltrbe. Ha egy ltalnos DNS nvfeloldst szeretnnk vgrehajtani, arra a System.Net.DNS osztly hasznlhat, annak is a GetHostByName metdusa:
PS C:\Users\Administrator> [System.Net.Dns]::GetHostByName("www.microsoft.co m") HostName -------lb1.www.ms.akadns.net Aliases AddressList ----------------{www.microsoft.com, t... {207.46.192.254, 207....

342

Gyakorlat

PS C:\Users\Administrator> [System.Net.Dns]::GetHostByName("www.microsoft.co m").aliases www.microsoft.com toggle.www.ms.akadns.net g.www.ms.akadns.net PS C:\Users\Administrator> [System.Net.Dns]::GetHostByName("www.microsoft.co m").addresslist IPAddressToString Address AddressFamily ScopeId IsIPv6Multicast IsIPv6LinkLocal IsIPv6SiteLocal IPAddressToString Address AddressFamily ScopeId IsIPv6Multicast IsIPv6LinkLocal IsIPv6SiteLocal IPAddressToString Address AddressFamily ScopeId IsIPv6Multicast IsIPv6LinkLocal IsIPv6SiteLocal IPAddressToString Address AddressFamily ScopeId IsIPv6Multicast IsIPv6LinkLocal IsIPv6SiteLocal : : : : : : : : : : : : : : : : : : : : : : : : : : : : 207.46.192.254 4274007759 InterNetwork False False False 207.46.193.254 4274073295 InterNetwork False False False 207.46.19.254 4262670031 InterNetwork False False False 207.46.19.190 3188928207 InterNetwork False False False

Lthat, hogy ez egyszer IP cm lekrdezsen kvl szmos egyb informcihoz hozzjuthatunk.

343

SQL adatelrs

2.11 SQL adatelrs


Az adatbzisok adatai is elrhetk a PowerShell segtsgvel, itt is .NET osztlyokat hvhatunk segtsgl. Nzznk egy nagyon egyszer adatbzist, annak is egy tbljt: Szemlyek ID Nv 1 Sos Tibor 2 Vegetri Jnos 3 Fjdalom Csilla e-mail soostibor@citromail.hu vj@sehol.hu fcs@valahol.hu Telefon 123-45678 654-6543 161-6161

Ezt n most ppen Microsoft Accessben hoztam ltre, de lehetne ez az adatbzis akr SQL Serveren, vagy brmilyen olyan adatbzis-kezelben, amelynek van ODBC csatolja. Az albbi sorokkal egy SQL kifejezssel adatokat tudunk temelni PowerShell vltozba:
[1] PS C:\> $connectionString = "Provider=microsoft.jet.oledb.4.0; " + >> "Data Source=C:\scripts\emberek.mdb; " >> [2] PS C:\> $sqlCommand = "select * from szemlyek" [3] PS C:\> $connection = New-Object System.Data.OleDb.OleDbConnection $conn ectionString [4] PS C:\> $command = New-Object System.Data.OleDb.OleDbCommand $sqlCommand ,$connection [5] PS C:\> $connection.Open() [6] PS C:\> $adapter = New-Object System.Data.OleDb.OleDbDataAdapter $comman d [7] PS C:\> $dataset = New-Object System.Data.DataSet [8] PS C:\> [void] $adapter.Fill($dataSet) [9] PS C:\> $connection.Close() [10] PS C:\> $records = $dataSet.Tables | Select-Object -Expand Rows [11] PS C:\> $records ID -1 2 3 Nv --Sos Tibor Vegetri Jnos Fjdalom Csilla e-mail -----soostibor@citro... vj@sehol.hu fcs@valahol.hu Telefon ------123-45678 654-6543 161-6161

Az [1]-es sorban sszelltok egy u.n. connection string-et, ami most ppen Access adatbzishoz val csatlakozst rejt, de kis mdostssal brmilyen ODBC adatforrshoz testre szabhat. A *2+-es sorban sszerakom az SQL kifejezst, amelynek eredmnyt szeretnm PowerShellbl kezelni. A *3+-astl a *6+-os sorig felptem a kapcsolatot az adatforrshoz, s vgrehajtom az SQL kifejezst, majd a *7]-es sorban tltm be a $dataset vltozba az adatforrsbl kapott adatokat. Ezutn mr a [9]-es sorban bonthatom is a kapcsolatot az adatbzissal. A $dataset mg elg sszetett tpus, kzvetlen adatkinyersre nehzkesen hasznlhat, gy a *10]-es sorban sorokra bontom ezt az ob-

344

Gyakorlat
jektumot a Select-Object cmdlet segtsgvel. Lthat, hogy a $records mr a fejezet elejn lthat tblzathoz nagyon hasonl formtumot adott vissza. Vajon honnan tudtam a [10]-es sorban, hogy van a $dataset.Tables tagjellemznek (jobban mondva nem is annak, hanem a Tables tmb egyes elemeinek) Rows tulajdonsga, amit a Select-Object-tel ki tudok fejteni? Ezt nem nagyon lehet tudni magbl a PowerShell segtsgvel, mert - mint ahogy az ADSI objektumoknl is lttuk itt is COM objektumok hzdnak meg a httrben. Nzzk, mit ltunk:
[14] PS C:\> $dataset.tables[0] | Get-Member -MemberType properties TypeName: System.Data.DataRow Name ---e-mail ID Nv Telefon MemberType ---------Property Property Property Property Definition ---------System.String e-mail {get;set;} System.Int32 ID {get;set;} System.String Nv {get;set;} System.String Telefon {get;set;}

A Tables tmbben csak egy elem van, gy nztem annak tulajdonsg tpus tagjellemzit, de ott nem szerepel Rows. Ezzel szemben mgis van:
[15] PS C:\> $dataset.tables[0].rows ID -1 2 3 Nv --Sos Tibor Vegetri Jnos Fjdalom Csilla e-mail -----soostibor@citro... vj@sehol.hu fcs@valahol.hu Telefon ------123-45678 654-6543 161-6161

Ezek utn hogyan tudjuk ezeket az adatokat kezelni? A $records tmb egyes elemei maguk az adatrekordok. Pldul a msodik sorra gy lehet hivatkozni:
[16] PS C:\> $records[1] ID Nv -- --2 Vegetri Jnos e-mail -----vj@sehol.hu Telefon ------654-6543

Ezen adatrekord egyik mezjre mr pedig a szoksos tulajdonsg-hivatkozssal:


[17] PS C:\> $records[1].Nv Vegetri Jnos

Termszetesen SQL adatokat mdostani is lehet, ehhez a fenti pldt gy kell megvltoztatni, hogy az SQL utastsban valamilyen adatmanipulcis parancsot kell kiadni.

345

SQL adatelrs

Megjegyzs A 64-bites Windows XP-n a fenti SQL-es PowerShell kifejezsek hibt adnak a norml PowerShell ablakban futtatva. Ennek oka az, hogy a szksges ODBC driver 64-bites vltozata nincsen benne az opercis rendszerben, csak a 32-bites vltozat, amit csak 32 bites alkalmazsbl szlthatunk meg. Ha ilyen hibt tapasztalunk, akkor futtassuk a fenti kdot 32-bites PowerShell ablakban, ami szintn elrhet a 64-bites gpen is, az mr mkdni fog minden baj nlkl.

346

Gyakorlat

2.12 COM objektumok kezelse


A Component Object Model (COM) a Microsoft ltal 1993-ban kifejlesztett interfsz szabvny szoftverkomponensek kzti kommunikcira. Segtsgvel minden ilyen programnyelven, amely tmogatja ezt a szabvnyt, lehet kszteni olyan szoftverkomponenseket, amelyek kpesek egymssal kommuniklni s dinamikusan egyms objektumait ltrehozni, kezelni. St! Akr szkriptnyelvekbl (VBScript, PowerShell) is meg lehet szltani ezeket a komponenseket, mint ahogy az albbiakban lthat lesz. A COM-ba szmos ms altechnolgia tartozik: OLE, OLE Automation, ActiveX, COM+ s DCOM.

2.12.1 A Windows shell kezelse


Maga a Windows grafikus keretprogramja, shellje is COM objektum, azaz megszlthat, a publikus metdusai s tulajdonsgai meghvhatk, lekrdezhetek. Ehhez elszr meg kell hvni az shellt, ezt a PowerShellben nagyon egyszeren, a new-object com commandlettel tehetjk meg:
[2] PS C:\> $sh = new-object -com Shell.Application

Miutn ezt az objektumot mg tbbszr akarom hasznlni, ezrt egy $sh vltozba tettem. Nzzk meg ennek tagjellemzit:
[3] PS C:\> $sh | gm TypeName: System.__ComObject#{efd84b2d-4bcf-4298-be25-eb542a59fbda} Name ---AddToRecent BrowseForFolder CanStartStopService CascadeWindows ControlPanelItem EjectPC Explore ExplorerPolicy FileRun FindComputer FindFiles FindPrinter GetSetting GetSystemInformation Help IsRestricted IsServiceRunning MinimizeAll NameSpace MemberType ---------Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Definition ---------void AddToRecent (Variant, string) Folder BrowseForFolder (int, string, int... Variant CanStartStopService (string) void CascadeWindows () void ControlPanelItem (string) void EjectPC () void Explore (Variant) Variant ExplorerPolicy (string) void FileRun () void FindComputer () void FindFiles () void FindPrinter (string, string, string) bool GetSetting (int) Variant GetSystemInformation (string) void Help () int IsRestricted (string, string) Variant IsServiceRunning (string) void MinimizeAll () Folder NameSpace (Variant)

347

COM objektumok kezelse


Open RefreshMenu ServiceStart ServiceStop SetTime ShellExecute ShowBrowserBar ShutdownWindows Suspend TileHorizontally TileVertically ToggleDesktop TrayProperties UndoMinimizeALL Windows WindowsSecurity Application Parent Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Method Property Property void Open (Variant) void RefreshMenu () Variant ServiceStart (string, Variant) Variant ServiceStop (string, Variant) void SetTime () void ShellExecute (string, Variant, Vari... Variant ShowBrowserBar (string, Variant) void ShutdownWindows () void Suspend () void TileHorizontally () void TileVertically () void ToggleDesktop () void TrayProperties () void UndoMinimizeALL () IDispatch Windows () void WindowsSecurity () IDispatch Application () {get} IDispatch Parent () {get}

Ezzel lthatv vltak a Shell.Application tagjellemzi, azaz a Windows szkriptbl is knnyen elrhet szolgltatsai, mint pldul a sg megnyitsa vagy akr egy mappa megnyitsa a Windows Intzben:
[4] PS C:\> $sh.help() [5] PS C:\> $sh.explore("C:\scripts")

Termszetesen az gy megnyitott Sgval vagy az Intzvel olyan sok mindent nem tudunk PowerShellel tovbbiakban kezdeni, ez inkbb csak a COM objektumok kezelsnek a legegyszerbb s ltvnyos demonstrcija akart lenni. Sokkal praktikusabb lett volna pldul a ShutdownWindows metdus meghvsa, de ezt a tisztelt olvasra bzom .

2.12.2 WScript osztly hasznlata


Az elzekben lttuk, hogy a Windows Shellt hogyan lehet szkriptbl megszltani. Van egy msik COM objektum, a WScript, amelynek Shell alosztlya is hasonl clokat, de mg mlyebb szinten valst meg. Pldul szeretnnk egy olyan alkalmazssal kommuniklni, amely nem COM alkalmazs, pldul a Notepaddal. Jobb hjn billentyzetletseket tudunk neki kldeni a WScript.Shell osztly SendKeys metdusval:
[1] PS [2] PS 0 [3] PS True [4] PS True C:\> $sh = new-object -com wscript.shell C:\> $sh.Run("notepad") C:\> $sh.AppActivate("notepad") C:\> $sh.AppActivate("notepad"); $sh.SendKeys("kakukk!")

348

Gyakorlat
Az [1]-es sorban elindtom a notepad-et a Run metdussal. Aztn eltrbe helyezem az ablakt, hogy kapja a billentyletseket, majd kikldm a billentyzettseket. Az albbi kpernyfotn ltszik, hogy a kiadott karakterek tnyleg berdtak a notepad szerkesztfelletre.

62. bra Nem COM alkalmazs vezrlse WScrip.Shell objektummal

Nzzk ennek az objektumnak a tagjellemzit:


[5] PS C:\> $sh | gm TypeName: System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090} Name ---AppActivate CreateShortcut Exec ExpandEnvironmentStrings LogEvent Popup RegDelete RegRead RegWrite Run SendKeys Environment CurrentDirectory SpecialFolders MemberType ---------Method Method Method Method Method Method Method Method Method Method Method ParameterizedProperty Property Property Definition ---------bool AppActivate (Variant... IDispatch CreateShortcut ... IWshExec Exec (string) string ExpandEnvironmentS... bool LogEvent (Variant, s... int Popup (string, Varian... void RegDelete (string) Variant RegRead (string) void RegWrite (string, Va... int Run (string, Variant,... void SendKeys (string, Va... IWshEnvironment Environme... string CurrentDirectory (... IWshCollection SpecialFol...

Lthat, hogy a billentyletsek mellet tbbek kztt registry-szerkeszt, shortcutltrehoz s dialgusablak-kirak metdusai is vannak. A WScriptnek nem csak Shell alosztlya van, hanem Network is. Ezzel szmtalan hasznos hlzattal kapcsolatos mveletet tudunk vgrehajtani:
[11] PS I:\>$ws | gm TypeName: System.__ComObject#{24be5a31-edfe-11d2-b933-00104b365c9f} Name MemberType Definition

349

COM objektumok kezelse


---AddPrinterConnection AddWindowsPrinterConnection EnumNetworkDrives EnumPrinterConnections MapNetworkDrive RemoveNetworkDrive RemovePrinterConnection SetDefaultPrinter ComputerName Organization Site UserDomain UserName UserProfile ---------Method Method Method Method Method Method Method Method Property Property Property Property Property Property ---------void AddPrinterConnection (string... void AddWindowsPrinterConnection ... IWshCollection EnumNetworkDrives () IWshCollection EnumPrinterConnect... void MapNetworkDrive (string, str... void RemoveNetworkDrive (string, ... void RemovePrinterConnection (str... void SetDefaultPrinter (string) string ComputerName () {get} string Organization () {get} string Site () {get} string UserDomain () {get} string UserName () {get} string UserProfile () {get}

Nzznk pldul egy hlzati meghajtk felsorolst:


[12] PS C:\> $ws = New-Object -com WScript.Network [13] PS C:\> $ws.EnumNetworkDrives() I: \\K-FILE1\soostibor$

2.12.3 Alkalmazsok kezelse


A COM ltal nyjtott interfsz lehetv teszi, hogy nem csak a Windows klnbz funkciit tudjuk elrni, hanem a legtbb alkalmazs is elrhetv tesz olyan objektumokat, amelyek hasznos szolgltatsait felhasznlhatjuk szkriptjeinkben. A legegyszerbb erre vonatkoz plda az Internet Explorer megszltsa, amelyben nem csinlok semmit, csak lthat mdon elindtom az alkalmazst:
[17] PS C:\> $ie = New-Object -ComObject InternetExplorer.Application [18] PS C:\> $ie.visible=$true

Nzznk egy kicsit bonyolultabb pldt, olvastassunk be egy Word dokumentumot, de csak az emberi fogyasztsra sznt rtelmes szveget! Ez nem olyan egyszer feladat, hiszen ha egyszer fjlmvelettel prblkoznnk, akkor a Word dokumentum mindenfle formz informcijt is beolvassuk, s abbl elg nehz kinyerni a tnyleges szveget. Szerencsre a Word is rendelkezik COM fellettel, gy az albbi nhny soros szkripttel knnyen felolvastathatjuk az igazi szveget a dokumentumbl:
[25] [26] [27] [28] PS PS PS PS I:\>$wordApp = New-Object -COM Word.Application I:\>$file = (Get-Item C:\_docs\tematikk.docx).FullName I:\>$doc = $wordApp.Documents.Open($file) I:\>$text = $doc.Content.Text

350

Gyakorlat
[29] PS I:\>$text Microsoft PowerShell for Administrators Who Should AttendAnyone Who Scrip ts For Windows - this course will help you build scripting skills in PowerS hell when you are coming from a background in scripting on Windows operatin ... [30] PS I:\>$wordApp.Quit()

A szkript elejn megszltom a Word.Application COM objektumot s betltm a $wordApp vltozba, majd a megnyitand dokumentum elrsi tjt berakom egy vltozba, majd a $wordApp segtsgvel megnyitom ezt a fjlt. Mivel nem rendelkeztem arrl, hogy a Word lthat legyen, mindez csak a httrben trtnik. A fjl megnyitsval egy j objektumhoz jutok, maghoz a dokumentumhoz, majd ennek veszem a nyers szveges rszt a $doc.Content.Text kifejezs segtsgvel, amit a *29+-es sorban ki is rattam a konzolra. Ilyen jelleg alkalmazsok kezelsekor illik azokat a vgn bezrni, hogy ne foglalja feleslegesen a memrit. Ezt a *30+-as sorban tettem meg. Termszetesen az elz kt plda csak zelt prblt lenni a COM objektumok kezelsbl, nem kvntam egy komplett COM szakknyvet rni, hiszen ennek mr szles a szakirodalma. A lnyeg az, hogy brmilyen COM objektum nagyon egyszeren megszlthat PowerShellbl, gy egy meglev, pldul VBScriptben rt plda nagyon egyszeren temelhet PowerShellbe.

351

Quest ActiveRoles Management Shell for Active Directory

3. Bvtmnyek
A PowerShell br jelenleg az 1.0-s verzinl tart, s ezzel egytt jr az, hogy van nhny hinyossga, de mgis knny ezeket orvosolni, hiszen nagyon jl bvthet. Akr a korbban ltott, programozst nem ignyl mdon, mint pldul az 1.5.10 Objektumok testre szabsa, kiegsztse fejezetben ltott types.ps1xml segtsgvel, akr komolyabb programozst ignyl mdon. Ez utbbi rszleteibe ebben a knyvben nem megynk bele, egyrszt mert n nem vagyok fejleszt, ezrt nem is rtek hozz, msrszt ez a knyv kifejezetten rendszergazdknak rdott. Szerencsre j nhny funkci megvalstsra klnbz szoftvercgek s felhasznli kzssgek elksztettk ezeket a programozst ignyl bvtmnyeket, a snap-in-eket. Ezek kzl itt pldaknt bemutatok nhnyat, amelyek vagy ingyenesen hozzfrhetk, vagy valamely Microsoft kiszolgl szoftver (Exchange Server 2007) rszeknt elrhetk.

3.1 Quest ActiveRoles Management Shell for Active Directory


A 2.9 Felhasznl-menedzsment, Active Directory fejezetben lttuk, hogy a cmtr kezelse mg nem 100%-os az alap PowerShellben. Jrszt COM objektumok hzdnak meg a felszn alatt, s ezek adaptlsa nem trtnt mg meg tkletesen, nem igazn powershell-szer a kezelsk. Ennek orvoslsra ksztett a Quest Software egy bvt14 mnyt, ami ingyenesen letlthet a weboldalukrl . Nzzk, milyen j cmdleteket knl ez a bvtmny a telepts s a PSSnap-in hozzadsa utn:
PS C:\Users\Administrator> Add-PSSnapin Quest.ActiveRoles.ADManagement PS C:\Users\Administrator> Get-Command -PSSnapin Quest.ActiveRoles.ADManagem ent CommandType ----------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Name ---Add-QADGroupMember Add-QADPasswordSettingsObj... Add-QADPermission Connect-QADService Convert-QADAttributeValue Deprovision-QADUser Disable-QADUser Disconnect-QADService Enable-QADUser Get-QADComputer Get-QADGroup Definition ---------Add-QADGroupMember [-Ident... Add-QADPasswordSettingsObj... Add-QADPermission [-Identi... Connect-QADService [-Proxy... Convert-QADAttributeValue ... Deprovision-QADUser [-Iden... Disable-QADUser [[-Identit... Disconnect-QADService [-Pr... Enable-QADUser [[-Identity... Get-QADComputer [[-Identit... Get-QADGroup [[-Identity] ...

14

http://www.quest.com/powershell/activeroles-server.aspx

352

Bvtmnyek
Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Get-QADGroupMember Get-QADObject Get-QADObjectSecurity Get-QADPasswordSettingsObject Get-QADPermission Get-QADPSSnapinSettings Get-QADRootDSE Get-QADUser Get-QARSAccessTemplate Get-QARSAccessTemplateLink Move-QADObject New-QADGroup New-QADObject New-QADPasswordSettingsObject New-QADUser New-QARSAccessTemplateLink Remove-QADGroupMember Remove-QADObject Remove-QADPasswordSettings... Remove-QADPermission Remove-QARSAccessTemplateLink Rename-QADObject Set-QADGroup Set-QADObject Set-QADObjectSecurity Set-QADPSSnapinSettings Set-QADUser Set-QARSAccessTemplateLink Unlock-QADUser Get-QADGroupMember [-Ident... Get-QADObject [[-Identity]... Get-QADObjectSecurity [-Id... Get-QADPasswordSettingsObj... Get-QADPermission [-Identi... Get-QADPSSnapinSettings [-... Get-QADRootDSE [-Proxy] [-... Get-QADUser [[-Identity] <... Get-QARSAccessTemplate [[-... Get-QARSAccessTemplateLink... Move-QADObject [-Identity]... New-QADGroup [-Name] <Stri... New-QADObject [-Name] <Str... New-QADPasswordSettingsObj... New-QADUser [-Name] <Strin... New-QARSAccessTemplateLink... Remove-QADGroupMember [-Id... Remove-QADObject [-Identit... Remove-QADPasswordSettings... Remove-QADPermission [-Inp... Remove-QARSAccessTemplateL... Rename-QADObject [-Identit... Set-QADGroup [-Identity] <... Set-QADObject [[-Identity]... Set-QADObjectSecurity [-Id... Set-QADPSSnapinSettings [-... Set-QADUser [-Identity] <I... Set-QARSAccessTemplateLink... Unlock-QADUser [[-Identity...

A cmdletek fnvi rszben a QAD utal a Quest Active Directory kifejezsre, ezzel kvnta a gyrt megklnbztetni a cmdletjeit a nagy valsznsggel hasonl neveken majd egyszer a Microsofttl rkez Active Directoryval kapcsolatos cmdletektl. Nzznk pldul egy j felhasznl ltrehozst:
PS C:\Users\Administrator> New-QADUser -Name "QAD User" -ParentContainer dem -UserPassword "P@ssw0rd" Name ---QAD User Type ---user DN -CN=QAD User,OU=Dem,DC=iq...

Nagyon tmr kifejezs. Felhvom a figyelmet a ParentContainer paramterre, ahol nem kellett teljes distinguished name adatot megadni, hanem csak elg volt a szervezeti egysg neve. Br a help flrevezet, distinguished name-rl beszl:
... PARAMETERS -ParentContainer <IdentityParameter> Specify the distinguished name (DN) of the container in which you w ant this cmdlet to create a new user account. ...

353

Quest ActiveRoles Management Shell for Active Directory


De itt valjban brmilyen nevt megadhatjuk a szl kontnernek, ami egyedileg azonostja azt a helyet, ahova ltre szeretnnk hozni a felhasznlt. Az n teszt krnyezetemben csak egy Dem OU-van, gy elg volt ennyit rni. Nzzk, hogyan tudjuk ezt az j felhasznlt egy csoportba rakni:
PS C:\Users\Administrator> Add-QADGroupMember "Csoport" -Member "QAD User" Name ---QAD User Type ---user DN -CN=QAD User,OU=Dem,DC=iq...

Ez sem tl bonyolult. Az AD objektumokon val jogosultsgkezels mr nem ilyen egyszer, de az ADSI lehetsgekhez kpest azrt nagysgrendekkel knyelmesebb a munka. Nzznk pldul jogosultsgolvasst a Dem OU-n:
PS C:\Users\Administrator> Get-QADPermission "Dem" -Inherited -SchemaDefaul t Permissions for: iqjb.w08/Dem WARNING: 2 columns do not fit into the display and were removed. Ctrl ---Deny Account ------Everyone NT AUTHORITY\ENTERPRISE DOMAIN CONTRO... NT AUTHORITY\Authenticated Users NT AUTHORITY\SYSTEM iqjb.w08\Domain Admins iqjb.w08\Account Operators iqjb.w08\Account Operators iqjb.w08\Account Operators iqjb.w08\Account Operators iqjb.w08\Print Operators iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... NT AUTHORITY\ENTERPRISE DOMAIN CONTRO... NT AUTHORITY\ENTERPRISE DOMAIN CONTRO... NT AUTHORITY\ENTERPRISE DOMAIN CONTRO... iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Pre-Windows 2000 Compatible ... NT AUTHORITY\SELF iqjb.w08\Enterprise Admins iqjb.w08\Pre-Windows 2000 Compatible ... iqjb.w08\Administrators Rights -----Special Special Special Full control Full control Create/Delete user Create/Delete group Create/Delete computer Create/Delete inetOrgPerson Create/Delete printQueue Read Account Restrictions Read Account Restrictions Read Logon Information Read Logon Information Read Group Membership Read Group Membership Read General Information Read General Information Read Remote Access Infor... Read Remote Access Infor... Read tokenGroups Read tokenGroups Read tokenGroups Special Special Special Special Full control List Contents Special

354

Bvtmnyek
Mieltt nagyon belemerlnnk, rdemes megnzni, hogy milyen alapbelltsokkal mkdik ez a snap-in, hiszen ezek szablyozzk pldul egy keress maximlis tallatainak szmt:
PS C:\Users\Administrator> get-help Get-QADPSSnapinSettings NAME Get-QADPSSnapinSettings SYNOPSIS View default settings that apply to all cmdlets of this PowerShell snap -in. SYNTAX Get-QADPSSnapinSettings [-DefaultExcludedProperties] [-DefaultPropertie sExcludedFromNonBaseSearch] [-Integer8AttributesThatContainDateTimes] [ -Integer8AttributesThatContainNegativeTimeSpans] [-DefaultPageSize] [-D efaultSizeLimit] [-DefaultSearchScope] [-DefaultWildcardMode] [-Default OutputPropertiesForUserObject] [-DefaultOutputPropertiesForGroupObject] [-DefaultOutputPropertiesForComputerObject] [-DefaultOutputPropertiesF orAdObject] [-DefaultOutputPropertiesForPasswordSettingsObject] [<Commo nParameters>]

Nzznk pr ilyen paramtert:


PS C:\Users\Administrator> Get-QADPSSnapinSettings -DefaultSizeLimit 1000 PS C:\Users\Administrator> Get-QADPSSnapinSettings -DefaultSearchScope Subtree

Termszetesen ezeket tllthatjuk a set-QADPSSnapinSettings cmdlettel. Mg egy fontos cmdletet nzznk meg! Ehhez elszr figyeljk meg, hogy milyen formban kapjuk meg az adatokat ezen cmdletek futtatsa utn! Pldul mit ad egy felhasznl LastLogon attribtuma:
PS C:\Users\Administrator> Get-QADUser "Administrator" | ForEach-Object {$_. LastLogon} Value ----2008.09.02. 11:57:23 DisplayName ----------2008. szeptember 2.

Szemre egsz szp datetime formtumot kaptam, de ezt ellenrizzk azrt le:
PS C:\Users\Administrator> (Get-QADUser "Administrator" | ForEach-Object {$_ .LastLogon}).gettype() IsPublic IsSerial Name -------- -------- ---True False DisplayNameWrapper`1 BaseType -------System.ValueType

355

Quest ActiveRoles Management Shell for Active Directory


Ht ez mgsem az! Hiszen az AD nem .NET objektumokat trol, ezrt szksges lehet ezeket az attribtumokat .NET-es tpuss alaktani. Nzzk ezt meg a fenti pldt folytatva! Hmozzuk ki ebbl a csomagolsbl az AD objektumot, nzzk az eredeti cmtrbejegyzst! Itt valami olyasmit csinlok, mint a PowerShell psbase nzete:
PS C:\Users\Administrator> Get-QADUser "Administrator" | ForEach-Object {$_. DirectoryEntry} distinguishedName ----------------{CN=Administrator,CN=Users,DC=iqjb,DC=w08} PS C:\Users\Administrator> Get-QADUser "Administrator" | ForEach-Object {$_. DirectoryEntry.LastLogon}

Na, de hol a LastLogon attribtum rtke? Az utols parancsnl nem nyomdahiba miatt nincs eredmny, hanem nincs a kifejezsnek semmi visszatrsi rtke. Ennek lthatv ttelre van a Convert-QADAttributeValue cmdlet:
PS C:\Users\Administrator> Get-QADUser "Administrator" | ForEach-Object {$_. DirectoryEntry.LastLogon} | Convert-QADAttributeValue -OutputTypeName DateTi me 2008. szeptember 2. 11:57:23

Ez mr igazi DateTime rtket ad. sszefoglalsul elmondhatjuk, hogy nagyon knyelmess teszik az Active Directoryval kapcsolatos munknkat ezek a cmdletek. A snap-in-hez rszletes dokumentcit is kapunk, gy ezek alapjn mindenki maga is feldertheti a Quest cmdleteit.

356

Bvtmnyek

3.2 PCX PowerShell Community Extensions


Lelkes PowerShell fejlesztk futtatnak egy projektet, amelyben gyes kis bvtmnyeket ksztenek a PowerShellhez. Az gy ltrehozott termk teleptje letlthet a projekt 15 weboldalrl . Telepts utn szmos vltozson esik keresztl a PowerShell krnyezetnk, ezeknek j rsze az albbi sok j cmdlet, de kapunk j fggvnyeket, promptokat s providereket is.
[4] PS I:\>get-command -PSSnapin pscx CommandType ----------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet
15

Name ---ConvertFrom-Base64 ConvertTo-Base64 ConvertTo-MacOs9LineEnding ConvertTo-UnixLineEnding ConvertTo-WindowsLineEnding Convert-Xml Disconnect-TerminalSession Export-Bitmap Format-Byte Format-Hex Format-Xml Get-ADObject Get-Clipboard Get-DhcpServer Get-DomainController Get-ExportedType Get-FileVersionInfo Get-ForegroundWindow Get-Hash Get-MountPoint Get-PEHeader Get-Privilege Get-PSSnapinHelp Get-Random Get-ReparsePoint Get-ShortPath Get-TabExpansion Get-TerminalSession Import-Bitmap Join-String New-Hardlink New-Junction New-Shortcut New-Symlink Out-Clipboard Ping-Host Remove-MountPoint Remove-ReparsePoint Resize-Bitmap Resolve-Assembly

Definition ---------ConvertFrom-Base64 [-Base6... ConvertTo-Base64 [-Path] <... ConvertTo-MacOs9LineEnding... ConvertTo-UnixLineEnding [... ConvertTo-WindowsLineEndin... Convert-Xml [-Path] <Strin... Disconnect-TerminalSession... Export-Bitmap [-Bitmap] <B... Format-Byte [-Value] <Int6... Format-Hex [-Path] <String... Format-Xml [-Path] <String... Get-ADObject [-Domain <Str... Get-Clipboard [-Text] [-Ve... Get-DhcpServer [-Server <S... Get-DomainController [-Ser... Get-ExportedType [-Assembl... Get-FileVersionInfo [-Path... Get-ForegroundWindow [-Ver... Get-Hash [-Path] <String[]... Get-MountPoint [[-Volume] ... Get-PEHeader [-Path] <Stri... Get-Privilege [[-Identity]... Get-PSSnapinHelp [-Path] <... Get-Random [-Verbose] [-De... Get-ReparsePoint [-Path] <... Get-ShortPath [-Path] <Str... Get-TabExpansion [-Line] <... Get-TerminalSession [[-Com... Import-Bitmap [-Path] <Str... Join-String [-Strings] <St... New-Hardlink [-Path] <Stri... New-Junction [-Path] <Stri... New-Shortcut [-Path] <Stri... New-Symlink [-Path] <Strin... Out-Clipboard [-InputObjec... Ping-Host [-HostName] <PSO... Remove-MountPoint [[-Name]... Remove-ReparsePoint [-Path... Resize-Bitmap [-Bitmap] <B... Resolve-Assembly [-Name] <...

http://www.codeplex.com/PowerShellCX

357

PCX PowerShell Community Extensions


Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Resolve-Host Select-Xml Send-SmtpMail Set-Clipboard Set-FileTime Set-ForegroundWindow Set-Privilege Set-VolumeLabel Split-String Start-Process Start-TabExpansion Stop-TerminalSession Test-Assembly Test-Xml Write-BZip2 Write-Clipboard Write-GZip Write-Tar Write-Zip Resolve-Host [-HostName] <... Select-Xml [-Path] <String... Send-SmtpMail [-InputObjec... Set-Clipboard [-Text <Stri... Set-FileTime [-Path] <Stri... Set-ForegroundWindow [[-Ha... Set-Privilege [-Privileges... Set-VolumeLabel [[-Path] <... Split-String [[-Separator]... Start-Process [[-Path] <St... Start-TabExpansion [-Verbo... Stop-TerminalSession [[-Co... Test-Assembly [-Path] <Str... Test-Xml [-Path] <String[]... Write-BZip2 [-Path] <Strin... Write-Clipboard [-Object] ... Write-GZip [-Path] <String... Write-Tar [-Path] <String[... Write-Zip [-Path] <String[...

Prat kiemelnk a fontosabbak kzl: cmdlet Get-ADObject Get-Privilege, Set-Privilege Out-Clipboard Resolve-Host Start-Process Split-String Test-XML funkci Active Directory objektumok kiolvassa Felhasznli jogok kilistzsa, belltsa Kimenet tirnytsa a vglapra Nvfelolds DNS alapjn Folyamat elindtsa Sztring feldarabolsa akr regex kifejezs alapjn XML llomny szintaktikus ellenrzse

Tbb olyan cmdletet is felfedezhetnk, amelyek funkcijt itt a knyvben korbban mr .NET osztlyok kzvetlen hasznlatval mr kivltottuk, de mennyivel elegnsabb igazi cmdletet hasznlni. Az igazn nagy durrans a PCX j providerei:
[6] PS I:\>Get-PSProvider Name ---Alias Environment FileSystem Function Registry Variable Certificate FeedStore AssemblyCache DirectoryServices Capabilities -----------ShouldProcess ShouldProcess Filter, ShouldProcess ShouldProcess ShouldProcess ShouldProcess ShouldProcess ShouldProcess ShouldProcess ShouldProcess, Credentials Drives -----{Alias} {Env} {C, A, D, E...} {Function} {HKLM, HKCU} {Variable} {cert} {Feed} {Gac} {IQJB}

358

Bvtmnyek
Lthatjuk, hogy van egy FeedStore nevezet j provider, amely tpll egy feed nevezet PSDrive-ot, amellyel RSS forrsokhoz tudunk csatlakozni:
[12] PS I:\>get-childitem feed: Type ---folder feed feed Name ---Microsoft Feeds Microsoft Technet PowerShell Pro! ItemCount UnreadItemCount --------- --------------100 100 92 92 21 10

Vagy szrevehetjk, hogy maga az Active Directory adatbzis is lthat PSDriveknt! Navigljunk egy keveset ebben a meghajtban a fjlkezel cmdletekkel:
5# cd adatum: Adatum.com\ 6# dir LastWriteTime ------------2007.01.01. 19:47 2007.01.01. 19:47 2007.01.03. 19:05 2007.01.01. 19:47 2007.01.03. 19:04 2007.01.01. 19:47 2007.01.01. 19:47 2007.01.03. 19:04 2007.01.03. 19:04 2007.01.01. 19:47 2007.01.03. 19:04 2007.01.03. 17:54 2008.03.24. 0:02 2007.01.01. 19:47 2007.01.01. 19:47 2007.01.03. 19:05 2007.01.03. 19:04 2007.01.01. 19:47 2007.01.01. 19:47 7# cd finance Adatum.com\finance 8# dir LastWriteTime ------------2007.01.03. 19:50 2008.03.31. 14:16 2008.03.31. 14:16 2007.01.03. 19:49 Type ---group user user user Name ---Finance Katie Jordan Linda Mitchell Qin Hong Type ---builtinDomain container organizationalUnit organizationalUnit organizationalUnit container infrastructureUpdate organizationalUnit organizationalUnit lostAndFound organizationalUnit organizationalUnit msExchSystemObjec... msDS-QuotaContainer container organizationalUnit organizationalUnit container container Name ---Builtin Computers Contractors Domain Controllers Finance ForeignSecurityPrincipals Infrastructure ITAdmins Legal LostAndFound Marketing Microsoft Exchange Security ... Microsoft Exchange System Ob... NTDS Quotas Program Data Resources Sales System Users

Nzznk egy konkrt elemet, mondjuk Katie Jordan-t, s az tulajdonsgait:

359

PCX PowerShell Community Extensions


9# $u = get-item 'Katie Jordan' 22# $u | fl * PSPath PSParentPath PSChildName PSDrive PSProvider PSIsContainer Type Name Description LastWriteTime FullName CanonicalName DistinguishedName Types Entry IsContainer : : : : : : : : : : : : : : : : Pscx\DirectoryServices::ADATUM:\Finance\Katie Jordan Pscx\DirectoryServices::ADATUM:\Finance Katie Jordan ADATUM Pscx\DirectoryServices False user Katie Jordan 2008.03.31. 14:16:59 ADATUM:\Finance\Katie Jordan Adatum.com/Finance/Katie Jordan CN=Katie Jordan,OU=Finance,DC=Adatum,DC=com {top, person, organizationalPerson, user} System.DirectoryServices.DirectoryEntry False

Lthatjuk, hogy ez mg nem az igazi felhasznli objektum, megint csak egy csomagolst ltunk, a belsejt az Entry tulajdonsgon keresztl rjk el:
23# $u2 = $u.Entry 24# $u2 | fl * objectClass cn sn givenName distinguishedName instanceType whenCreated whenChanged displayName uSNCreated memberOf uSNChanged department company ... : : : : : : : : : : : : : : {top, person, organizationalPerson, user} {Katie Jordan} {Jordan} {Katie} {CN=Katie Jordan,OU=Finance,DC=Adatum,DC= com} {4} {2007.01.04. 3:14:59} {2008.03.31. 21:16:59} {Katie Jordan} {System.__ComObject} {CN=Finance,OU=Finance,DC=Adatum,DC=com} {System.__ComObject} {Finance} {Contoso, Ltd}

A felhasznli attribtumok mdostsa is nagyon egyszer, de itt se felejtsk el a memriban trold adatokat az AD-ba berni a setinfo() metdussal!
27# $u2.department = "Shivatal" 28# $u2.setinfo()

j felhasznl ltrehozsa sem nagy rdngssg:

360

Bvtmnyek
41# new-item -Path "ADATUM:\Finance" -Name "j jzer" -type user LastWriteTime Type ------------- ---2008.05.08. 14:07 user Name ---j jzer

A fenti AD-val kapcsolatos pldk promtjban is lthat nmi trkk, a ketts kereszt jelzi, hogy rendszergazda jogkrrel tnykedem a gpemen. Mindenkppen rdemes rendszeresen nzegetni a PCX honlapjt, hiszen gyakran jelennek meg frisstsek ehhez a bvtmnycsomaghoz, radsul a forrskdot is le lehet tlteni s meg lehet szemllni.

361

Exchange Server 2007

3.3 Exchange Server 2007


Sok informatikus els tallkozsa a PowerShellel az Exchange Server 2007 kapcsn trtnt meg, nlam is ez a helyzet. Hiszen mg a Windows XP, Server 2003, Vista, st mg a Windows Server 2008 esetben is opcionlis ez a komponens, nem ktelez alkalmazni, addig az Exchange Server 2007 zemeltetse sorn nem lehet megkerlni a hasznlatt. Ebben a fejezetben nem kvnok az Exchange Server 2007 rszleteibe belefolyni, gy azok is btran elolvashatjk, akik azt nem ismerik. A clom inkbb a PowerShell bvtsi lehetsgeinek bemutatsa, illetve azon eltrsek, jdonsgok kiemelse az alap PowerShellhez kpest, amelyek vlemnyem szerint elrevettik a PowerShell tovbbfejlesztsnek irnyait is. A PowerShell modulris, bvthet parancssori krnyezet, azaz a meglev parancskszletet jabbakkal lehet kiegszteni bepl modulok (snap-in) teleptsvel. Tbb ilyet mr az elz fejezetben is bemutattam, de az Exchange Server 2007 zemelteti programcsomagja (Exchange Management Tools) is telept ilyen bepl modult.

3.3.1 Te j g! Csak nem egy jabb parancssori krnyezet?


Ha az Exchange Server 2007 programcsoportbl indtjuk el az Exchange Management Shell-t, az elnevezs alapjn megijedhetnk, hogy ez egy jabb parancssori krnyezet, de szerencsre nem.

63. bra Az Exchange Management Shell helye a Start menben

362

Bvtmnyek
Ha rkattintunk az ikonra, akkor egy PowerShell ablakot kapunk, de ez nem teljesen ugyanolyan, mint az igazi PowerShell ablak. Ez alaphelyzetben kicsit csnya, fekete a httere, nincs bekapcsolva a Quick Edit zemmd, kicsi az ablak puffermrete. De termszetesen ezeket a hinyossgokat nyugodtan orvosolhatjuk. A msik klnbsg az igazi PowerShell ablakhoz kpest, hogy az ablak fejlcben az ablakot futtat gp neve s az Active Directory valamely gnak megnevezse lthat, valamint alaphelyzetben be van tltve az Exchange snap-in, amit le is krdezhetnk:
[PS] C:\>Get-PSSnapin Name : Microsoft.PowerShell.Core PSVersion : 1.0 Description : This Windows PowerShell snap-in contains Windows PowerShell manag ement cmdlets used to manage components of Windows PowerShell. Name : Microsoft.PowerShell.Host PSVersion : 1.0 Description : This Windows PowerShell snap-in contains cmdlets used by the Wind ows PowerShell host. Name : Microsoft.PowerShell.Management PSVersion : 1.0 Description : This Windows PowerShell snap-in contains management cmdlets used to manage Windows components. Name : Microsoft.PowerShell.Security PSVersion : 1.0 Description : This Windows PowerShell snap-in contains cmdlets to manage Window s PowerShell security. Name : Microsoft.PowerShell.Utility PSVersion : 1.0 Description : This Windows PowerShell snap-in contains utility Cmdlets used to manipulate data. Name : Microsoft.Exchange.Management.PowerShell.Admin PSVersion : 1.0 Description : Admin Tasks for the Exchange Server

Ez lthat a fenti lista utols helyn. Minden ms tekintetben ez egy normlis PowerShell ablak, teht mindaz alkalmazhat, hasznlhat benne, amit eddig megszoktunk. Minek ksznhetk ezek a vltozsok az alap PowerShell konzolhoz kpest? Ha megnzzk a fenti parancsikon mgtti parancssort, akkor ezt lthatjuk:

363

Exchange Server 2007


C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe -PSConsoleFile "E:\Program Files\Microsoft\Exchange Server\bin\exshell.psc1" -noexit command ". 'E:\Program Files\Microsoft\Exchange Server\bin\Exchange.ps1'"

Nem rvid, a lnyege egy konzolfjl s egy szkript kzvetlen meghvsa a PowerShell krnyezet indtsa sorn. Nzzk meg ezt a kt llomnyt! Elsknt a konzolfjlt:
<?xml version="1.0" encoding="utf-8"?> <PSConsoleFile ConsoleSchemaVersion="1.0"> <PSVersion>1.0</PSVersion> <PSSnapIns> <PSSnapIn Name="Microsoft.Exchange.Management.PowerShell.Admin" /> </PSSnapIns> </PSConsoleFile>

Itt kerl betltsre az Exchange Server rendszerkezelssel kapcsolatos cmdleteket tartalmaz snap-in-je. Nzzk a szkriptet (helyhiny miatt nhny rszt kipontoztam):
# Copyright (c) Microsoft Corporation. All rights reserved. ## ALIASES ################################################################### set-alias list set-alias table format-list format-table

## Confirmation is enabled by default, uncommenting next line will disable it # $ConfirmPreference = "None" ## EXCHANGE VARIABLEs ######################################################## $global:exbin = (get-itemproperty HKLM:\SOFTWARE\Microsoft\Exchange\Setup).MsiInstallPath + "bin\" $global:exinstall = (get-itemproperty HKLM:\SOFTWARE\Microsoft\Exchange\Setup).MsiInstallPath $global:exscripts = (get-itemproperty HKLM:\SOFTWARE\Microsoft\Exchange\Setup).MsiInstallPath + "scripts\" $global:AdminSessionADSettings = [Microsoft.Exchange.Data.Directory.AdminSessionADSettings]::Instance ## Reset the Default Domain $global:AdminSessionADSettings.ViewEntireForest = $false $FormatEnumerationLimit = 16 ## PROMPT #################################################################### ## PowerShell can support very rich prompts, this simple one prints the current ## working directory and updates the console window title to show the machine ## name and directory.

364

Bvtmnyek
function prompt { $cwd = (get-location).Path $scope = "View Entire Forest" if (!$AdminSessionADSettings.ViewEntireForest) { $scope = $AdminSessionADSettings.DefaultScope } $host.UI.RawUI.WindowTitle = "Machine: " + $(hostname) + " | Scope: " + $scope $host.UI.Write("Yellow", $host.UI.RawUI.BackGroundColor, "[PS]") " $cwd>" } ## FUNCTIONs ################################################################# ## returns all defined functions function functions { ... } ## generates a tip of the day function get-tip { ... } ## only returns exchange commands function get-excommand { if ($args[0] -eq $null) { get-command -pssnapin Microsoft.Exchange* } else { get-command $args[0] | where { $_.psSnapin -ilike 'Microsoft.Exchange*' } } } ## only returns PowerShell commands function get-pscommand { ... } ## prints the Exchange Banner in pretty colors function get-exbanner { ... } ## shows quickref guide function quickref {

365

Exchange Server 2007


... } function get-exblog { invoke-expression 'cmd /c start http://go.microsoft.com/fwlink/?LinkId=35786' } ## now actually call the functions get-exbanner get-tip ...

Ebben a szkriptben lthatjuk nhny vltoz definilst, a prompt s az ablak fejlcnek belltst, nhny fggvny definilst. rdekes mdon az Exchange snap-in ltal definilt cmdletek kilistzst vgz get-excommand az nem cmdlet, hanem fggvny! Ebbl kvetkezen pldul nem mkdik esetben a tab kiegszts, s a get-help cmdlet sem.

3.3.2 Az Exchange cmdletek feltrkpezse


Nem egyszer ezen Exchange snap-in ltal biztostott j cmdletek feltrkpezse. Nzzk meg, mennyi j cmdletnk van:
[PS] C:\>(get-command PSSnapin "Microsoft.Exchange.Management.PowerShell .Admin").Count 394

Nem kevs, 394 darab j cmdlet, az alap 129-cel szemben! Hogyan lehet ezeket ttekinteni? Szerencsre kapunk segtsget egyrszt a get-command, msrszt a gethelp cmdlettl is. A get-command esetben hasznlhatjuk a verb s a noun paramtereket, amelyekkel be tudjuk hatrolni a cmdleteket. Pldul a levelesldkkal kapcsolatos cmdletek listzsa:
[PS] C:\>get-command -noun mailbox CommandType ----------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Name ---Connect-Mailbox Disable-Mailbox Enable-Mailbox Export-Mailbox Get-Mailbox Import-Mailbox Move-Mailbox New-Mailbox Remove-Mailbox Restore-Mailbox Definition ---------Connect-Mailbox [-Identity... Disable-Mailbox [-Identity... Enable-Mailbox [-Identity]... Export-Mailbox [-Identity]... Get-Mailbox [[-Identity] <... Import-Mailbox [[-Identity... Move-Mailbox [-Identity] <... New-Mailbox [-Name] <Strin... Remove-Mailbox [-Identity]... Restore-Mailbox [-Identity...

366

Bvtmnyek
Cmdlet Set-Mailbox Set-Mailbox [-Identity] <M...

Vagy az sszes exportlst vgz cmdletek:


[PS] C:\>get-command -verb export CommandType ----------Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Cmdlet Name ---Export-ActiveSyncLog Export-Alias Export-AutoDiscoverConfig Export-Bitmap Export-Clixml Export-Console Export-Csv Export-ExchangeCertificate Export-Mailbox Export-Message Export-TransportRuleCollec... Definition ---------Export-ActiveSyncLog -File... Export-Alias [-Path] <Stri... Export-AutoDiscoverConfig ... Export-Bitmap [-Bitmap] <B... Export-Clixml [-Path] <Str... Export-Console [[-Path] <S... Export-Csv [-Path] <String... Export-ExchangeCertificate... Export-Mailbox [-Identity]... Export-Message [-Identity]... Export-TransportRuleCollec...

Ha mg ez sem lenne kell segtsg a keresett cmdlet megtallshoz, akkor a get-help esetben hasznlhatjuk a role, component s functionality paramtereket. Nzzk, mik lehet a role paramter lehetsges rtkei: rtk Jelents *client* *ca* Client Access Server *edge* *et* Edge Transport server *hub* *ht* Hub Transport server *mail* *mb* Mailbox server *unified* *um* Unified Messaging server *org* *oa* Exchange Organization *rpct* *ra* Exchange Recipient *srv* *sa* Exchange Server *win* *wa* Windows *read* *ro* Read only jelleg cmdletek A component paramter lehetsges rtkei: rtk Jelents *addressing* Cmlistk s e-mail cm hzirendek *agent* Transport Agent, Content/Sender Filtering, IP Allow/Block, s Transport Rules *antispam* IP Allow/Block, Content/Sender Filtering, s Anti Spam *autoDiscover* Autodiscover *calendaring* Rendelkezsre llsi informcik s erforrs fikok naptrkezelse *certificate* Exchange SSL tanustvnyok

367

Exchange Server 2007


*classification* *client* *cluster* *compliance* *delegate* *diagnostic* *domain* *extensibility* *freebusy* *gal* *group* *highavailability* *imap* *mailbox* *mailflow* Message Classification s Transport Rule Outlook Anywhere s CAS Mailbox Clustered Mailbox Server Transport Rule s Journal Rule Exchange Administrator rendszergazda jogosultsgok Message Queue s tesztels Remote s Accepted Domain Transport Agent s Web Services Virtual Directory Availability Service konfigurci Address List s Offline Address Book Group/Distribution Group/Dynamic Distribution Group Clustered Mailbox Server s Local/Cluster Continuous Replication IMAP s CAS Mailbox Mailbox, UM Mailbox s postalda jogosultsgok Transport Agent, Message Queue, Accepted/Remote Domain, Receive/Send Connector, Edge Subscription, s Routing Group Connector Messaging Records Management ActiveSync Offline Address Book Outlook Provider s Outlook Anywhere OWA s Exchange Web Services Virtual Directory Active Directory Permission s Mailbox Permission POP3 Public Folder Message s Message Queue Mail-enabled object (mailbox, contact, user) Accepted Domain, AD Site Link s Routing Group Connector Message Classification s Transport/Journal Rule Exchange Search Exchange Server Mailbox/Public Folder/Logon Statistic Storage Group s Mailbox/Public Folder adatbzis Unified Messaging Client Access Server Virtual Directory

*managedfolder* *mobility* *oab* *outlook* *owa* *permission* *pop* *publicfolder* *queuing* *recipient* *routing* *rule* *search* *server* *statistics* *storage* *um* *virtualdirectory*

A Functionality paramter lehetsges rtkei:

368

Bvtmnyek
rtk Global Server User Jelents Exchange szervezet szintje Kiszolgl szintje Cmzettek szintje

Pldul a mailbox szerep kiszolglkon hasznlhat, szervezetszint jogosultsgok belltsval kapcsolatos cmdletek listjt az albbi mdon krhetjk le:
[PS] C:\>get-help -role *mail* -component *permission* -functionality global Name ---Get-ADPermission Add-ADPermission Remove-ADPermission Category -------Cmdlet Cmdlet Cmdlet Synopsis -------Use the Get-ADPermiss... Use the Add-ADPermiss... Use the Remove-ADPerm...

Ez mr elg jl beszktette az eredetileg 394 darabos listt.

3.3.3 Help szerkezete


Nmikpp megltszik a sg szerkezetn, hogy ms mhelyben kszlt az alap PowerShell, mint az Exchange Server 2007 bepl modul. Nzzk, hogy hogyan nz ki egy alap sg:

64. bra Eredeti PowerShell help

Lthatjuk, hogy szpen elklnl pldk vannak feltntetve. Ezzel szemben egy Exchange cmdletben a pldk nem ennyire rszletesek, s formailag sem vehetk annyira szre:

369

Exchange Server 2007

65. bra Exchange cmdlet helpje

Valszn ennek oka az, hogy az Exchange cmdletek jval sszetettebbek, gyakran egymsra plnek, gy a sg keretei kztt nehz lenne rtelmes pldkat bemutatni.

3.3.4 Felhasznl- s csoportkezels


Az Exchange rendszergazda tevkenysgei kz a felhasznlk s csoportok kezelse is hozztartozik, gy az Exchange PowerShell snap-in tartalmaz ezzel kapcsolatos cmdleteket is. Az alap PowerShellben az [ADSI] tpusjellvel lehet hivatkozni AD objektumokra, mint ahogy lttuk ezt a 2.9 Felhasznl-menedzsment, Active Directory fejezetben, az Exchange krnyezetben mg egyszerbb a helyzet. Ugyan nem teljes rtk az AD felhasznl-menedzsment parancskszlete, hanem kifejezetten csak az Exchange Server ignyeire szabott, de azrt gy is sokat profitlhatunk belle. Nzzk pldul a get-user cmdletet:
[PS] C:\>get-user brian Name ---Brian Cox RecipientType ------------UserMailbox

Nzzk meg kicsit rszletesebben Brian-t:

370

Bvtmnyek
[PS] C:\>get-user brian | fl IsSecurityPrincipal SamAccountName Sid SidHistory UserPrincipalName ResetPasswordOnNextLogon AssistantName City Company CountryOrRegion Department DirectReports DisplayName Fax FirstName HomePhone Initials LastName Manager MobilePhone Notes Office OtherFax OtherHomePhone OtherTelephone Pager Phone PhoneticDisplayName PostalCode PostOfficeBox RecipientType RecipientTypeDetails SimpleDisplayName StateOrProvince StreetAddress Title UMDialPlan UMDtmfMap AllowUMCallsFromNonUsers WebPage TelephoneAssistant WindowsEmailAddress IsValid OriginatingServer ExchangeVersion Name DistinguishedName Identity Guid ObjectCategory ObjectClass WhenChanged WhenCreated : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : True Brian S-1-5-21-150787130-2833054149-3883060369-1132 {} Brian@Adatum.com False

Legal {} Brian Cox Brian Cox

{} {} {}

{} UserMailbox UserMailbox

{} SearchEnabled Brian@adatum.com True SYD-DC1.Adatum.com 0.1 (8.0.535.0) Brian Cox CN=Brian Cox,OU=Legal,DC=Adatum,DC=com Adatum.com/Legal/Brian Cox debe1f52-f0ea-4da0-b049-8f22c2d45db2 Adatum.com/Configuration/Schema/Person {top, person, organizationalPerson, user} 2007.01.03. 19:50:42 2007.01.03. 19:17:26

371

Exchange Server 2007


Lthat, hogy nagyon sok tulajdonsg lekrdezhet a felhasznli fikokkal kapcsolatban. Az Exchange-el kapcsolatos attribtumokat nem ezzel, hanem a get-mailbox cmdlettel lehet lekrdezni.

3.3.5 Get s Set


A fenti tblzatban Brian adatai kztt a Title (beoszts) paramter res. Prbljuk ezt feltlteni:
[PS] C:\>$u = Get-User brian [PS] C:\>$u.title = 'Ports' [PS] C:\>$u.title Ports

Ltszlag sikerlt belltani Brian beosztst, de ha az Active Directory Users and Computer eszkzzel megnzzk Briant, akkor nem ltjuk ezt a paramtert:

66. bra Belltottam a beosztst, mgsem ltszik

Mi trtnt akkor? Az AD-vel kapcsolatos Get-... kezdet cmdletek nem direktben dolgoznak a cmtrban, hanem a cmtr-informcikat betltik a memriba. gy az rtkads utastsom is a memriban hajtdott vgre s nem tnylegesen a felhasznli fikon. Ezrt van az AD-val kapcsolatos Get-... cmdleteknek egy Set-... prjuk is, mert azok mr tnylegesen berjk az rtkeket a cmtr adatbzisba. Nzzk meg, hogy hogyan lehet tnylegesen cmtrparamtereket megvltoztatni a Set-User cmdlettel:

372

Bvtmnyek
[PS] C:\>Set-User brian -Title "Ports" [PS] C:\>Get-User brian | fl Name, Title Name : Brian Cox Title : Ports

Vigyzni kell, hogy nem teljesen szimmetrikusak a Get-... s a Set-... cmdletprok. Jl mutatja ezt a csoportok kezelst vgz Get-Group s a Set-Group pros:
[PS] C:\>get-group sales | fl DisplayName GroupType ManagedBy SamAccountName Sid SidHistory SimpleDisplayName RecipientType RecipientTypeDetails WindowsEmailAddress Notes Members PhoneticDisplayName IsValid OriginatingServer ExchangeVersion Name DistinguishedName Identity Guid ObjectCategory ObjectClass WhenChanged WhenCreated : : : : : : : : : : : : : : : : : : : : : : : :

Universal, SecurityEnabled Sales S-1-5-21-150787130-2833054149-3883060369-1121 {} Group UniversalSecurityGroup {Jeff Hay, Don Hall, Judy Lew} True SYD-DC1.Adatum.com 0.0 (6.5.6500.0) Sales CN=Sales,OU=Sales,DC=Adatum,DC=com Adatum.com/Sales/Sales 5ec43b9a-8789-4437-8abb-b25970bcdd88 Adatum.com/Configuration/Schema/Group {top, group} 2007.01.03. 19:12:41 2007.01.03. 19:09:04

A fenti pldbl ltszik, hogy a csoport tagjai (Members) lekrdezhet a get-group-pal. Nzzk meg a Set-Group szintaxist:
Set-Group -Identity <GroupIdParameter> [-Confirm [<SwitchParameter>]] [-DisplayName <String>] [-DomainController <Fqdn>] [-IgnoreDefaultScope <SwitchParameter>] [-ManagedBy <GeneralRecipientIdParameter>] [-Name <String>] [-Notes <String>] [-PhoneticDisplayName <String>]

373

Exchange Server 2007


[-SimpleDisplayName <String>] [-WhatIf [<SwitchParameter>]] [-WindowsEmailAddress <SmtpAddress>] [<CommonParameters>]

De hol van a Members tulajdonsg belltshoz szksges paramter? Ht ez hinyzik. Mindez azt bizonytja, hogy az Exchange cmdletek nem prbljk meg magukra vllalni az Active Directory kezelst, arra vagy az [ADSI] tpushivatkozst, vagy kls gyrt snap-in-jt hasznlhatjuk.

3.3.6 j paramterfajta: Identity


Az elz pldkban elg nagyvonalan hivatkoztam Brianre, semmi distinguished name, semmi canonical name nem szerepelt a hivatkozsban, holott pldul az [ADSI] hasznlatnl teljes, pontos distinguished name kitltsre volt szksg. Mi teszi lehetv ezt az egyszer, knyelmes hasznlatot? Nzzk meg a get-user sgjt:
[PS] C:\>get-help Get-User -full NAME Get-User SYNOPSIS Use the Get-User cmdlet to retrieve all users in the forest that match the specified conditions. SYNTAX get-User [-Identity <UserIdParameter>] [-Credential <PSCredential>] [-D omainController <Fqdn>] [-IgnoreDefaultScope <SwitchParameter>] [-Organ izationalUnit <OrganizationalUnitIdParameter>] [-ReadFromDomainControll er <SwitchParameter>] [-RecipientTypeDetails <RecipientTypeDetails[]>] [-ResultSize <Unlimited>] [-SortBy <String>] [<CommonParameters>] get-User [-Credential <PSCredential>] [-DomainController <Fqdn>] [-Filt er <String>] [-IgnoreDefaultScope <SwitchParameter>] [-OrganizationalUn it <OrganizationalUnitIdParameter>] [-ReadFromDomainController <SwitchP arameter>] [-RecipientTypeDetails <RecipientTypeDetails[]>] [-ResultSiz e <Unlimited>] [-SortBy <String>] [<CommonParameters>] get-User [-Anr <String>] [-Credential <PSCredential>] [-DomainControlle r <Fqdn>] [-IgnoreDefaultScope <SwitchParameter>] [-OrganizationalUnit <OrganizationalUnitIdParameter>] [-ReadFromDomainController <SwitchPara meter>] [-RecipientTypeDetails <RecipientTypeDetails[]>] [-ResultSize < Unlimited>] [-SortBy <String>] [<CommonParameters>] ... PARAMETERS ... -Identity <UserIdParameter> The Identity parameter takes one of the following values: * GUID * Distinguished name (DN)

374

Bvtmnyek
* * * * * Domain\Account User principal name (UPN) Legacy Exchange DN Simple Mail Transfer Protocol (SMTP) address Alias false 1 True true

Required? Position? Default value Accept pipeline input? Accept wildcard characters? ...

Ltszik, hogy a tbbfajta szintaxisa alapjn az els paramtert vagy ANR (Ambigous Name Resolution) nvfeloldsra, vagy ehhez nagyon hasonl Identity tpus nvfeloldsra hasznlja. Az Identity paramter magyarzatt a fenti helprszletben lthatjuk is. Azt, hogy most melyiket hasznlta nem tudjuk, hiszen mindkett j eredmnyre vezet:
[PS] C:\>Get-User -anr brian Name ---Brian Cox [PS] C:\>Get-User -identity brian Name ---Brian Cox RecipientType ------------UserMailbox RecipientType ------------UserMailbox

Mi ebbl a tanulsg? Hogy az Exchange cmdletek kialaktsnl trekedtek arra a fejlesztk, hogy a lehet legegyszerbben lehessen hivatkozni az AD objektumokra. Elg hamar elmenne a kedvnk a szkriptek rstl, ha minden esetben csak a teljes distinguished name kirsval lehetne hivatkozni az AD objektumokra, gy azonban az Identity (s a felhasznlkkal kapcsolatban az ANR) paramterrel elg csak olyan mrtkig utalni a keresett objektumokra, amikor mr egyrtelm a cmdlet szmra, hogy kire vagy mire gondoltunk. Pldul a get-MailboxDatabase cmdletnl az Identity paramter a kvetkezket jelentheti:
[PS] C:\>get-help get-mailboxdatabase -Parameter Identity -Identity <DatabaseIdParameter> The Identity parameter specifies a mailbox database. You can use the fo llowing values: * GUID * Distinguished name (DN) * Server\storage group\database name * Server\database name * Storage groupname\database name

375

Exchange Server 2007


If you do not specify the server name, the cmdlet will search for datab ases on the local server. If you have multiple databases with the same name, the cmdlet will retrieve all databases with the same name in the specified scope. Required? Position? Default value Accept pipeline input? Accept wildcard characters? false 1 True true

Azaz, a megjegyzs alapjn, akr elg csak az adatbzis nevt megadni, ha az egyrtelm, s nem kell az adatbzis Distinguished nevt hasznlni, ami elg elrettent lenne:
[PS] C:\>(Get-MailboxDatabase "syd-dc1\mailbox database").DistinguishedName CN=Mailbox Database,CN=First Storage Group,CN=InformationStore,CN=SYD-DC1,C N=Servers,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrat ive Groups,CN=Adatum Organization,CN=Microsoft Exchange,CN=Services,CN=Conf iguration,DC=Adatum,DC=com

Amit a fenti pldban kiemeltem hrom s fl sor terjedelemben, az egy mailbox adatbzis distinguished neve. Nem hiszem, hogy brki szvesen gpelne ilyen hossz nev paramtereket.

3.3.7 Filter paramter


Msik hatkonysgnvel paramter szmos Exchange cmdletnl a Filter paramter. Nzzk meg, hogy eddigi ismereteink alapjn hogyan keresnnk meg az sszes olyan felhasznlnkat, akiknek ki van tltve a beoszts tulajdonsguk:
[PS] C:\>get-user | Where-Object {$_.Title -ne ""} | Format-Table -Property DisplayName, Title DisplayName ----------Brian Cox Kim Akers Title ----Ports Naplop

Hogyan hajtdik ez vgre? A get-user cmdlettel az sszes felhasznli objektumot kigyjtjk, s maga a PowerShell krnyezet vlogatja ki kzlk azokat, amelyeknl a Title paramter nem res sztring. Azaz az egsz feldolgozs terhe ttevdik a kliensoldalra. Ez egy tbb tzezres felhasznlszmnl komoly feldolgozsi munkt ignyel. Ezrt kidolgoztak egy kiszolgl-oldali feldolgozsi lehetsget is az ilyen jelleg AD cmdleteknl, ezt pedig a Filter paramter biztostja. Itt gynevezett OPATH filtereket, vagy ms szval prescanned filter-t (el feldolgozott szr) hasznlhatunk, amely szrfelttelt a szerver-oldal hajt vgre.

376

Bvtmnyek
[PS] C:\>Get-User -filter {Title -ne $null} | Format-Table -Property Display Name, Title DisplayName ----------Brian Cox Kim Akers Title ----Ports Naplop

Ezzel jval hatkonyabb s gyorsabb a feldolgozs. Azonban tudni kell, hogy mely attribtumokra lehet gy hivatkozni, s milyen szintaxissal. Az albbi tblzatban a legfontosabb szrhet attribtumok listja tallhat, termszetesen nem mindegyik felhasznli attribtum, hanem vannak kztk group, mailbox, contact, public folder objektumok tulajdonsgainak elnevezsei is:
AcceptMessagesOnlyFrom AcceptMessagesOnlyFromDLMembe rs ActiveSyncAllowedDeviceIDs ActiveSyncDebugLogging ActiveSyncEnabled ActiveSyncMailboxPolicy AddressListMembership Alias AllowUMCallsFromNonUsers AssistantName CallAnsweringAudioCodec City Company CountryOrRegion CustomAttribute1 CustomAttribute10 CustomAttribute11 CustomAttribute12 CustomAttribute13 CustomAttribute14 CustomAttribute15 CustomAttribute2 CustomAttribute3 CustomAttribute4 CustomAttribute5 CustomAttribute6 CustomAttribute7 CustomAttribute8 ExternalEmailAddress ExternalOofOptions Fax FirstName ForwardingAddress GrantSendOnBehalfTo GroupType Guid HiddenFromAddressListsEnable d HomePhone IncludedRecipients Initials IsLinked IsMailboxEnabled IsResource IsShared IssueWarningQuota LanguagesRaw LastName LinkedMasterAccount ManagedBy ManagedFolderMailboxPolicy Manager MaxBlockedSenders MaxReceiveSize MaxSafeSenders MaxSendSize MemberOfGroup Phone PhoneticDisplayName PoliciesExcluded PostalCode PostOfficeBox PrimarySmtpAddress ProhibitSendQuota ProhibitSendReceiveQuota PublicFolderContacts PublicFolderType RecipientFilter RecipientLimits RecipientType RecipientTypeDetails RejectMessagesFrom RejectMessagesFromDLMembers ResourceCapacity ResourceCustom RetainDeletedItemsFor RulesQuota SamAccountName SendOofMessageToOriginatorEnabl ed ServerName SimpleDisplayName StateOrProvince StreetAddress TelephoneAssistant Title

377

Exchange Server 2007


CustomAttribute9 Database Department DisplayName DistinguishedName EmailAddresses EmailAddressPolicyEnabled ExchangeGuid ExchangeVersion ExpansionServer MobilePhone Name Notes Office OfflineAddressBook OperatorNumber OtherFax OtherHomePhone OtherTelephone Pager UMDtmfMap UMEnabled UMMailboxPolicy UMRecipientDialPlanId UseDatabaseQuotaDefaults UserPrincipalName WhenChanged WhenCreated WindowsEmailAddress

A Filter paramterben is hasznlhatjuk a PowerShellben megszokott sszehasonlt opertorokat s az ott alkalmazott szintaxist.

378

Bvtmnyek

3.4 Adatok vizualizlsa, PowerGadgets


A PowerGadgets eszkz segtsgvel a PowerShell konzolos kimenett lehet egyszeren vizualizlni, mindenfle sznes, rnykolt hromdimenzis, kr-, oszlop- s fnkdiagramban lehet kirajzoltatni az eredmnyeket. Azonban ehhez ellenrizni kell, hogy a megjelentend adatok megfelelek-e, azaz tnyleg szmokat akarunk-e grafikonokon megjelenteni. Erre a problmra jl vilgt r a get-mailboxstatistics Exchange cmdlet, amellyel ki lehet olvasni az egyes levelesldk mreteit. Nzzk, hogy mit is ad ez a cmdlet eredmnyl, egyelre a konzolon:
[PS] C:\>Get-MailboxStatistics | where-object {$_.DisplayName -notlike "*Sys tem*" } | format-table -Property displayname, totalitemsize DisplayName ----------Fnk Brian Cox Beth Gilchrist Beosztott Administrator Qin Hong Ron Gabel Katarina Larsson Titkrn trgyal Linda Mitchell Kim Akers Katie Jordan Gregory Weber TotalItemSize ------------17853B 8539B 6926B 33982B 61348387B 2819B 2819B 14838B 14549B 40276B 22350817B 30263144B 8755060B 5287489B
16

A kifejezsem azrt nem egy puszta get-mailboxstatistics, mert az tartalmazna mindenfle bels levelesldt, ezrt ezeket a where-object cmdlettel kiszrm, plusz a kifejezsem vgn a format-table-lel csak az engem rdekl oszlopokat jelentem meg. Els rnzsre jnak tnik az eredmny, csvezzk bele a PowerGadgets out-chart cmdletjbe:
[PS] C:\>Get-MailboxStatistics | where-object {$_.DisplayName -notlike "*Sys tem*" } | ft -Property displayname, totalitemsize | out-chart

16

Letlthet demo verzi: http://www.softwarefx.com/sfxSqlProducts/powergadgets/

379

Adatok vizualizlsa, PowerGadgets

67. bra A get-mailboxstatistics alapban res diagramot ad

Ht ennek a kimenete nem tl szp! Mi lehet az ok? Az a "B" bet a get-mailboxstatistics kimenetnek msodik oszlopban minden szm vgn. Tl okos akar lenni az Exchange cmdlet, jelzi, hogy ezt az rtket bjtban kell rtelmezni, de ez pp elg ahhoz, hogy a szmokra vr out-chart-ot szomorv tegye. Prbljunk ebbl a tl okos rtkbl normlis szmot csinlni, ehhez vizsgljuk meg, hogy mi is a kimenete a get-mailboxstatistics-nak, egyelre egy konkrt leveleslda esetben a TotalItemSize tulajdonsgt:
[PS] C:\>(Get-MailboxStatistics titkrn).TotalItemSize | Get-Member -Member Type properties TypeName: Microsoft.Exchange.Data.Unlimited`1[[Microsoft.Exchange.Data.B yteQuantifiedSize, Microsoft.Exchange.Data, Version=8.0.0.0, Culture=neutra l, PublicKeyToken=31bf3856ad364e35]] Name ---IsUnlimited Value MemberType ---------Property Property Definition ---------System.Boolean IsUnlimited {get;} Microsoft.Exchange.Data.ByteQuantifiedSize Value ...

Ebbl mg nem sok minden derlt ki, de nem gond, akkor vegyk a TotalItemSize.Value rtket, az htha jobb:
[PS] C:\>(Get-MailboxStatistics titkrn).TotalItemSize.Value

Hopp! Ez meg nem adott semmit! Ht az hogy lehet? Hiszen az eredeti get-mailboxstatistics az adott rtket. Nzzk meg ennek tagjellemzit:

380

Bvtmnyek
[PS] C:\>(Get-MailboxStatistics titkrn).TotalItemSize.Value | Get-Member TypeName: Microsoft.Exchange.Data.ByteQuantifiedSize Name ---CompareTo Equals GetHashCode GetType RoundUpToUnit ToBytes ToGB ToKB ToMB ToString ToTB MemberType ---------Method Method Method Method Method Method Method Method Method Method Method Definition ---------System.Int32 CompareTo(ByteQuantifiedSize other) System.Boolean Equals(Object obj), System.Boole... System.Int32 GetHashCode() System.Type GetType() System.UInt64 RoundUpToUnit(Quantifier quantifier) System.UInt64 ToBytes() System.UInt64 ToGB() System.UInt64 ToKB() System.UInt64 ToMB() System.String ToString(), System.String ToStrin... System.UInt64 ToTB()

Ltszik, hogy a Value tagjellemznek nincs is "property" tpus tulajdonsga, csak metdusa. Ezrt nem kaptunk semmi kimenetet az elbb! Ahhoz, hogy rtket kapjunk meg kell hvni pldul a ToBytes() metdust, s akkor mr igazi szmot kapunk:
[PS] C:\>(Get-MailboxStatistics titkrn).TotalItemSize.Value.ToBytes() 14549

Ez mr j. Ennek ismeretben alaktsuk t az eredeti kifejezsnket! Mg egy trkkjt kihasznlom itt a PowerGadgets-nek, azt, hogy 5 msodperces frisstssel is ki lehet rajzoltatni a megadott kifejezs eredmnyt, gy folyamatosan jrarajzolja a grafikont az ppen aktulis helyzetnek megfelelen:
[PS] C:\>Get-MailboxStatistics | where-object {$_.DisplayName -notlike "*Sys tem*" } | select-object displayname, @{n="TotalItemSize"; e={$_.totalitemsiz e.Value.ToBytes()}} | out-chart -Refresh 0:0:5

Itt egy kicsit trkkzni kellett, hiszen itt most nem csak meglev tulajdonsgrtkeket kell kirni, hanem egy metdussal j tulajdonsgot kell szmoltatni. Erre nem alkalmas a format-table, hanem a select-object cmdletet kell segtsgl hvni, amely egy hashtbla kifejezssel kpes kiszmolni az j tulajdonsgrtket, mint ahogy lttuk ezt a 1.10.4 Objektumok talaktsa (Select-Object) fejezetben.

381

Adatok vizualizlsa, PowerGadgets

68. bra A j diagram j tulajdonsgrtk kiszmolsa utn

Ez mr teljesen szp s j eredmnyt adott. St! Ltjuk, hogy a PowerGadgets is okos, hiszen is tszmolta a szmokat, immr megabjtba, teht felesleges volt az Exchange cmdlet okoskodsa.

382

Bvtmnyek

3.5 Kitekints a PowerShell 2.0-ra


A knyv rsnak idpontjban a PowerShell 2.0 mg nagyon kezdeti fejlesztsi fzisban van. Elrhet egy u.n. Community Technology Preview vltozat, amellyel a Microsoft szondzza a felhasznli visszajelzseket az egyes tervezett j funkcikkal kapcsolatban. Ezek az j funkcik jelenleg a kvetkezk: Remoting A PowerShell parancsok tvoli gpen trtn futtatst teszi lehetv. Ehhez olyan j fogalmakra van szksg, mint RunSpace, azaz futtatsi krnyezet, amelyet ltre lehet hozni tvoli gpen, ott el lehet indtani PowerShell szkripteket, a kapcsolatot lehet bontani, majd ksbb ugyanehhez a futtatsi krnyezethez csatlakozva lthatjuk a vgeredmnyt. j s tovbbfejlesztett WMI cmdletek Az univerzlis Get-WMIObject cmdlet tovbb okosodik, DCOM autentikcival, impersonation szintekkel, ami lehetv teszi IIS 6.0 kiszolglk kezelst is. Tovbbi WMI cmdletek is megjelennek: Invoke-WMIMethod Remove-WMIObject Set-WMIInstance Hibakeress PowerShell 2.0 vrhatan tartalmazni fog egy cmdlet-alap debuggert, amellyel megszaktsi pontokat lehet definilni, ki- s belpni lehet szkriptekbe. Mindezt magbl a konzolablakbl, azaz nincs felttlenl szksg a PowerGUI szkriptszerkesztjre, vagy ms grafikus szkriptszerkesztre. Background Jobs PowerShell 1.0-ban, ha elindtunk egy parancsot, akkor egszen addig nem kapjuk vissza a promptot, amg az vgre nem hajtdik. A PowerShell 2.0-ban vrhatan aszinkron mdon is lehet parancsokat vgrehajtatni a httrben. Ezzel a lehetsggel prhuzamosan lehet sok PowerShell szkriptet vgrehajtatni. Graphical PowerShell Vrhatan a mostani kls gyrtl ltal adott szkripteditorokhoz hasonl grafikus alkalmazst is fog tartalmazni a PowerShell 2.0: sznnel jelzett szintaxis, azonnali vltozkirtkels, stb. j s megvltozott cmdletek A meglev cmdletek kzl szmos fejldni fog, jabb paramterekkel lesznek hasznlhatk. j cmdlet lesz az Out-GridView, mellyel a gyakori tblzatos outputot lehet

383

Kitekints a PowerShell 2.0-ra


igazi tblzatknt: grafikus rcsban megtekinteni, az oszlopok tmretezsvel, mozgatsval, sorrendvltoztatssal. ScriptCmdlets j cmdleteket eddig sem volt problma kszteni, csak a C# vagy a Visual Basic .NET nyelvek s a VisualStudio ismeretre volt szksg. A PowerShell 2.0-ban akr szkripttel is lehet j cmdleteket kszteni, gy nem csak a fejlesztk privilgiuma lesz ez az alkot munka.

384

Hasznos linkek

4. Hasznos linkek
Az albbi linklista kb. 7 hnap gyjtmunkjnak eredmnye. Ez a knyv nem jhetett volna ltre, ha ezek az informcik nem llnak rendelkezsemre. Termszetesen nem az itteni informcikat emeltem t egy az egyben, hanem ezek a weboldalak inspirltak arra engem, hogy bizonyos tmkat jrjak jobban krl, illetve tleteket adtak arra vonatkozlag, hogy milyen tmkat rintsek. Sok ezen linkek kzl nem statikus oldal, hanem dinamikus tartalom, blog, folyirat jelleg oldal, gy rdemes ezeket rendszeresen ltogatni.

PowerShell QuickStart: http://channel9.msdn.com/wiki/default.aspx/Channel9.WindowsPowerShellQuickStart PowerShell Wiki: http://channel9.msdn.com/wiki/default.aspx/Channel9.WindowsPowerShellWiki Scripting Ezine: http://www.computerperformance.co.uk/ezine/ Tip of the Week (Script Center): http://www.microsoft.com/technet/scriptcenter/resources/pstips/archive.mspx Gyorsbillentyk: http://www.microsoft.com/technet/scriptcenter/topics/winpsh/manual/hotkeys.mspx .NET formzsi kifejezsek: http://msdn2.microsoft.com/en-us/library/fbxft59x(vs.71).aspx Egyedi objektum, add-member: http://thepowershellguy.com/blogs/posh/rss.aspx?Tags=PsObject&AndTags=1

385

Hasznos linkek
http://blog.sapien.com/index.php/2008/02/20/how-can-i-write-a-powershell-functionthat-outputs-a-table/ http://technet.microsoft.com/en-us/library/bb978596.aspx Egyedi tpus: http://msdn2.microsoft.com/en-us/library/cc136149(VS.85).aspx http://technet.microsoft.com/en-us/library/bb978568.aspx http://blogs.msdn.com/powershell/archive/2006/06/24/645981.aspx http://www.hanselman.com/blog/MakingJunctionsReparsePointsVisibleInPowerShell.asp x Regex: http://msdn2.microsoft.com/en-us/library/hs600312.aspx http://www.regular-expressions.info/ http://regexlib.com/ http://www.weitz.de/regex-coach/ http://www.sellsbrothers.com/tools/#regexd http://www.ultrapico.com/ExpressoDownload.htm Keress az Active Directory-ban: http://www.microsoft.com/technet/scriptcenter/resources/qanda/nov06/hey1109.mspx http://blogs.technet.com/benp/archive/2007/03/26/searching-the-active-directory-withpowershell.aspx http://www.computerperformance.co.uk/powershell/powershell_active_directory.htm http://www.microsoft.com/technet/scriptcenter/topics/winpsh/searchad.mspx

386

Hasznos linkek
WMI: http://www.microsoft.com/technet/scriptcenter/topics/msh/mshandwmi.mspx http://www.codeplex.com/PsObject/Wiki/View.aspx?title=WMI&referringTitle=PSH%20C ommunity%20Guide PowerShell blog: http://poshoholic.com/ http://blogs.microsoft.co.il/blogs/ScriptFanatic/ ADSI: http://blogs.technet.com/industry_insiders/pages/windows-server-2008-protectionfrom-accidental-deletion.aspx http://msdn.microsoft.com/en-us/library/ms256752(VS.80).aspx http://bsonposh.com/archives/tag/adsi http://www.leadfollowmove.com/archives/powershell/managing-group-membership-inactive-directory-with-powershell-part-1 http://www.leadfollowmove.com/archives/powershell/managing-group-membership-inactive-directory-with-powershell-part-2 http://technet.microsoft.com/en-us/magazine/cc162323.aspx http://powershelllive.com/blogs/lunch/archive/2007/04/04/day-6-adsi-connecting-todomains-computers-and-binding-to-objects.aspx PowerShell on Windows Server 2008 Server Core: http://dmitrysotnikov.wordpress.com/2008/05/15/powershell-on-server-core/ Effective PowerShell: http://keithhill.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs =cat%3dEffective%2bPowerShell

387

Hasznos linkek
ACL-ek kezelse: http://www.microsoft.com/technet/scriptcenter/resources/pstips/may08/pstip0516.msp x Performance Monitor: http://www.leeholmes.com/blog/AccessingPerformanceCountersInPowerShell.aspx LDAP filter: http://www.tek-tips.com/faqs.cfm?fid=5667 DateTime tpus a .NET keretrendszerben: http://www.meshplex.org/wiki/C_Sharp/Dates_and_Times COM Automation: http://blogs.msdn.com/jmanning/archive/2007/01/25/using-powershell-for-outlookautomation.aspx http://www.computerperformance.co.uk/powershell/powershell_com.htm http://www.microsoft.com/technet/scriptcenter/resources/pstips/nov07/pstip1130.msp x

388

Trgymutat

5. Trgymutat

o
140 , 69, 145

, .
. 146 .. 75, 146

#
# 197

$
$() 142, 153 $_ 56 $args ................................................. 168, 194 $DebugPreference ................................... 264 $false ........................................................ 138 $foreach ................................................... 154 $host ........................................................ 235 $input ....................................................... 182 $matches .................................................. 122 $MyInvocation ................................. 230, 232 $null ......................................................... 138 $ofs............................................................. 87 $switch ..................................................... 162 $this.................................................... 96, 313 $true ......................................................... 138 $VerbosePreference................................. 263 :: 89, 146

: ;
; 14, 53

@
@() ..................................................... 70, 143 @{ Lsd hashtbla @ 51

[
[] 145 [ADSI] ....................................................... 319 [decimal] .................................................... 68 [double] ...................................................... 68 [int] ............................................................. 68 [long] .......................................................... 68 [math]......................................................... 89 [PSObject]................................ Lsd PSObject [regex] ...................................................... 134 [scriptblock].............................................. 184 [switch] ..................................................... 170 [system.convert] ........................................ 90 [void] .......................................................... 74

%
% 16, 111

&
& 52

(
() 141

389

Trgymutat
[XML] ....................................................... 281

B
begin/process/end................................... 183 break ................................................ 160, 258

`
` 13, 49

{
{} 144

C
clear ........................................................... 16 Clear-Host .................................................. 16 Clear-Variable ............................................ 48 -clike ........................................................ 118 cls 16 -cmatch .................................................... 131 cmdlet ........................................................ 33 -cnotlike ................................................... 118 cnotmatch .............................................. 131 CommonParameters ................................ 247 Compare-Object ...................................... 215 contains ................................................. 116 continue ................................................... 258 creplace ................................................. 137

|
| 55

49

49

+
++ 140 += 72

Cs
csvezetk ................................................. 54

D >
DateTime ................................................... 81 default ..................................................... 160 DefaultDisplayPropertySet ........................ 99 digitlis alrs ......................................... 198 dinamikus paramter............................... 187 dir 24 DirectoryServices.DirectoryEntry ............. 319 dotsourcing ...................................... 178, 194 DO-WHILE ................................................ 152

> 150 >> 150

0
0x 68

2
2> 261

E, A,
ELSE.......................................................... 152 ELSEIF ....................................................... 152 env: .......................................................... 233 ErrorAction .............................................. 247 Escape ........................................................ 49 Exception objektum ......................... 260, 262 ExceptionType ......................................... 254

Add-Member ............................................. 95 Add-PSSnapin........................................... 239 alias ............................................................ 39 Alias: .......................................................... 40

390

Trgymutat
Exit................................................................ 7 Export-Alias ................................................ 41 Export-CliXML ................................... 105, 220 Export-Console ......................................... 241 Export-Csv ................................................ 220

H
hashtable .................................................... 77 help fggvny ............................................. 34 here string .................................................. 51 hexadecimlis ............................................. 68 hibakezels ............................................... 246

F
-f 148 filter .......................................................... 183 fl Lsd Format-List FOR ........................................................... 153 FOREACH .................................................. 153 ForEach-Object ......................................... 206 Format-List ................................................. 59 Format-Table ...................................... 59, 215 ft Lsd Format-Table function: ................................................... 185

I,
idzjelek hasznlata ................................. 49 IF 152 Import-Alias ................................................ 41 Import-CliXML .......................................... 105 Import-Csv ................................................ 221 Invoke() .................................................... 144 Invoke-Expression .................................... 147 is 139

G
Get-Acl.............................................. 277, 292 Get-Alias ..................................................... 40 Get-Command .................................... 33, 366 -noun ................................................... 366 -verb .................................................... 366 Get-Content ............................. 151, 220, 273 Get-Date ..................................................... 81 Get-Eventlog............................................. 284 Get-Excommand ....................................... 366 Get-Help ....................................... 34, 57, 366 Get-History ................................................. 14 Get-ItemProperty ..................................... 289 Get-MailboxStatistics ............................... 379 Get-Member................................... 37, 55, 71 Get-Process ................................................ 19 Get-PSDrive ................................................ 42 Get-PSSnapin ............................................ 239 Get-Service ......................................... 99, 312 Get-Unique ............................................... 217 Get-Variable ....................................... 47, 176 Get-WMIObject ........................................ 299 GetType().................................................... 45 -GroupBy .................................................... 61 Group-Object............................................ 208

K
kimenet ...................................................... 56 kommandlet ................................Lsd cmdlet komment .................................................. 197 konzolfjl .................................................. 241

L
like .......................................................... 118 logikai opertorok -and ..................................................... 138 -band ................................................... 139 -bnot ................................................... 139 -bor ..................................................... 139 -bxor .................................................... 139 not ..................................................... 138 -or 138 -xor ...................................................... 138

M
makecert.exe ............................................ 199 Measure-Command ................................. 244 Measure-Object ....................................... 219 megosztsok elrse ................................ 282 metdus ..................................................... 24 MoveNext() .............................................. 155

391

Trgymutat
MyCommand ........................................... 230

P
param............................................... 171, 195 PassThru .................................................. 97 pipeline ...................................................... 54 PowerGadgets ......................................... 379 PowerGUI................................................... 18 PowerShell Plus ......................................... 22 prompt ............................................. 188, 238 >> 13 psbase ...................................................... 322 PSDrive....................................................... 41 PSObject .................................................... 95

N
New-Alias ................................................... 41 New-Item .................................. 186, 271, 292 New-Itemproperty ................................... 291 New-Object ................................................ 88 -COM .................................................. 347 New-PSDrive .............................................. 43 New-TimeSpan .......................................... 83 New-Variable ............................................. 48 nonterminating error ............................... 246 notcontains ............................................ 116 -notlike..................................................... 118 notmatch ............................................... 131

R
range.................................................... Lsd .. Read-Host ................................................ 198 Reflector .............................................. 22, 89 RegexBuddy ............................................... 21 Regular Expression................................... 119 Regex .................................................. 119 Remove-PSDrive ........................................ 44 Remove-PSSnapin .................................... 240 Remove-Variable ....................................... 47 Reset()...................................................... 155 Resolve-Path .............................................. 44 return ............................................... 180, 194

O,
objektum ................................................... 24 op_Addition ............................................. 107 opertorok -ceq ..................................................... 113 -cge ..................................................... 113 -cgt...................................................... 113 -cle ...................................................... 113 -clt 113 -cne ..................................................... 113 -eq113 -ge 113 -gt 113 -le 113 -lt 113 -ne113 vgrehajtsi ........................................ 147 Out-Chart ................................................. 379 Out-File .................................................... 220 Out-Null ................................................... 225 Out-Printer............................................... 220 output ........................................................ 56 Out-String ................................................ 224

S
scope...................................................... 176 ScriptBlock ............................................... 144 Select-Object ................................... 210, 290 Select-String ............................................. 224 Set-Acl ...................................................... 279 Set-Content .............................................. 220 Set-Date ..................................................... 81 Set-ExecutionPolicy ................................. 190 Set-Item ................................................... 186 Set-ItemProperty ..................................... 291 Set-PSDebug ............................................ 264 Set-Variable ....................................... 47, 176 Sort-Object......................................... 61, 213 Split() ....................................................... 113 Split-Path ................................................. 231 Start-Sleep ............................................... 244

,
sszehasonlt opertorok ...................... 113

392

Trgymutat
Start-Transcript ................................ 243, 276 static member ............................................ 89 Stop-Transcript ......................................... 243 switch -wildcard ............................................. 161 SWITCH..................................................... 159 System.Collections.ArrayList ...................... 72 System.Diagnostics.Process ..................... 309 System.DirectoryServices.ActiveDirectory.Ac tiveDirectorySite ................................. 318 System.DirectoryServices.ActiveDirectory.Do main .................................................... 318 System.DirectoryServices.ActiveDirectory.Fo rest ...................................................... 317 System.DirectoryServices.DirectorySearcher ............................................................ 330 System.IO.Path ......................................... 280 System.Net.Dns ........................................ 317 tmb ........................................................... 68 asszociatv ............................................. 77 egyelem .............................................. 69 elem ...................................................... 74 tpusos ................................................... 77 tbbdimenzis ...................................... 76 tmbopertor ........................................... 145 Trace-Command ....................................... 266 trap ........................................................... 252 tulajdonsg ................................................. 24

Ty
types.ps1xml ...................................... 99, 313

V
vltozk ...................................................... 45

Sz
szkriptblokk .............................................. 184 sztr.......................................................... 77

W
WHILE ....................................................... 152 wrap ......................................................... 62 Write-Debug ..................................... 263, 264 Write-Error ............................................... 262 Write-Host .................................................. 57 Write-Output .............................................. 57 Write-Progress ......................................... 245 Write-Verbose .......................................... 263 Write-Warning ......................................... 261

T
TabExpansion ..................................... 12, 189 Tee-Object ................................................ 207 terminating error...................................... 246 Test-Path .................................................. 271 throw ................................................ 167, 246 tpus............................................................ 65

393

You might also like