A Windows PowerShell-ben csakis osztályokkal dolgozhatunk, minden osztály közös őse a System.Object. A C# programozási nyelvvel ellentétben a számok ábrázolásához is a System.Number osztály valamely alosztályát használjuk, nem pedig egy primitív típust.
A Windows PowerShell támogatja az összes .NET szám típust, ahogy ez az alábbi táblázatban látható:
.NET típusnév | Rövid típusnév | Példa |
---|---|---|
System.Int32 | [int] | 42 |
System.Int64 | [long] | 20000000000 |
System.Double | [double] | 4.2 |
System.Decimal | [decimal] | 42d |
System.Byte | [byte] | 2 |
Képesek vagyunk egy változó típusát lekérdezni a getType() metódus segítségével. Példák:
Általában a PowerShell képes kikövetkeztetni egy változó típusát, mint például az alábbi string esetén:
Azonban ha a write-output-nak több mint egy, space-ekkel elválasztott szót adunk meg, a PowerShell az első utáni szavakat argumentumként kezeli:
Ezt a problémát idézőjelek használatával oldhatjuk meg:
A " " egyik előnye, hogy a " "-el hivatkozott változók megőrzik értéküket:
Ha mondjuk a string tartalmaz $ jelet, akkor az a probléma áll elő, hogy a PowerShell változóként próbálja értelmezni és megpróbálja kiírni az így kapott változó értékét:
Ilyenkor kell alkalmaznunk az aposztrófot, melyet felfoghatunk úgy, hogy minden ami aposztrófok között van, az szó szerint értendő:
A Windows PowerShell bool típusának működése elég sokszínű, melyet legjobban az alábbi példákon keresztül lehet bemutatni. A példák során felhasználjuk az alábbi kódot:
A $TRUE és $FALSE érthető módon veszi fel az igaz és hamis értékekeket, a test TRUE esetén a PowerShell a TRUE-t stringként kezeli, és ez esetben ha a string hossza 0, akkor hamis értéket rendel hozzá, egyébként igazat. Mivel a FALSE hossza 5, ezért igaz érték tartozik hozzá.
A PowerShell rendelkezik két beépített változóval is ($true, $false), hogy ezek reprezentálják az igaz és hamis logikai értéket.
A bool változókat használhatjuk annak ellenőrzésére is, hogy deklaráltunk-e egy változót vagy sem.
Amennyiben viszont a példában szereplő $x-nek 0 értéket adunk, a 0 kiértékelése során hamis értéket fogunk visszakapni.
Ezen a problémán úgy segíthetünk, ha a PowerShell-nek kiadjuk a Set-PSDebug -strict utasítást.
A bool érték ezen felhasználási módja mellett a PowerShell készítői az overhead csökkentése miatt döntöttek.
A Windows PowerShell-ben nincs array literál, cast-olással vagy operátorral történő konstrukció segítségével hozhatunk létre tömböket.
Tömb létrehozásának legegyszerűbb módja a vessző ( , ) operátor segítségével az alábbi módon történik: (hasonlít a LISP cons operátorára)
Egy tömb elmeinek elérése a szokásos szintaxissal történik:
Aki ismeri már a PowerShell szintaxisát, az joggal kérdezheti, hogyha a @() nem tömb literál, akkor mégis micsoda. Ennek a kérdésnek a megválaszolásához először a tömbök és a típuskényszerítés viszonyát kell tisztázni.
PowerShell-ben lehetőségünk van skalár objektumokat tömb objektumokká cast-olni:
Azonban ilyen módon nem tudunk többdimenziós tömböket létrehozni:
Az első típuskényszerítés után a másodiknak már sok értelme nincs, újra array típusra cast-olunk, de ettől nem lesz 2 dimenziós tömbünk.
Két dimenziós tömböt a vessző operátor segítségével így hozhatunk létre:
Többdimenziós tömbök esetén nem kell az egyes dimenzióknak azonos hosszúságúnak lennie.
A @( ... ) pedig nem más mint a [array] $( ... ) rövidebb alakja.
Felvetődik a kérdés, hogy a PowerShell készítői miért döntöttek ilyen megoldások mellett. Erre a válasz az, hogy a vessző operátor használatával megpróbálták konzisztenssé tenni a tömbkonstrukciós műveletet a parancsok argumentumainak szintaxisával:
A @ jel használata akkor javasolt, ha pipeline-t használunk értékadás jobb oldalán, ilyenkor a pipeline értékét egy stream-ből veszi ki, emiatt pedig nem tudjuk megmondani, hogy collection-t kapunk-e majd vagy sem. Ha @ jelet használunk, akkor ezzel nem kell törődnünk, mindenképpen egy tömböt kapunk majd.
Típusos tömböket is létrehozhatunk, ilyenkor a tömb elemei csak az adott típusnak megfelelőek lehetnek, azonban ha új elemmel bővítjük a tömböt, annak már bármi lehet a típusa.
Típusos tömböt létrehozhaunk másképp is:
Ilyenkor .NET-es tömböt kapunk, melyet csak az Add művelettel enged bővíteni, így biztos hogy a tömb minden eleme azonos típusú lesz.
A PowerShell 2.0 nagyon támogatja már a név-érték párokból álló tömbök (hashtable, dictionary) használatát, ezért többféle módot is definiál létrehozásukhoz.
Asszociatív tömbben egy kulcs csak egyszer szerepelhet, az elemek lekérdezése. módosítása pedig kézenfekvő.
Asszociatív tömb elemeinek is korlátozhatjuk a lehetséges típusát.
A nyelv által megoldható feladatok nagy részében szükség van a dátumok, időszakok megfelelő kezelésére. Ezért fontos típusává vállik a nyelvnek a [datetime]. Dátum, idő típusú változókat nagyon sokféle módon tudunk létrehozni:
Nagyon sok lehetőség van a dátumok, időpontok manipulálására, módosítására.
Amit fontos megjegyezni, hogy PowerShellben a különböző dátumok ún. ticks-ekben kerülnek tárolásra, ami az időszámításunk óta (nem 1601.01.01. 00:00 óta!) eltelt idő 100 ns-okban.
A PowerShell dinamikusan tipizált nyelv. Ez azt jelenti, hogy nem kell deklaráláskor meghatározni egy változó adattípusát, és az adattípusok automatikusan konvertálódnak, ahogy az a script futása során szükséges. Ha egy változót olyan helyen használunk, ahol a típusa nem megfelelő, a PowerShell automatikusan megpróbálja a megfelelő típusra konvertálni. Ennek egyik oka, hogy a PowerShell a .NET framework-ön kívül Windows Management Instrumenattion (WMI), Component Object Model (COM), ActiveX Data Objects (ADO), Active Directory Service Interfaces (ADSI), Extensible Markup Language (XML) és egyéb objektumokkal is tartja a kapcsolatot.
A PowerShell megpróbál egy közös abszrakciós réteget biztosítani a felhasználó számára, amely lehetővé teszi az objektumok közötti együttműködést függetlenül azok típusától. Ezt a réteget PSObject-nek nevezzük, amely egy közös osztály minden PowerShell objektumhoz történő hozzáféréshez.
Az objektumok típusának megállapításához, dinamikus bővítéséhez a PowerShell az Extended Type System (ETS) rendszert használja. A PowerShell először megpróbálja a beépített konverziós szabályai szerint konvertálni az objektumot, majd ha ez nem sikerül, akkor a custom converter-ekkel próbálja meg a konverziót. Custom converter-eket úgy írhatunk, hogy leszármaztatunk a PSTypeConverter osztályból és megvalósítjuk a megfelelő metódusokat.
Amennyiben az ETS-nek nem sikerül végrehajtania egy konverziót, PSInvalidCastException kivételt dob.
A Types.ps1xml fájl tartalmazza a PowerShell által használt alaptípusok tulajdonságait, ennek szerkesztésével új metódusokat és property-ket lehet hozzájuk adni. A fájl megtalálható a Windows PowerShell telepítési könyvtárában. A szerkesztés előtt mindenképpen készítsünk egy biztonsági másolatot a fájlról, mert módosításával működésképtelenné tehetjük a PowerShellt. Módosítása emiatt ellenjavalt, viszont a szerkezetét mintául véve létrehozhatunk saját, új típusokat tartalmazó ps1xml fájlokat. Amennyiben modosítanánk vagy új ps1xml fájlt hoznánk létre, ki kell adnunk az Update-TypeData %path%\newFile.ps1xml utasítást.
Egy objektum átalakításának további módja az Add-Member cmdlet használata.
Természetesen lehetőségünk van explicit típuskényszerítésre is (cast), ennek a szintaxisa: [típus] $változó
A fenti példában a 42 típusát - mely int32 lett volna - típuskényszerítettük stringre. A konverzió sikerességéről az ETS gondoskodik.
A változók nevei elé $ jelet kell tenni. A PowerShell nem case sensitive. A név betűket, számokat és aláhúzás karaktereket (_) tartalmazhat. Tartalmazhat space-eket is, ekkor kapcsoszárójelek közé tenni a váltóznevet, például a ${Variable with spaces} érvényes változó. Ugyan nincs konvenció a váltózók elnevezésével kapcsolatosan a PowerShell-ben, de érdemes olyan neveket használni, melyek tükrözik a változó jelentését és láthatóságát.
Amikor elindítunk egy PowerShell munkamenetet, jópár változót automatikusan inicializálunk. Ezeket az alábbi módon kérhetjük le:
Ezeket a változókat 2 nagy csoportba sorolhatjuk. Az első csoportba azok a változók tartoznak, melyek az aktuális munkamenetre vonatkozó beállításokat és információkat tartalmazzák. Ezek közül a legfontosabbak az alábbi változók:
A másik csoportba azok a változók tartoznak, melyek a PowerShell működését határozzák meg.
A PowerShell-ben 4 láthatósági szintet különböztetünk meg: lokális, private (zárt hatókör), script, globális.
Amennyiben egy változó nem található meg egy adott hatókörben, a PowerShell a szülő hatókörben próbálja meg megkeresni, ezt pedig egészen addig ismételve, amíg meg nem találja a változót vagy el nem jut a legkülső hatókörig, amiben ha nem találja meg a változót, akkor hibaüzenetet ad.
Változó láthatóságát a "set-variable valtozónév -scope láthatóság" szintaxissal változtathatjuk meg.
A PowerShellben van lehetőségünk változókat írásvédetté és konstanssá tenni. A különbség ezek között az, hogy konstans változót nem tudunk törölni, míg írásvédettet igen. Ezek szintaxisa:
A függvényeket a function kulcsszóval vezetjük be, a paraméterlistát nem kötelező kiírni.
Alapesetben egy függvényből akkor tér vissza a PowerShell, ha elérte a függvény végét. Egy függvényből bármikor visszatérhetünk a return utasítás segítségével.
A return utasításnak megadhatunk visszatérési értéket is:
A PowerShell a függvényeit a function névtérben (namespace) adminisztrálja, melyet map-el egy virtuális "function:" nevű meghajtóra. Ezáltal a függvények adminisztrációja és manipulációja hasonlóképpen végezhető, mint amikor a fájlrendszerrel dolgozunk.
Amennyiben nincs szükségünk egy függvényre, azt eltávolíthatjuk az rm utasítás segítségével, hasonlóképpen, mintha egy fájlt távolítanánk el.
Elég kényelmetlen lenne, ha minden munkamenet során szükséges lenne minden egyes korábban megírt függvényeinket begépelnünk, ezért a függvényeinket lementhetjük .ps1 kiterjesztésű fájlokba. Függvényeket egy fájlból az alábbi módon tölthetünk be:
Betöltés után ismét elérhetjük a függvényt, ha bizonyos korábban megírt függvényeket szeretnénk, hogy a PowerShell automatikusan betöltsön minden munkamenet során, a fenti parancsot a profile.ps1 fájlba kell beírnunk.
Operátor | Hatás |
---|---|
= |
értékadás |
+= |
szokásos += |
-= |
szokásos -= |
*= |
szokásos *= |
/= |
szokásos /= |
%= |
a jobboldallal vett osztási maradékot adja értékül a baloldalnak |
$x++ |
$x = $x + 1 |
$x-- |
$x = $x - 1 |
Természetesen használható a ++$x és --$y, melyek működése megegyezik a C++-ban megszokott viselkedéssel.
Operátor |
Hatás |
---|---|
-and |
logikai és |
-or |
logikai vagy |
-not |
logikai nem |
-xor |
logikai kizáró vagy |
! |
megegyezik a -not operátorral |
Operátor |
Hatás |
---|---|
-band |
bináris és |
-bor |
bináris vagy |
-bxor |
bináris kizáró vagy |
-bnot |
bináris nem |
Operátor |
Hatás |
---|---|
-eq |
egyenlőség vizsgálat (Equals) |
-ne |
nem egyenlő (Not Equal) |
-gt |
nagyobb (Greater Than) |
-ge |
nagyobb egyenlő (Greater Than or Equal To) |
-lt |
kisebb (Less Than) |
-le |
kisebb egyenlő (Less Than or Equal To) |
Talán a legkevésbé ismert operátor a Windows PowerShellben az & operátor, annak ellenére, hogy nagyon hasznos. Egyszerűen fogalmazva, az & operátor segítségével tetszőleges stringet próbálhatunk meg parancsként értelmezni.
Vegyük az alábbi példát:
Ekkor ha egyszerűen csak hivatkozunk a változóra, akkor megjelenítjük az értékét:
Amennyiben viszont alkalmazzuk a & operátort: