Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

A parancsok szöveges kimenete a PowerShell értelmező ablakban csak egy módja annak, hogy az információkat emberi észlelésnek megfelelő formában jelenítsük meg. Valójában szerdán orientált objektumokkal való munkavégzésre: a parancsmagok és a függvények bemenetként fogadják és visszatért a kijáraton, valamint az interaktívan és szkriptekben elérhető változótípusok .NET osztályokon alapulnak. A sorozat negyedik cikkében részletesebben tanulmányozzuk a tárgyakkal való munkát.

Tartalomjegyzék:

Objektumok a PowerShellben
Az objektumok szerkezetének megtekintése
Objektumok szűrése
Tárgyak rendezése
Objektumok és részeik kiválasztása
ForEach-Object, Group-Object és Measure-Object
.NET és COM objektumok létrehozása (New-Object)
Statikus módszerek hívása
Írja be a PSCustomObject parancsot
Saját osztályok létrehozása

Objektumok a PowerShellben

Emlékezzünk vissza, hogy az objektum adatmezők (tulajdonságok, események stb.) és ezek feldolgozására szolgáló módszerek (metódusok) gyűjteménye. Felépítését típus határozza meg, amely általában az egységes .NET Core platformban használt osztályokon alapul. COM, CIM (WMI) és ADSI objektumokkal is lehet dolgozni. Tulajdonságokra és metódusokra van szükség az adatokon végzett különféle műveletek végrehajtásához, emellett a PowerShellben az objektumok argumentumként adhatók át függvényeknek és parancsmagoknak, értékeik hozzárendelhetők a változókhoz, és van még parancsösszeállítási mechanizmus (szállítószalag vagy csővezeték). A folyamat minden egyes parancsa objektumról objektumra továbbítja a kimenetét a következőnek. Használhat összeállított parancsmagokat a feldolgozáshoz, vagy létrehozhat sajátot fejlett funkciókkülönféle manipulációkat végezni a folyamatban lévő objektumokkal: szűrést, rendezést, csoportosítást, sőt szerkezetük megváltoztatását is. Az ilyen formában történő adattovábbításnak komoly előnye van: a fogadó csapatnak nem kell a bájtfolyamot (szöveget) elemeznie, a megfelelő tulajdonságok és metódusok meghívásával minden szükséges információ könnyen visszakereshető.

Az objektumok szerkezetének megtekintése

Például futtassuk a Get-Process parancsmagot, amely lehetővé teszi, hogy információkat szerezzen a rendszerben futó folyamatokról:

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Néhány formázott szöveges adatot jelenít meg, amelyek nem adnak fogalmat a visszaadott objektumok tulajdonságairól és metódusairól. A kimenet finomhangolásához meg kell tanulnunk megvizsgálni az objektumok szerkezetét, és a Get-Member parancsmag ebben segít:

Get-Process | Get-Member

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Itt már látjuk a típust és a szerkezetet, és további paraméterek segítségével például csak a bemenetben szereplő objektum tulajdonságait tudjuk megjeleníteni:

Get-Process | Get-Member -MemberType Property

Ezekre az ismeretekre szükség lesz az adminisztrációs problémák interaktív megoldásához, vagy saját szkriptek írásához: például ahhoz, hogy információkat szerezzen a felfüggesztett folyamatokról a Responding tulajdonság segítségével.

Objektumok szűrése

A PowerShell lehetővé teszi bizonyos feltételeknek megfelelő objektumok áthaladását egy folyamaton:

Where-Object { блок сценария }

A zárójelben lévő szkriptblokk végrehajtásának logikai értéknek kell lennie. Ha igaz ($true), akkor a Where-Object parancsmagba bevitt objektum a folyamat mentén kerül átadásra, ellenkező esetben ($false) törlődik. Például jelenítsük meg a leállított Windows Server szolgáltatások listáját, pl. azok, amelyek Állapot tulajdonsága „Leállítva”:

Get-Service | Where-Object {$_.Status -eq "Stopped"}

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Itt is egy szöveges ábrázolást látunk, de ha meg akarjuk érteni a csővezetéken áthaladó objektumok típusát és belső szerkezetét, akkor ez nem nehéz:

Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Tárgyak rendezése

Az objektumok csővezetékes feldolgozása során gyakran szükség van azok rendezésére. A Sort-Object parancsmag átadja a tulajdonságok (rendezési kulcsok) nevét, és értékeik szerint rendezett objektumokat ad vissza. A futó folyamatok kimenetét könnyű rendezni a CPU eltöltött ideje (cpu tulajdonság) szerint:

Get-Process | Sort-Object –Property cpu

A -Property paraméter elhagyható a Sort-Object parancsmag meghívásakor; alapértelmezés szerint ez használatos. Fordított rendezéshez használja a -Descending paramétert:

Get-Process | Sort-Object cpu -Descending

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Objektumok és részeik kiválasztása

A Select-Object parancsmag lehetővé teszi egy adott számú objektum kiválasztását a folyamat elején vagy végén a -First vagy -Last paraméterek használatával. Segítségével egyedi objektumokat vagy bizonyos tulajdonságokat választhat ki, és ezek alapján új objektumokat is létrehozhat. Nézzük meg, hogyan működik a parancsmag egyszerű példák segítségével.

A következő parancs információkat jelenít meg a 10 folyamatról, amelyek a maximális mennyiségű RAM-ot fogyasztják (WS tulajdonság):

Get-Process | Sort-Object WS -Descending | Select-Object -First 10

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

A folyamaton áthaladó objektumok csak bizonyos tulajdonságait választhatja ki, és ezek alapján hozhat létre újakat:

Get-Process | Select-Object ProcessName, Id -First 1

A folyamat eredményeként egy új objektumot kapunk, melynek szerkezete eltér a Get-Process cmdlet által visszaadott struktúrától. Ellenőrizzük ezt a Get-Member segítségével:

Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Vegye figyelembe, hogy a Select-Object egyetlen objektumot ad vissza (-First 1), amely csak kettővel rendelkezik az általunk megadott mezők közül: az értékeket a Get-Process parancsmag által a folyamatba átadott első objektumról másolták át. Az objektumok PowerShell-szkriptekben való létrehozásának egyik módja a Select-Object használatán alapul:

$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

A Select-Object használatával kiszámított tulajdonságokat adhat hozzá azokhoz az objektumokhoz, amelyeket így kell ábrázolni hash táblázatok. Ebben az esetben az első kulcs értéke megfelel a tulajdonság nevének, a második kulcs értéke pedig az aktuális folyamatelem tulajdonságértékének:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Nézzük meg a szállítószalagon áthaladó tárgyak szerkezetét:

Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

ForEach-Object, Group-Object és Measure-Object

Vannak más parancsmagok is az objektumokkal való munkavégzéshez. Példaként beszéljünk a három leghasznosabbról:

ForEach-Object lehetővé teszi a PowerShell kód futtatását a folyamatban lévő minden objektumhoz:

ForEach-Object { блок сценария }

Csoport-objektum az objektumokat tulajdonságérték szerint csoportosítja:

Group-Object PropertyName

Ha a -NoElement paraméterrel futtatod, akkor megtudhatod, hány elem van a csoportokban.

Mérték-objektum különböző összefoglaló paramétereket összesít a folyamatban lévő objektummezőértékek szerint (kiszámolja az összeget, és megtalálja a minimális, maximális vagy átlagos értéket is):

Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum

A tárgyalt parancsmagokat általában interaktívan használják, és gyakran szkriptekben hozzák létre. funkciók Begin, Process és End blokkokkal.

.NET és COM objektumok létrehozása (New-Object)

Számos .NET Core és COM interfésszel rendelkező szoftverösszetevő hasznos a rendszergazdák számára. A System.Diagnostics.EventLog osztály használatával a rendszernaplókat közvetlenül a Windows PowerShellből kezelheti. Nézzünk egy példát az osztály példányának létrehozására a New-Object parancsmag használatával a -TypeName paraméterrel:

New-Object -TypeName System.Diagnostics.EventLog

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Mivel nem adtunk meg konkrét eseménynaplót, az osztály eredményül kapott példánya nem tartalmaz adatokat. Ennek megváltoztatásához meg kell hívni egy speciális konstruktor metódust annak létrehozása során az -ArgumentList paraméter segítségével. Ha hozzá akarunk férni az alkalmazásnaplóhoz, az "Application" karakterláncot kell átadnunk argumentumként a konstruktornak:

$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Felhívjuk figyelmét, hogy a parancs kimenetét a $AppLog változóba mentettük. Bár a folyamatokat általában interaktív módban használják, a szkriptek írásához gyakran szükség van egy objektumra való hivatkozás fenntartására. Ezenkívül az alapvető .NET Core osztályok a System névtérben találhatók: a PowerShell alapértelmezés szerint meghatározott típusokat keres benne, így a Diagnostics.EventLog írása a System.Diagnostics.EventLog helyett teljesen helyes.

A naplóval való munkavégzéshez használhatja a megfelelő módszereket:

$AppLog | Get-Member -MemberType Method

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Tegyük fel, hogy a Clear() metódus törli, ha vannak hozzáférési jogok:

$AppLog.Clear()

A New-Object parancsmag COM-összetevőkkel is működik. Elég sok van belőlük – a Windows script szerverrel szállított könyvtáraktól az ActiveX alkalmazásokig, például az Internet Explorerig. COM objektum létrehozásához be kell állítania a -ComObject paramétert a kívánt osztály programozott ProgId-jével:

New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject

Ha tetszőleges szerkezetű objektumokat szeretne létrehozni, a New-Object használata túl archaikusnak és nehézkesnek tűnik; ez a parancsmag a PowerShell-en kívüli szoftverkomponensekkel való együttműködésre szolgál. A következő cikkekben ezt a kérdést részletesebben tárgyaljuk. A .NET és COM objektumok mellett a CIM (WMI) és ADSI objektumokat is megvizsgáljuk.

Statikus módszerek hívása

Egyes .NET Core osztályok, köztük a System.Environment és a System.Math nem példányosíthatók. Ők statikus és csak statikus tulajdonságokat és módszereket tartalmaznak. Ezek lényegében referenciakönyvtárak, amelyeket objektumok létrehozása nélkül használnak. A statikus osztályra literálon keresztül hivatkozhat, ha a típus nevét szögletes zárójelbe teszi. Ha azonban az objektum szerkezetét a Get-Member segítségével nézzük, akkor a System.RuntimeType típust fogjuk látni a System.Environment helyett:

[System.Environment] | Get-Member

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Ha csak statikus tagokat szeretne megtekinteni, hívja a Get-Membert a -Static paraméterrel (figyelje meg az objektum típusát):

[System.Environment] | Get-Member -Static

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

A statikus tulajdonságok és módszerek eléréséhez használjon két egymást követő kettőspontot a literál utáni pont helyett:

[System.Environment]::OSVersion

Vagy

$test=[System.Math]::Sqrt(25) 
$test
$test.GetType()

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Írja be a PSCustomObject parancsot

A PowerShellben elérhető számos adattípus közül érdemes megemlíteni a PSCustomObject-et, amely tetszőleges szerkezetű objektumok tárolására szolgál. Egy ilyen objektum létrehozása a New-Object parancsmag használatával klasszikus, de nehézkes és elavult módszer:

$object = New-Object  –TypeName PSCustomObject -Property @{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'}

Nézzük az objektum szerkezetét:

$object | Get-Member

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

A PowerShell 3.0-tól kezdve egy másik szintaxis is elérhető:

$object = [PSCustomObject]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

Az adatokhoz az alábbi módon férhet hozzá:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Íme egy példa egy meglévő hashtable objektummá konvertálására:

$hash = @{'Name'='Ivan Danko'; 'City'='Moscow'; 'Country'='Russia'}
$hash.GetType()
$object = [pscustomobject]$hash
$object.GetType()

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Az ilyen típusú objektumok egyik hátránya, hogy tulajdonságaik sorrendje változhat. Ennek elkerülése érdekében az [ordered] attribútumot kell használnia:

$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko'; 
                                          City = 'Moscow';
                                          Country = 'Russia'
}

Vannak más lehetőségek is az objektum létrehozására: fentebb a cmdlet használatát néztük meg Select-Object. Már csak az elemek hozzáadását és eltávolítását kell kitalálnia. Ennek az előző példában szereplő objektumhoz történő végrehajtása meglehetősen egyszerű:

$object | Add-Member –MemberType NoteProperty –Name Age  –Value 33
$object | Get-Member

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Az Add-Member parancsmag segítségével nemcsak tulajdonságokat, hanem metódusokat is hozzáadhat egy korábban létrehozott $objektumhoz a "-MemberType ScriptMethod" konstrukció segítségével:

$ScriptBlock = {
    # код 
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member

Kérjük, vegye figyelembe, hogy az új metódus kódjának tárolására a ScriptBlock típusú $ScriptBlock változót használtuk.

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

A tulajdonságok eltávolításához használja a megfelelő módszert:

$object.psobject.properties.remove('Name')

Saját osztályok létrehozása

A PowerShell 5.0 bevezette a definiálás lehetőségét osztályok az objektumorientált programozási nyelvekre jellemző szintaxis használatával. Erre szolgál a Class szolgáltatás szó, amely után meg kell adni az osztály nevét, és operátori zárójelben kell leírni a törzsét:

class MyClass
{
    # тело класса
}

Ez egy igazi .NET Core típus, amelynek törzse leírja tulajdonságait, metódusait és egyéb elemeit. Nézzünk egy példát a legegyszerűbb osztály meghatározására:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
}

Objektum (osztálypéldány) létrehozásához használja a parancsmagot Új-Object, vagy a [MyClass] típusú literál és pszeudosztatikus módszer új (alapértelmezett konstruktor):

$object = New-Object -TypeName MyClass

vagy

$object = [MyClass]::new()

Elemezzük az objektum szerkezetét:

$object | Get-Member

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Ne feledkezzünk meg a hatókörről: nem hivatkozhatunk egy típusnévre karakterláncként, és nem használhatunk típusliterált azon a szkripten vagy modulon kívül, amelyben az osztály definiálva van. Ebben az esetben a függvények olyan osztálypéldányokat (objektumokat) adhatnak vissza, amelyek a modulon vagy a parancsfájlon kívül lesznek elérhetők.

Az objektum létrehozása után töltse ki a tulajdonságait:

$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Vegye figyelembe, hogy az osztályleírás nemcsak a tulajdonságtípusokat, hanem azok alapértelmezett értékeit is megadja:

class Example
{
     [string]$Name = 'John Doe'
}

Az osztálymetódus leírása hasonlít egy függvény leírására, de a függvényszó használata nélkül. A függvényekhez hasonlóan a paramétereket szükség esetén adjuk át a metódusoknak:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     #описание метода
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

Most már osztályunk képviselője tudja, hogyan kell mosolyogni:

$object = [MyClass]::new()
$object.Smile($true)

A módszerek túlterhelhetők, ráadásul egy osztálynak van statikus tulajdonságok és módszerek, valamint olyan konstruktorok, amelyek neve egybeesik magának az osztálynak a nevével. Egy szkriptben vagy PowerShell-modulban definiált osztály egy másik alapjaként szolgálhat – így valósul meg az öröklődés. Ebben az esetben megengedett a meglévő .NET osztályok használata alapként:

class MyClass2 : MyClass
{
      #тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)

A PowerShell objektumokkal való munkavégzéséről szóló leírásunk aligha kimerítő. A következő kiadványokban gyakorlati példákkal igyekszünk elmélyíteni: a sorozat ötödik cikke a PowerShell harmadik féltől származó szoftverkomponensekkel való integrálásának kérdéseivel foglalkozik. A korábbi részek az alábbi linkeken érhetők el.

1. rész: Alapvető Windows PowerShell-szolgáltatások
2. rész: Bevezetés a Windows PowerShell programozási nyelvbe
3. rész: paraméterek átadása szkripteknek és függvényeknek, parancsmagok létrehozása

Mi az a Windows PowerShell és mire használják? 4. rész: Munka objektumokkal, saját osztályok

Forrás: will.com

Hozzászólás