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.
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.
Két paraméterrel meghívva a függvényt:
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.
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.
Az alábbi módon is átadhatunk paramétereket egy függvénynek:
Alapesetben a PowerShell, ha nem megfelelő típusú paramétert kap, akkor megpróbálkozik a paraméter konverziójával:
Természetesen ha nem sikerül a konverzió, akkor hibaüzenetet kapunk, de sajnos a függvény lefut:
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.
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.
Függvényeinknek megadhatunk kapcsolókat is az alábbi módon:
A Windows PowerShell nem támogatja a függvények túlterhelését:
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.
A PowerShellben van lehetőségünk rekurzió írására:
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:
A fenti faktoriális-számító kód például emiatt a 100-as korlát miatt nem fog lefutni 150-re.
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.
Egy modul használatához a következőket kell tenni:
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:
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:
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:
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.
Egy moodul által tartalmazott parancsok listáját a következőképpen kaphatjuk meg:
Természetesen a parancsok használatához is kaphatunk segítséget, a már megszokott get-help használatával.
Ha eltávolítunk egy modult, az általa nyújtott parancsok többé nem lesznek használhatóak.