.Net 2 előadás jegyzet – 9. óra
1.oldal
.NET Microsoft .Net Framework és programozása II. Előadás jegyzet Előadó: Pócza Krisztián ELTE,2012
Windows PowerShell 1.0 Bevezetés A legtöbb operációs rendszerben beépítve találhatunk legalább egy shell, azaz valamilyen parancssoros parancs-értelmező alkalmazást. Van ahol csak pl. egy Windows (command), van ahol több, pl. (Linux Bash, Sh, Ksh stb). Ezekről a shell -ekről általában elmondható, hogy habár nagyon hasznosak, nem felelnek meg a mai objektum-orientált elvárásoknak. Pl. ha lekérjük egy könyvtár tartalmát, akkor egy string listát kapok vissza, nem FILE – objektumokat. Tehát a feldolgozást igencsak megnehezíti, hogy ezeket még külön ki kell keresgélni a meghajtóról, ha további műveleteket akarunk végezni velük. A Powershell nem szöveg alapú (+ pipeok), mint mondjuk a Linux, ill. a legtöbb shell esetén, hanem objektum alapú (lehet pl. mezőkre hivatkozni egyszerűen) és teljesen .NET kompatibilis. Habár a PowerShell nem része a Windows -nak( csak Win2008 -tól ), ingyenesen letölthető a Microsoft honlapjáról. ( www.microsoft.com )
.Net 2 előadás jegyzet – 9. óra
2.oldal
PowerShell 1.0 A PowerShell -ben (PS) a parancsok formája ige-főnév típusú pl. (Get-Help), de van lehetőség alias -ok definiálására is, amellett, hogy rengeteg beépített alias is van. Pl. az eddig kiadott parancsok listáját a h (history) paranccsal érjük el. Nagyon sok windows és linux parancs megtalálható alias -ként (dir, ls, …). Help parancs – kilistázza a rendelkezésre álló parancsokat + alias –okat:
Azonban egy kényelmes Shell -nél többet kapunk. A PowerShell integrált a .NET framework -el, ezért minden osztály használható, ami a .NET-ben elérhető. Első lépések: A Powershell telepítése után Start menü Run powershell és meg is kapjuk a fenti képernyőt. Első parancsunk legyen a get-command. Ezzel egy elrettentő (vagy inkább ínycsiklandó) méretű listát kapunk a PowerShell cmdlet –jeiről(azaz a PS saját parancsairól). Ha meguntuk a nézelődést, akár neki is kezdhetünk… A get-help * kilistázza az összes súgó témát jó pár oldalnyi olvasnivalóval ellátva a user –t. A help alias –sal természetesen spórolhatunk, ill. UNIX –ból érkezve otthonosabban érezhetjük magunkat. Annyi a különbség csupán, hogy a help használatakor oldalanként kapjuk meg a listát. A help
segítségével tovább bővíthetjük ismereteinket az alapvető utasításokról. Cmdlet –jeink önmagukban nem sok mindent tudnak, de azt viszont NAGYON JÓL! Érződik, hogy szükség lenne némi paraméterezésre. Nem is vagyunk megfosztva ettől a lehetőségtől. Ismét felhívom a figyelmet, hogy itt nem karakterláncokat kapunk, hanem igazi objektumokat. Pl. a get-help help eredménye objektum, amelynek vannak metódusai. Ilyen metódus pl. a parameterlistát megjelenítő (get-help help).parameters is. Még mindig információszerzésre használható a get-member parancs is. | get-member megmutatja bármely objektum adattagjait és metódusait. A fenti információhalommal felvértezve már bátran masírozhatunk gyakorlatiasabb területekre Változók létrehozása a $nev = szintaxissal történik. Típust nem kell neki adni. A jobb oldal értelemzése közben automatikusan rendel hozzá típust, amit a $nev.gettype() segítségével kérdezhetünk le.
.Net 2 előadás jegyzet – 9. óra
3.oldal
PS –ben a szokásos változóértékek (integer, string ”blablabla”idézőjelek között!, stb) mellett gyüjteményeket is adhatunk a változó értékéül. Továbbá a változók gond nélkül felüldefiniálhatók. Pl.: $a = ”text” $a = get-alias * A get-variable valtozonev –vel további, sokkal precízebb műveletek is elvégezhetőek. Megj.: a ${a} is érvényes, azaz a kapcsos zárójelek is használhatóak. Segítségükkel olyan változókat is megfoghatunk, amelyek egyébként érvénytelen néven lettek deklarálva. Escape karakter a ’ (shift+1). Ezzel kiírathatunk lefoglalt karaktereket is pl. dollárjelet: ’$. Magyarázat nélkül próbáljuk ki a következőt: >$a = ”text” >write-output ”Az a nevu valtozo $($a.length) karakterbol all.” Pihenésképpen frissítsük fel DOS/UNIX előéletünket néhány egyszerű, de szerencsére átemelt paranccsal: dir ls copy cd .. mkdir myDir cd myDir cd C:\myDir cd .\myDir history notepad .\test.txt cat .\test.txt del test.txt help help history alias alias | more stb… Csővezetékek használata akár a UNIX –ban. Mielőtt ezerrel nekiállnánk csövezni, bemutatok héhány eszközt, amellyel saját magunk rakhatunk össze cmdlet –eket. Ez roppant hasznos, amennyiben a fent végigolvasott (és természetesen kívülről megtanult ) manual –ban nem találnánk. Az első ilyen egy JOKER változónév a ”$_”. Konkrétan arra jó, hogy a pipe –on érkező objektumokra fog hivatkozni egyesével. Hogy ez mire is használható, rögtön értelmet nyer, amint bevezetjük Foreach-object {} –et, amely talán nem meglepő módon a kiadott utasítást ( a {} zárójelek közötti rész ) fogja végrehajtani az összes érkező objektumon. Pl.: >1,2,3,4,5 | foreach-object{$_ *2} Nem nehéz kitalálni, mi lesz az output. Soronként kiírja az 1-5 számok kétszeresét.
.Net 2 előadás jegyzet – 9. óra
4.oldal
A másik szerkezetet, az un. „szelektáló”: >2,4,6,8 | where-object{$_ -gt 5} A –gt kapcsoló a „greater than” rövidítése. Sajnos nem használhatjuk a szokásos relációs jeleket, hanem a nekik megfelelő rövidítéseket: -gt > -lt < -eq = -ne != -ge >= -le <= Szerencsére nem kell mindig kiírni a foreach-object –et. Helyette a „%” jel használható. ls |% {$_.Length} ls |% {$_.Length} | sort | Measure-Object ls |% {$_.Length} | sort | unique | Measure-Object Ha van egy egész számot tartalmazó first.txt fájlunk: cat first.txt|%{"*"*$_} Ugyanígy a where-object kulcsszó rövidítése egy „?” . Pl. a Windows System32 -ből így szűrhetjük ki a dll -eket: cd C:\WINDOWS\system32 dir | ? {$_.Extension -eq ".dll"} A kimenet formázására való a write-host. Akit érdekel, írja be: >help write-host -full A Select akár az SQL –ben. Megadhatjuk, hogy mely tulajdonságokra vagyunk kíváncsiak: ls | Select FileName ls | Select Name ls | Select LastWriteTime, Name ls | unique Rendezésre is ugyanilyen egyszerűen van lehetőség. ls | select name | sort Minden elérhető objektum kilistázása. Simán ls v* a ’v’ betűvel kezdődő állományokat listázza ki: ls | group -Prop length ls v* | gm Rekurzívan bejárja az alkönyvtárakat, és kilistázza a .cs kiterjesztésű file -okat: ls -Recu *.cs Csoportosításra is van módszer: dir | select extension, name | group extension help group ls | Group-Object -Property Extension Az összes állományt kilistázza kiterjesztés szerint csoportosítva.
.Net 2 előadás jegyzet – 9. óra
5.oldal
Ha elakadtunk: help ls -examples | -full A típus lekérdezésére szolgál a következő parancs: $a.GetType() (a zárójel jelzi, hogy magának az értéknek a típusát kérdezem) Egy Global Unique ID -t így kérhetünk: $a = [Guid]::NewGuid() [Guid]::NewGuid().ToString() [Guid]::NewGuid().ToString().Replace("-", "") Így pl. ha egy file listát kérünk nem egyszerű string -eket kapunk, hanem .NET-es file objektumokat. (Pontosabban Object[] -et kapunk, mert könyvtárak és file -ok is lehetnek egy mappában.) Nem csak értékként kaphatunk vissza objektumokat, mi is létrehozhatunk ilyeneket: $a=[Guid] [datetime]::Now $d=new-object DateTime 1111, 11, 11 Itt $d egy új dátum objektum lesz. Egy objektumnak elkérhetjük az adattagjait is: $A | Get-Members (ps -ProcessName iexplore).GetType() – ha csak egy iexplore process van. A pipe technológia természetesen itt is megvan. Egy éppen futó Internet Explorer adattagjai: ([array](ps -ProcessName iexplore))[0] | gm A tömbök kezelése is nagyon egyszerű, használjuk a @ jelet: $a=@(1,2,3,4,5,6,7) $a=@(1..7) Így tudjuk levenni az első elemét, ha arra van szükségünk: ($b, $c)=$a Ezután a $b-ben lesz $a első eleme, $c-ben pedig a többi. A többi shell -ben egyáltalán nem -vagy csak számottevő szintaktikai terhelés árán- lehet operátorokat használni. Itt: 1+1 >2 Sőt, ezt kiterjesztették különböző adattípusokra is: String többszörözés: ”8”*4 >8888 String konkatenáció): a+1 >a1 A -match reguláris kifejezéseket is tud kezelni. Egy e-mail cím validáció elvégezhető így:
.Net 2 előadás jegyzet – 9. óra
6.oldal
>”[email protected]” –match ”^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[09a-zA-Z]\.)+[a-zA-Z]{2,9})$” Természetesen a jól ismert ciklusok és vezérlő szerkezetek is használhatók: for($i=1;$i -lt 10;$i++) {$_} for($i=1;$i -lt 10;$i++) {$i} $i = 1 while($i –lt 5){”*” * $i; $i++} $a=25 if($a –gt 10) {”nagyobb mint 10”} elseif($a –lt 10) {”kisebb mint 10”} else{”pontosan 10”} switch($a) { {$a –gt 0} {”pozitiv”} {$a –lt 0} {”negativ”} default {”nulla”} } Összegzés, Átlagolás, Minumum, Maximum: cat first.txt | measure-object –Sum Ezzel letölthető egy file a netről: (new-object System.Net.WebClient).DownLoadString() Pl.: $rss = [xml](new-object System.Net.WebClient).DownloadString("http://index.hu/24ora/rss/") $rss.rss.channel.item | select title A .NET -es osztályok integrációjával lehetőség nyíilik paranccssori XML parse -olásra is. A providerek, amik lehetővé teszik, hogy olyan könnyen mozogjunk a registry key -ek közt, mint a meghajtók közt. Tulajdonképpen arról van szó, hogy akár a fájlrendszer, akár a registry bármely bejegyzéséhez társíthatunk egy megszólítást. Eztuán ugyanúgy kezelhető, mintha egy önálló meghajtó lenne: Get-PSDrive Saját PSDrive –ot így hozhatunk létre: >new-psdrive –name MyPS –psprovider registry –root HKEY_CURRENT_USER\Software >cd MyPS: A környezeti változók közt is lépkedhetünk: cd env: dir Az eventlog az események naplózására szolgál. Mind rendszer, mind alkalmazás szintű eseményeket tud rögzíteni. Ehhez a Windows –ban található egy nézegető is, de ha rendszermérnökként használjuk a PowerShell -t, akkor kényelmesebb egy: Get-EventLog Application -newest 100 parancs.
.Net 2 előadás jegyzet – 9. óra
7.oldal
A WMI (Windows Management Instrumentation) a HW és az operációs rendszer beállítására szolgál. Ezek is elérhetőek a Get-WmiObject használatával. Pl: A soros port beállításai: Get-WmiObject Win32_SerialPortSetting COM -os objektumokat is használhatunk a PowerShell -el, pl. egy Internet Explorer ennyibe kerül csak: $ie=new-object -COM "InternetExplorer.Application" $ie.Visible=$true $ie.Navigate2("www.google.com") $ie.Back() $ie | Get-Member Távolról alapban nem lehet PowerShell -parancsot futtatni, csak ha direktben beállítjuk: Set_ExecutionPoilicy RemoteSigned Fóti Marcell előadása: http://www.microsoft.com/hun/dl.aspx?id=021e3c9a-87e9-4dc6-8d7b-9d141217600a További parancspéldák a tárgy honlapján.