A PowerShell programozási nyelv

Alprogramok, modulok

Szintaxis

Akárcsak C#-ban, itt is csak függvényeink vannak.

A függvényeket a function kulcsszóval vezetjük be, a paraméterlistát nem kötelező kiírni.

PS C:\Users\Administrator> function sayHello { "Hello World" } PS C:\Users\Administrator> sayHello Hello World

Paraméterátadás

A következő példában definiálunk egy olyan függvényt, melyhez nem adunk meg paraméterlistát, majd pedig a törzsében felhasználunk néhány paramétert. A PowerShell minden függvény hívásakor a $args változóban tárolja az argumentumokat.

function multiplyNumbers { "Number of parameters = " + $args.count $args[0] * $args[1] }

Két paraméterrel meghívva a függvényt:

PS C:\Users\Administrator> multiply_numbers 4 2 Number of parameters = 2 8

Természetesen a paraméterlista elhagyása nagyobb függvények megírásakor zavaróvá válik, illetve rontja a kód olvashatóságát is. Van lehetőségünk paraméterlistát írni, illetve a paramétereknek kezdőértéket adni.

function names ($firstname = "John", $lastname = "Doe") { "First name is $firstname" "Last name is $lastname" }

Ekkor ha nem elegendő számú paraméterrel hívjuk meg a függvényt, akkor a hiányzó paraméterek a megadott kezdőértéket fogják felvenni.

PS C:\Users\Administrator> names First name is John Last name is Doe PS C:\Users\Administrator> names John Smith First name is John Last name is Smith

Az alábbi módon is átadhatunk paramétereket egy függvénynek:

PS C:\Users\Administrator> names -lastname Smith -firstname John First name is John Last name is Smith

Alapesetben a PowerShell, ha nem megfelelő típusú paramétert kap, akkor megpróbálkozik a paraméter konverziójával:

function multiply ($value1, $value2) { "Calculating" $value1 * $value2 }

PS C:\Users\Administrator> multiply 2 "004" Calculating 8

Természetesen ha nem sikerül a konverzió, akkor hibaüzenetet kapunk, de sajnos a függvény lefut:

PS C:\Users\Administrator> multiply 2 four Calculating Cannot convert value "four" to type "System.Int32". Error: "Input string was not in a correct forma t." At line:4 char:11 + $value1 * <<<< $value2

Amennyiben a függvény paramétereit típuskényszerítjük (cast-oljuk), akkor ha nem megfelelő paraméterrel hívjuk meg (olyannal, amit nem lehet konvertálni a megfelelő paraméterre), akkor nem fut le a függvény.

function multiply ([int32] $value1, [int32] $value2) { "Calculating" $value1 * $value2 }

PS C:\Users\Administrator> multiply 2 four multiply : Cannot convert value "four" to type "System.Int32". Error: "Input string was not in a correct format." At line:1 char:9 + multiply <<<< 2 "four"

Pipeline függvényparaméterként

Ha pipeline kimenetet szeretnénk függvényparaméterként használni, akkor egy foreach ciklussal kell bejárnunk a $input változót, mely minden függvényhez automatikusan generálódik és tartalmazza a pipeline-ból érkező adatokat.

function fileLengths { foreach ($file in $input) { "Filename: " + $file + " Length: " + $file.length } }

PS C:\Users\Administrator> dir *.txt | fileLengths Filename: C:\Users\Administrator\data.txt Length: 42 Filename: C:\Users\Administrator\error.txt Length: 1222 Filename: C:\Users\Administrator\output.txt Length: 1645

Kapcsoló függvényparaméterként

Függvényeinknek megadhatunk kapcsolókat is az alábbi módon:

function functionWithSwitch([switch]$something) { if($something){ "Something switch triggered!" } "Doing work here..." }

Túlterhelés

A Windows PowerShell nem támogatja a függvények túlterhelését:

PS C:\Users\Administrator> function f { "function f" } PS C:\Users\Administrator> f function f PS C:\Users\Administrator> function f($something) { "$something" } PS C:\Users\Administrator> f PS C:\Users\Administrator> f hello hello

Ha két függvény neve megegyezik, akkor a legutoljára megadott függvény lesz érvényben, a "dir function:" parancs (vagy a "dir function:/függvény neve") kiadásával nézhetjük meg az aktuálisan érvényes függvényeket és azok törzsét.

Rekurzió

A PowerShellben van lehetőségünk rekurzió írására:

PS C:\Users\Administrator> function f { f } PS C:\Users\Administrator> f The script failed due to call depth overflow. The call depth reached 101 and the maximum is 100.

A hívási mélység korlátozását nincs lehetőségünk átállítani, ez pedig behatárolja a lehetőségeinket:

function fact( $x ) { ( ?: { $x -lt 2 } { return 1} { $x * ( fact ($x -1) ) } ) }

A fenti faktoriális-számító kód például emiatt a 100-as korlát miatt nem fog lefutni 150-re.

Modulok

A PowerShell 2.0 már alapvetően moduláris szerkezetű, szakítva az 1.0-as Snap-In-ekre épülő rendszerrel.

Egy Snap-In importálása körülményes, ráadásul csak cmdleteket és providereket tartalmazhat. Egy modul ezen felül tartalmazhat egyéb PowerShell elemeket, például függvényeket, változókat különböző aliasokat és PowerShell drive-okat. A modulok lehetőséget adnak rá, hogy könnyedén csomagba szervezzük a parancsainkat és megosszuk őket másokkal, illetve mások által írt modulokat úgy használhatunk, mintha beépített parancsok lennének.

Modulok használata

Egy modul használatához a következőket kell tenni:

Modulok telepítése

A modul általában egy könyvtárból áll, benne fájlokkal. Ezt telepítenünk kell, mielőtt importálni tudnánk PowerShellben. A legtöbb modul rendelkezik saját telepítővel, ha mégsem akkor kézzel kell telepítenünk. Ezt a legkönnyebben úgy tehetjük meg, hogy bemásoljuk a modul könyvtárát a felhasználói fiókunk alapértelmezett könyvtárán belüli Modules könyvtárba (Ha ilyen nincs, hozzuk létre). Nagyon sok modul már alapértelmezetten telepítve van számunkra. Például Windows 7 operációs rendszeren a következő három modul a legtöbb esetben alapértelmezetten elérhető:

Hogy konkrétan mely modulok elérhetőek (vagyis telepítettek, de nem importáltak), nagyban függ attól, hogy milyen programokat telepítettünk az operációs rendszerünkre. Az elérhető modulok listáját a következő parancs hatására kaphatjuk meg:

PS C:\Users\Administrator> Get-Module -ListAvailable

Modulok importálása

Ahhoz, hogy használhassuk egy modul nyújtotta parancsokat, importálnunk kell. Egy már telepített modul importálását az aktuális shellbe a következőképp tehetjük meg például:

PS C:\Users\Administrator> Import-Module BitsTransfer

Ha az összes elérhető modult szeretnénk importálni az aktuális shellbe, több lehetőség közül is választhatunk. Vagy a PowerShell ikonjának almenüjéből kiválasztjuk az "Import system modules" opciót, vagy a következő parancsot gépeljük be:

PS C:\Users\Administrator> Get-Module -listAvailable | Import-Module

Ha azt szeretnénk, hogy a moduljaink az összes elindított shellben elérhetőek legyenek, hozzá kell adnunk a Windows PowerShell profilunkhoz az Import-Module utasítást.

Modulon belüli parancsok

Egy moodul által tartalmazott parancsok listáját a következőképpen kaphatjuk meg:

PS C:\Users\Administrator> Get-Command -Module BitsTransfer

Természetesen a parancsok használatához is kaphatunk segítséget, a már megszokott get-help használatával.

PS C:\Users\Administrator> Get-Help Start-BitsTransfer -detailed

Modul eltávolítása

Ha eltávolítunk egy modult, az általa nyújtott parancsok többé nem lesznek használhatóak.

PS C:\Users\Administrator> Remove-Module BitsTransfer