Architektúra

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.



Word To HTML Converter