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 )
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 <cmdlet> 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. <valami> 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 = <valami> 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.
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.
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.
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:
6.oldal > eha123@inf.elte.hu match ^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-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(<ide jön az URL>) 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.
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.