Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Ieșirea textului comenzilor în fereastra interpreterului PowerShell este doar un mod de a afișa informații într-un format ușor de înțeles pentru oameni. De fapt, mediul este orientat este destinat lucrului cu obiecte: cmdleturile și funcțiile le primesc ca input și le returnează ca output, iar tipurile de variabile disponibile atât în modul interactiv, cât și în scripturi se bazează pe clasele .NET. În articolul patru din serie, vom explora mai detaliat lucrul cu obiectele.

Cuprins:

Obiectele în PowerShell
Vizualizarea structurii obiectelor
Filtrarea obiectelor
Sortarea obiectelor
Selectarea obiectelor și a părților lor
ForEach-Object, Group-Object și Measure-Object
Crearea obiectelor .NET și COM (New-Object)
Invocarea metodelor statice
Tipul PSCustomObject
Crearea propriilor clase

Obiectele în PowerShell

Să ne amintim că un obiect este o combinație de câmpuri de date (proprietăți, evenimente etc.) și metode de procesare a acestora. Structura sa este determinată de tipul care se bazează, de obicei, pe clasele utilizate în platforma unificată .NET Core. Există, de asemenea, posibilitatea de a lucra cu obiecte COM, CIM (WMI) și ADSI. Proprietățile și metodele sunt necesare pentru a efectua diferite acțiuni asupra datelor, iar în PowerShell obiectele pot fi transmise ca argumente funcțiilor și cmdlet-urilor, pot avea valorile lor atribuite variabilelor, iar există un mecanism de compunere a comenzilor (conductă sau pipeline). Fiecare comandă din conductă transmite output-ul său următoarei în ordine — obiect cu obiect. Pentru procesare, se pot folosi cmdleturi compilate sau se pot crea funcții extinse, pentru a efectua diverse manipulări cu obiectele în conductă: filtrare, sortare, grupare și chiar modificarea structurii lor. Transmiterea datelor în acest mod are un avantaj major: comanda care primește nu trebuie să se ocupe de analiza sintactică a fluxului de biți (text), toată informația necesară este ușor de extras prin accesarea proprietăților și metodelor corespunzătoare.

Vizualizarea structurii obiectelor

Ca exemplu, să rulăm cmdletul Get-Process, care permite obținerea informațiilor despre procesele care rulează în sistem:

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Acesta va afișa pe ecran unele date text formatate, care nu oferă o imagine clară a proprietăților obiectelor returnate și a metodelor lor. Pentru a analiza fin output-ul, trebuie să învățăm să explorăm structura obiectelor, iar în acest sens ne va ajuta cmdletul Get-Member:

Get-Process | Get-Member

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Aici vedem deja tipul și structura, iar cu ajutorul unor parametri suplimentari, putem, de exemplu, să afișăm doar proprietățile obiectului care a intrat în funcție:

Get-Process | Get-Member -MemberType Property

Aceste cunoștințe vor fi necesare pentru a rezolva sarcinile de administrare în modul interactiv sau pentru a scrie scripturi proprii: să zicem, pentru a obține informații despre procesele blocate prin proprietatea Responding.

Filtrarea obiectelor

PowerShell permite să transmiteți prin conductă obiecte care îndeplinesc o anumită condiție:

Where-Object { blokul scriptului }

Rezultatul executării blocului de script în parantezele operatorului trebuie să fie o valoare logică. Dacă este adevărat ($true), obiectul care a intrat în comanda Where-Object va fi transmis mai departe prin conductă, în caz contrar (valoarea $false) va fi eliminat. De exemplu, să afișăm lista serviciilor Windows Server oprite, adică cele pentru care proprietatea Status are valoarea „Stopped”:

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Aici vedem din nou o reprezentare textuală, dar dacă dorim să înțelegem tipul și structura internă a obiectelor care trec prin conductă, nu este greu:

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Sortarea obiectelor

În timpul procesării prin conductă a obiectelor, apare adesea necesitatea de a le sorta. Comanda Sort-Object primește numele proprietăților (cheile de sortare), iar aceasta returnează obiectele ordonate după valorile lor. Rezultatul proceselor active poate fi ușor sortat după timpul de CPU consumat (proprietatea cpu):

Get-Process | Sort-Object –Property cpu

Parametrul -Property la apelarea comenzii Sort-Object poate fi omis - este utilizat implicit. Pentru sortarea inversă se folosește parametrul -Descending:

Get-Process | Sort-Object cpu -Descending

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Selectarea obiectelor și a părților lor

Comanda Select-Object permite selectarea unui anumit număr de obiecte la începutul sau la sfârșitul conductei utilizând parametrii -First sau -Last. Cu ajutorul acesteia, putem selecta obiecte individuale sau proprietăți specifice, precum și să creăm noi obiecte pe baza lor. Vom analiza funcționarea comenzii cu exemple simple.

Următoarea comandă afișează informații despre 10 procese care consumă cea mai mare cantitate de memorie RAM (proprietatea WS):

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Putem selecta doar anumite proprietăți ale obiectelor care trec prin conductă și să creăm noi obiecte pe baza acestora:

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

Ca urmare a funcționării conductei, vom obține un nou obiect, a cărui structură va diferi de structura returnată de comanda Get-Process. Să ne asigurăm de acest lucru cu ajutorul Get-Member:

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Observați că Select-Object returnează un singur obiect (-First 1), care are doar două câmpuri specificate de noi: valorile lor au fost copiate din primul obiect transmis conductei de comanda Get-Process. Folosirea Select-Object stă la baza uneia dintre modalitățile de a crea obiecte în scenariile PowerShell:

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Cu Select-Object se pot adăuga obiectelor proprietăți calculate, care trebuie reprezentate sub formă de . Așa vom proceda și noi. Ca și cheie, vom folosi PID-ul procesului, iar ca valoare vom defini structura:. Aici, valoarea primei chei corespunde numelui proprietății, iar valoarea celei de-a doua — valorii proprietății pentru elementul curent al conductei:

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Să ne uităm la structura obiectelor care trec prin conductă:

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

ForEach-Object, Group-Object și Measure-Object

Există și alte comenzi pentru lucrul cu obiecte. De exemplu, să discutăm despre trei dintre cele mai utile:

ForEach-Object permite executarea de cod în limbajul PowerShell pentru fiecare obiect din conductă:

ForEach-Object { bloc de script }

Group-Object grupează obiectele după valoarea unei proprietăți:

Group-Object PropertyName

Dacă este rulat cu parametrul -NoElement, se poate afla numărul de elemente din grupuri.

Measure-Object agregă diverse parametrii rezumativi pe baza valorilor câmpurilor obiectelor din conductă (calculează suma, precum și găsește valoarea minimă, maximă sau medie):

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

De obicei, comenzile discutate sunt folosite în mod interactiv, iar în scripturi se creează mai des funcții cu blocurile Begin, Process și End.

Crearea obiectelor .NET și COM (New-Object)

Există numeroase componente software cu interfețe .NET Core și COM, care vor fi utile administratorilor de sistem. Cu ajutorul clasei System.Diagnostics.EventLog, se pot gestiona jurnalele sistemului direct din Windows PowerShell. Să analizăm exemplul creării unei instanțe a acestei clase folosind comanda New-Object cu parametrul -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Deoarece nu am specificat un anumit jurnal de evenimente, exemplarul obținut al clasei nu conține date. Pentru a schimba acest lucru, este necesar să apelăm o metodă specială de construcție în timpul creării sale, prin intermediul parametrului -ArgumentList. Dacă dorim să accesăm jurnalul aplicației, trebuie să transmitem șirul „Application” ca argument în constructor:

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Rețineți: am salvat ieșirea comenzii în variabila $AppLog. Deși în modul interactiv se folosesc de obicei conducte, scrierea de scripturi necesită adesea salvarea unei referințe la obiect. În plus, clasele principale .NET Core se află în spațiul de nume System: PowerShell caută de obicei tipurile specificate în acesta, deci scrierea Diagnostics.EventLog în loc de System.Diagnostics.EventLog este perfect corect.

Pentru a lucra cu jurnalul, se pot apela metodele corespunzătoare:

$AppLog | Get-Member -MemberType Method

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Să spunem că este șters prin metoda Clear() dacă avem drepturi de acces:

$AppLog.Clear()

Cmdlet-ul New-Object este folosit și pentru a lucra cu componente COM. Există destul de multe - de la bibliotecile de scripturi Windows livrate cu serverul până la aplicații ActiveX, cum ar fi Internet Explorer. Pentru a crea un obiect COM, este necesar să specificați parametrul -ComObject cu identificatorul de program ProgId al clasei dorite:

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

Pentru a crea obiecte proprii cu o structură arbitrară, utilizarea New-Object pare prea arhaică și greoaie, acest cmdlet fiind utilizat pentru a lucra cu componente software externe față de PowerShell. În articolele următoare, această problemă va fi analizată mai în detaliu. Pe lângă obiectele .NET și COM, vom studia de asemenea obiectele CIM (WMI) și ADSI.

Invocarea metodelor statice

Instanțele unor clase .NET Core nu pot fi create: printre acestea se numără System.Environment și System.Math. Ele sunt statice și conțin doar proprietăți și metode statice. În esență, acestea sunt biblioteci de referință, care sunt utilizate fără a crea obiecte. Se poate face referire la o clasă statică prin intermediul literalului, închizând numele tipului între paranteze pătrate. În acest caz, dacă privim structura obiectului folosind Get-Member, vom vedea tipul System.RuntimeType în loc de System.Environment:

[System.Environment] | Get-Member

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Pentru a vizualiza doar elementele statice, trebuie să apelăm Get-Member cu parametrul -Static (observați tipul obiectului):

[System.Environment] | Get-Member -Static

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Pentru a accesa proprietățile și metodele statice, se folosesc două puncte consecutive în loc de punct după literal:

[System.Environment]::OSVersion

Sau

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Tipul PSCustomObject

Printre numeroasele tipuri de date disponibile în PowerShell, un tip deosebit este PSCustomObject, destinat stocării obiectelor cu structură arbitrară. Crearea unui astfel de obiect cu ajutorul comenzii New-Object este considerat un mod clasic, dar voluminos și învechit:

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

Să ne uităm la structura obiectului:

$object | Get-Member

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Începând cu PowerShell 3.0, este disponibil și o altă sintaxă:

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

Accesarea datelor se poate face în unul din modurile echivalente:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Să dăm un exemplu de transformare într-un obiect dintr-un hash table existent:

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Unul dintre dezavantajele obiectelor de acest tip este că ordinea proprietăților lor poate fi schimbată. Pentru a evita acest lucru, trebuie utilizat atributul [ordered]:

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

Există și alte opțiuni pentru crearea obiectului: mai sus am discutat despre utilizarea comenzii Select-Object. Rămâne de văzut cum se adaugă și se elimină elemente. A face acest lucru pentru obiectul din exemplul anterior este destul de simplu:

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Comanda Add-Member permite adăugarea nu doar de proprietăți, ci și de metode la obiectul $object prin utilizarea construcției "-MemberType ScriptMethod":

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

Observați: pentru stocarea codului noii metode am folosit variabila $ScriptBlock de tip ScriptBlock.

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Pentru a elimina proprietățile se folosește metoda corespunzătoare:

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

Crearea propriilor clase

În PowerShell 5.0 a apărut posibilitatea definirii clasă utilizând sintaxa specifică limbajelor de programare orientate pe obiect. Acest lucru este realizat cu ajutorul cuvântului rezervat Class, urmat de numele clasei și de definiția corpului acesteia între acolade:

class MyClass
{
    # corpul clasei
}

Acesta este un tip real .NET Core, în interiorul căruia sunt descrise proprietățile, metodele și alte elemente. Să luăm în considerare un exemplu de definiție a celei mai simple clase:

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

Pentru a crea un obiect (instanță a clasei) se folosește cmdlet-ul New-Object, fie un literal de tip [MyClass] și metoda pseudo-statică new (constructor implicit):

$object = New-Object -TypeName MyClass

sau

$object = [MyClass]::new()

Să analizăm structura obiectului:

$object | Get-Member

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Nu trebuie uitată sfera de vizibilitate: nu se poate face referire la numele tipului sub formă de șir sau se poate folosi un literal de tip în afara scriptului sau modulului în care a fost definită clasa. Funcțiile pot restitui instanțe ale clasei (obiecte), care vor fi accesibile în afara modulului sau scriptului.

După crearea obiectului, să-i completăm proprietățile:

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

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Să menționăm că, în descrierea clasei, sunt specificate nu doar tipurile proprietăților, ci și valorile lor implicite:

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

Descrierea metodei clasei seamănă cu descrierea unei funcții, dar fără utilizarea cuvântului rezervat function. Asemenea funcției, se pot transmite parametrii către metode, dacă este necesar:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     # descrierea metodei
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

Acum reprezentantul clasei noastre știe să zâmbească:

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

Metodele pot fi suprasolicitate, iar în plus, clasa poate avea proprietăți și metode statice, precum și constructori, ale căror nume coincid cu numele propriu-zis al clasei. O clasă definită într-un script sau modul PowerShell poate servi drept bază pentru alta — astfel se realizează moștenirea. Este permisă utilizarea claselor existente .NET ca clase de bază:

class MyClass2 : MyClass
{
      # corpul noii clase, a cărei clasă de bază este MyClass
}
[MyClass2]::new().Smile($true)

Descrierea noastră despre lucrul cu obiectele în PowerShell este greu de numit exhaustivă. În publicațiile viitoare, vom încerca să o aprofundăm cu exemple practice: a cincea articol din ciclu va fi dedicat problemelor de integrare a PowerShell cu componente software externe. Părțile anterioare pot fi găsite la linkurile de mai jos.

Partea 1: funcționalitățile de bază ale Windows PowerShell
Partea 2: introducere în limbajul de programare Windows PowerShell
Partea 3: transmiterea parametrilor în scripturi și funcții, crearea de cmdlet-uri

Ce este Windows PowerShell și cu ce se mănâncă? Partea 4: Lucrul cu obiecte, clase proprii

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster