Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Ieșirea textului comenzilor din fereastra interpretului PowerShell este doar o modalitate de a afișa informații într-o formă potrivită pentru percepția umană. De fapt miercuri orientat pentru a lucra cu obiecte: cmdleturile și funcțiile le primesc ca intrare și intors la iesire, iar tipurile de variabile disponibile interactiv și în scripturi se bazează pe clase .NET. În al patrulea articol al seriei, vom studia lucrul cu obiecte mai detaliat.

Cuprins:

Obiecte în PowerShell
Vizualizarea structurii obiectelor
Filtrarea obiectelor
Sortarea obiectelor
Selectarea obiectelor și a părților lor
Pentru fiecare-obiect, grup-obiect și măsură-obiect
Crearea obiectelor .NET și COM (New-Object)
Apelarea metodelor statice
Tastați PSCustomObject
Crearea propriilor clase

Obiecte în PowerShell

Să ne amintim că un obiect este o colecție de câmpuri de date (proprietăți, evenimente etc.) și metode de procesare a acestora (metode). Structura sa este specificată de un tip, care se bazează de obicei pe clasele utilizate în platforma unificată .NET Core. De asemenea, este posibil să lucrați cu obiecte COM, CIM (WMI) și ADSI. Sunt necesare proprietăți și metode pentru a efectua diverse acțiuni asupra datelor; în plus, în PowerShell, obiectele pot fi transmise ca argumente funcțiilor și cmdlet-urilor, alocate valorile acestora variabilelor și există, de asemenea, mecanism de compunere a comenzii (conveior sau conductă). Fiecare comandă din conductă își transmite rezultatul la următoarea pe rând, obiect cu obiect. Pentru procesare, puteți utiliza cmdlet-uri compilate sau puteți crea propriile dvs caracteristici avansatepentru a efectua diverse manipulări cu obiectele din conductă: filtrarea, sortarea, gruparea și chiar schimbarea structurii acestora. Transmiterea datelor în această formă are un avantaj serios: echipa de recepție nu trebuie să analizeze fluxul de octeți (text), toate informațiile necesare sunt ușor de găsit prin apelarea proprietăților și metodelor corespunzătoare.

Vizualizarea structurii obiectelor

De exemplu, să rulăm cmdletul Get-Process, care vă permite să obțineți informații despre procesele care rulează în sistem:

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Va afișa câteva date text formatate care nu oferă nicio idee despre proprietățile obiectelor returnate și metodele acestora. Pentru a ajusta ieșirea, trebuie să învățăm cum să examinăm structura obiectelor, iar cmdletul Get-Member ne va ajuta în acest sens:

Get-Process | Get-Member

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Aici vedem deja tipul și structura, iar cu ajutorul unor parametri suplimentari putem, de exemplu, afișa numai proprietățile obiectului inclus în intrare:

Get-Process | Get-Member -MemberType Property

Aceste cunoștințe vor fi necesare pentru a rezolva problemele de administrare în mod interactiv sau pentru a vă scrie propriile scripturi: de exemplu, pentru a obține informații despre procesele suspendate folosind proprietatea Responding.

Filtrarea obiectelor

PowerShell permite ca obiectele care îndeplinesc o anumită condiție să fie trecute printr-o conductă:

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

Rezultatul executării blocului de script între paranteze trebuie să fie o valoare booleană. Dacă este adevărat ($true), obiectul care este introdus în cmdletul Where-Object va fi trecut de-a lungul conductei, în caz contrar ($false) va fi șters. De exemplu, să afișăm o listă de servicii Windows Server oprite, de ex. cei a căror proprietate Status este setată la „Oprit”:

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

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

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Sortarea obiectelor

Atunci când procesează prin conducte obiectele, este adesea nevoie să le sortăm. Cmdletului Sort-Object primesc numele proprietăților (chei de sortare) și returnează obiectele ordonate după valorile lor. Este ușor să sortați rezultatul proceselor care rulează în funcție de timpul petrecut CPU (proprietatea CPU):

Get-Process | Sort-Object –Property cpu

Parametrul -Property poate fi omis la apelarea cmdlet-ului Sort-Object; este utilizat implicit. Pentru sortarea inversă, utilizați parametrul -Descendent:

Get-Process | Sort-Object cpu -Descending

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Selectarea obiectelor și a părților lor

Cmdletul Select-Object vă permite să selectați un anumit număr de obiecte la începutul sau la sfârșitul unei conducte folosind parametrii -First sau -Last. Cu ajutorul acestuia, puteți selecta obiecte individuale sau anumite proprietăți și, de asemenea, puteți crea obiecte noi pe baza acestora. Să vedem cum funcționează cmdletul folosind exemple simple.

Următoarea comandă afișează informații despre cele 10 procese care consumă cantitatea maximă de RAM (proprietatea WS):

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Puteți selecta doar anumite proprietăți ale obiectelor care trec prin conductă și puteți crea altele noi pe baza acestora:

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

Ca rezultat al funcționării conductei, vom primi un nou obiect, a cărui structură va diferi de structura returnată de cmdletul Get-Process. Să verificăm acest lucru folosind Get-Member:

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Rețineți că Select-Object returnează un singur obiect (-First 1) care are doar două dintre câmpurile pe care le-am specificat: valorile lor au fost copiate din primul obiect trecut în conductă de cmdletul Get-Process. Una dintre modalitățile de a crea obiecte în scripturile PowerShell se bazează pe utilizarea Select-Object:

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Folosind Select-Object, puteți adăuga proprietăți calculate obiectelor care trebuie reprezentate ca tabele de hash. În acest caz, valoarea primei sale chei corespunde numelui proprietății, iar valoarea celei de-a doua chei corespunde valorii proprietății pentru elementul de conductă curent:

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

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

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Pentru fiecare-obiect, grup-obiect și măsură-obiect

Există și alte cmdlet-uri pentru lucrul cu obiecte. Ca exemplu, să vorbim despre cele trei cele mai utile:

Pentru fiecare obiect vă permite să rulați cod PowerShell pentru fiecare obiect din conductă:

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

Grup-Obiect grupează obiectele după valoarea proprietății:

Group-Object PropertyName

Dacă îl rulați cu parametrul -NoElement, puteți afla numărul de elemente din grupuri.

Măsură-Obiect agregează diverși parametri rezumativi în funcție de valorile câmpului obiectului în conductă (calculează suma și găsește, de asemenea, valoarea minimă, maximă sau medie):

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

De obicei, cmdleturile discutate sunt folosite interactiv și sunt adesea create în scripturi. funcții cu blocurile Begin, Process și End.

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

Există multe componente software cu interfețe .NET Core și COM care sunt utile administratorilor de sistem. Folosind clasa System.Diagnostics.EventLog, puteți gestiona jurnalele de sistem direct din Windows PowerShell. Să ne uităm la un exemplu de creare a unei instanțe a acestei clase folosind cmdletul New-Object cu parametrul -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Deoarece nu am specificat un anumit jurnal de evenimente, instanța rezultată a clasei nu conține date. Pentru a schimba acest lucru, trebuie să apelați o metodă specială de constructor în timpul creării acesteia folosind parametrul -ArgumentList. Dacă vrem să accesăm jurnalul aplicației, ar trebui să transmitem șirul „Aplicație” ca argument constructorului:

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Vă rugăm să rețineți că am salvat rezultatul comenzii în variabila $AppLog. Deși conductele sunt utilizate în mod obișnuit în modul interactiv, scrierea de scripturi necesită adesea menținerea unei referințe la un obiect. În plus, clasele de bază .NET Core sunt conținute în spațiul de nume System: PowerShell caută în mod implicit tipurile specificate în el, așa că scrierea Diagnostics.EventLog în loc de System.Diagnostics.EventLog este destul de corectă.

Pentru a lucra cu jurnalul, puteți utiliza metodele adecvate:

$AppLog | Get-Member -MemberType Method

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Să presupunem că este șters de metoda Clear() dacă există drepturi de acces:

$AppLog.Clear()

Cmdletul New-Object este, de asemenea, folosit pentru a lucra cu componente COM. Există destul de multe - de la bibliotecile furnizate cu serverul de script Windows până la aplicații ActiveX, cum ar fi Internet Explorer. Pentru a crea un obiect COM, trebuie să setați parametrul -ComObject cu ProgId-ul programatic 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 vă crea propriile obiecte cu o structură arbitrară, utilizarea New-Object pare prea arhaică și greoaie; acest cmdlet este folosit pentru a lucra cu componente software externe PowerShell. În articolele viitoare, această problemă va fi discutată mai detaliat. Pe lângă obiectele .NET și COM, vom explora și obiectele CIM (WMI) și ADSI.

Apelarea metodelor statice

Unele clase .NET Core nu pot fi instanțiate, inclusiv System.Environment și System.Math. Sunt static și conțin numai proprietăți și metode statice. Acestea sunt în esență biblioteci de referință care sunt utilizate fără a crea obiecte. Vă puteți referi la o clasă statică printr-un literal prin includerea numelui tipului între paranteze drepte. Cu toate acestea, dacă ne uităm la structura obiectului folosind Get-Member, vom vedea tipul System.RuntimeType în loc de System.Environment:

[System.Environment] | Get-Member

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Pentru a vizualiza numai membri statici, apelați Get-Member cu parametrul -Static (rețineți tipul obiectului):

[System.Environment] | Get-Member -Static

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Pentru a accesa proprietăți și metode statice, utilizați două puncte consecutive în loc de un punct după literal:

[System.Environment]::OSVersion

sau

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Tastați PSCustomObject

Dintre numeroasele tipuri de date disponibile în PowerShell, merită menționat PSCustomObject, conceput pentru stocarea obiectelor cu o structură arbitrară. Crearea unui astfel de obiect folosind cmdletul New-Object este considerată o modalitate clasică, dar greoaie și depășită:

$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 pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

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

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

Puteți accesa datele într-unul dintre modalitățile echivalente:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Iată un exemplu de conversie a unui tabel hash existent într-un obiect:

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Unul dintre dezavantajele obiectelor de acest tip este că ordinea proprietăților lor se poate schimba. Pentru a evita acest lucru, trebuie să utilizați atributul [ordonat]:

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

Există și alte opțiuni pentru crearea unui obiect: mai sus ne-am uitat la utilizarea cmdlet-ului Selectați-obiect. Tot ce rămâne este să vă dați seama de adăugarea și eliminarea elementelor. 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 pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Cmdletul Add-Member vă permite să adăugați nu numai proprietăți, ci și metode la un $object creat anterior, utilizând constructul „-MemberType ScriptMethod”:

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

Vă rugăm să rețineți că am folosit variabila $ScriptBlock de tip ScriptBlock pentru a stoca codul pentru noua metodă.

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Pentru a elimina proprietăți, utilizați metoda corespunzătoare:

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

Crearea propriilor clase

PowerShell 5.0 a introdus capacitatea de a defini clase folosind sintaxa caracteristică limbajelor de programare orientate pe obiecte. Cuvântul de serviciu Class este destinat pentru aceasta, după care ar trebui să specificați numele clasei și să descrieți corpul acesteia între paranteze operator:

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

Acesta este un adevărat tip .NET Core, cu un corp care descrie proprietățile, metodele și alte elemente ale acestuia. Să ne uităm la un exemplu de definire a celei mai simple clase:

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

Pentru a crea un obiect (instanță de clasă), utilizați cmdletul Nou-Obiect, sau un literal de tip [MyClass] și metoda pseudostatica nou (constructor implicit):

$object = New-Object -TypeName MyClass

sau

$object = [MyClass]::new()

Să analizăm structura obiectului:

$object | Get-Member

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Nu uitați de domeniul de aplicare: nu vă puteți referi la un nume de tip ca șir de caractere sau de a utiliza un tip literal în afara scriptului sau modulului în care este definită clasa. În acest caz, funcțiile pot returna instanțe de clasă (obiecte) care vor fi accesibile în afara modulului sau scriptului.

După crearea obiectului, completați proprietățile acestuia:

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

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Rețineți că descrierea clasei specifică nu numai tipurile de proprietate, ci și valorile implicite ale acestora:

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

Descrierea unei metode de clasă seamănă cu descrierea unei funcții, dar fără a utiliza cuvântul funcție. Ca și într-o funcție, parametrii sunt transferați la metode dacă este necesar:

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

Acum reprezentantul clasei noastre poate zâmbi:

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

Metodele pot fi supraîncărcate; în plus, o clasă are proprietăți și metode statice, precum și constructori ale căror nume coincid cu numele clasei în sine. O clasă definită într-un script sau un modul PowerShell poate servi ca bază pentru altul - așa este implementată moștenirea. În acest caz, este permisă utilizarea claselor .NET existente ca bază:

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

Descrierea noastră despre lucrul cu obiecte în PowerShell nu este exhaustivă. În următoarele publicații, vom încerca să o aprofundăm cu exemple practice: al cincilea articol din serie va fi dedicat problemelor integrării PowerShell cu componente software terțe. Părțile anterioare pot fi găsite la linkurile de mai jos.

Partea 1: Funcții de bază Windows PowerShell
Partea 2: Introducere în limbajul de programare Windows PowerShell
Partea 3: trecerea parametrilor către scripturi și funcții, crearea cmdlet-urilor

Ce este Windows PowerShell și pentru ce este folosit? Partea 4: Lucrul cu obiecte, clase proprii

Sursa: www.habr.com

Adauga un comentariu