A PowerShell tehát a .NET Frameworkre épül, a PowerShell 2.0-hoz a 2.0-ás .NET Framework szükséges, de a PowerShell ISE futtatásához szükséges a .NET 3.51 kiegészítő csomag is. A PowerShell 3 a .NET 4.0-át igényli, a PowerShell 4.0 és 5.0 pedig a .NET 4.5-ös verziót. A PowerShell 7-hez Windows-on nem kell különösebb egyéb előfeltétel a PowerShell 5-höz képest.
Ez .NET-re épülés számos előnnyel jár, főleg, ha azt is tudjuk, hogy a PowerShell objektumokkal dolgozik. Pl. a dir parancsot futtatva nem egyszerűen egy karaktersorozatot kapunk vissza válaszként, hanem a fájlok, alkönyvtárak objektumainak halmazát, un. collection-t, gyűjteményt.
Tehát két megjegyzendő fogalom: OBJEKTUM, GYŰJTEMÉNY!
Mi az, hogy objektum ? Olyan képződmény, amely tulajdonság okkal (property) és meghívható metódus okkal (method) rendelkezik.
A hagyományos shellek (command.com, cmd.exe, bash, stb.) mindegyikét karakterlánc-orientáltnak nevezhetjük; a parancsok bemenete és kimenete (néhány speciális esetet nem számítva) karakterláncokból áll. Például a cmd.exe esetén a dir parancs kimenete valóban és pontosan az a fájl- és mappalistát leíró karaktersorozat, amely a képernyőn megjelenik, se több, se kevesebb. Ez bizonyos szempontból jó, hiszen így azt látjuk, amit kapunk. Másrészről viszont csak azt kapjuk, amit látunk, ez pedig sajnos nem túl sok. A PowerShell adatkezelése azonban alapjaiban különbözik ettől; az egyes parancsok bemenete és kimenete is .NET osztályokon alapuló objektumokból (objektumreferenciákból) áll, vagyis a kiírtakon kívül tartalmazza a .NET objektum számtalan egyéb tulajdonságát is. Amint láthattuk, a dir parancs kimenete itt is a képernyőre kiírt fájl és mappalistának tűnik, de ez csak egyszerű érzéki csalódás, a kimenet valójában egy System.IO.DirectoryInfo és System.IO.FileInfo osztályú objektumokból álló gyűjtemény. Mivel azonban az objektumok nem alkalmasak emberi fogyasztásra, képernyőn való megjelenítésük természetesen szöveges formában, legfontosabb (illetve kiválasztott) jellemzőik felsorolásával történik.
A fentiekből nyilvánvalóan következik az objektumorientált megközelítés két fontos előnye; egyrészt a parancsok kimenete rengeteg információt tartalmaz, amelyeket szükség esetén felhasználhatunk, másrészt nincs szükség szövegfeldolgozó parancsok és eszközök használatára, ha a kimenetként kapott adathalmazból csak egy meghatározott információdarabra van szükségünk, mivel minden egyes adatmező egyszerűen a nevére való hivatkozással, önállóan is lekérdezhető. Képzeljük el például, hogy a dir parancs által produkált fenti listából szövegfeldolgozó parancsokkal kell kiválasztanunk azokat a fájlokat (mappákat nem), amelyek 2007. április 12-e után módosultak. Jaj. Persze megoldható a feladat, de helyesen fog lefutni az a szkript egy német nyelvű Windowson is? (És akkor például a kínai nyelvű rendszerekről még nem is beszéltünk.) Ha viszont a kimenet objektumokból áll, akkor természetesen egyáltalán nincs szükség a megjelenő szöveg feldolgozására, mert minden egyes objektum „tudja” magáról, hogy ő fájl, vagy mappa, és az operációs rendszer nyelvétől függetlenül, DateTime objektumként adja vissza az utolsó módosításának idejét.
Most egyelőre - különösebb magyarázat nélkül - nézzük, hogy egy fájl milyen objektumjellemzőkkel, tagjellemzőkkel (member) bír, a get-member cmdlet futtatásával:
[2] PS C:\> get-item szamok.txt | get-member
TypeName: System.IO.FileInfo
Name MemberType Definition
---- ---------- ----------
AppendText Method System.IO.StreamWriter AppendTe...
CopyTo Method System.IO.FileInfo CopyTo(Strin...
Create Method System.IO.FileStream Create()
...
Delete Method System.Void Delete()
...
MoveTo Method System.Void MoveTo(String destF...
...
Attributes Property System.IO.FileAttributes Attrib...
CreationTime Property System.DateTime CreationTime {g...
CreationTimeUtc Property System.DateTime CreationTimeUtc...
Directory Property System.IO.DirectoryInfo Directo...
DirectoryName Property System.String DirectoryName {get;}
Exists Property System.Boolean Exists {get;}
Extension Property System.String Extension {get;}
FullName Property System.String FullName {get;}
IsReadOnly Property System.Boolean IsReadOnly {get;...
LastAccessTime Property System.DateTime LastAccessTime ...
LastAccessTimeUtc Property System.DateTime LastAccessTimeU...
LastWriteTime Property System.DateTime LastWriteTime {...
LastWriteTimeUtc Property System.DateTime LastWriteTimeUt...
Length Property System.Int64 Length {get;}
Name Property System.String Name {get;}
BaseName ScriptProperty System.Object BaseName {get=[Sy...
Mode ScriptProperty System.Object Mode {get=$catr =...
ReparsePoint ScriptProperty System.Object ReparsePoint {get...
Mint ahogy egy fájltól elvárhatjuk, másolhatjuk (CopyTo), törölhetjük (Delete) és egy csomó jellemzőjét kiolvashatjuk: utolsó hozzáférés idejét (LastAccessTime) és hosszát (Length). Azaz ezekhez a tevékenységekhez nem kell külső program, még csak külön PowerShell parancs sem feltétlenül kellene, maga az objektum tudja ezeket.
Pl. a törlés:
[3] PS C:\> (get-item szamok.txt).Delete()
A kényelmesebb használat érdekében azonban a leggyakoribb műveletekre van PowerShell parancs is, ezeket látni fogjuk később.
Visszatérve pl. a dir parancs futtatására, általában egy könyvtárban nem egy fájl vagy alkönyvtár van, hanem több. Ebben az esetben a PowerShell a parancs végrehajtása során egy un. collection-t, azaz egy objektumhalmazt, objektumgyűjteményt vagy más kifejezéssel objektumtömböt kapunk vissza. Ennek a halmaznak ráadásul nem feltétlenül kell egyforma típusú elemekből állnia, mint ahogy egy könyvtárban is lehetnek fájlok is és alkönyvtárak is. A PowerShell az ilyen collection-ök, azaz gyűjtemények feldolgozására nagyon sok praktikus, nyelvi szintű támogatást ad, amit a későbbiekben látni fogunk.