Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Tekstualni izlaz naredbi u PowerShell prozoru tumača samo je način da se informacije prikažu u obliku pogodnom za ljudsku percepciju. Zapravo srijeda orijentiran za rad s objektima: cmdleti i funkcije primaju ih kao ulaz i vratio na izlazu, a vrste varijabli dostupne interaktivno iu skriptama temelje se na .NET klasama. U četvrtom članku serije detaljnije ćemo proučiti rad s objektima.

Oglašavanje:

Objekti u PowerShell-u
Pregled strukture objekata
Filtriranje objekata
Razvrstavanje objekata
Odabir predmeta i njihovih dijelova
ForEach-Object, Group-Object i Measure-Object
Stvaranje .NET i COM objekata (novi objekt)
Pozivanje statičkih metoda
Upišite PSCustomObject
Stvaranje vlastitih razreda

Objekti u PowerShell-u

Podsjetimo se da je objekt skup podatkovnih polja (svojstava, događaja itd.) i metoda za njihovu obradu (metoda). Njegova je struktura određena tipom koji se obično temelji na klasama koje se koriste u jedinstvenoj platformi .NET Core. Također je moguće raditi s COM, CIM (WMI) i ADSI objektima. Svojstva i metode su potrebni za izvođenje raznih radnji na podacima; osim toga, u PowerShell-u, objekti se mogu proslijediti kao argumenti funkcijama i cmdletima, dodijeliti njihove vrijednosti varijablama, a tu je i mehanizam sastava zapovijedi (konvejer ili cjevovod). Svaka naredba u cjevovodu prosljeđuje svoj izlaz sljedećoj redom, objekt po objekt. Za obradu možete koristiti kompilirane cmdlete ili izraditi vlastite napredne postavkeza obavljanje raznih manipulacija s objektima u cjevovodu: filtriranje, sortiranje, grupiranje, pa čak i mijenjanje njihove strukture. Prijenos podataka u ovom obliku ima ozbiljnu prednost: primateljski tim ne treba analizirati tok bajtova (tekst), sve potrebne informacije lako se dohvaćaju pozivanjem odgovarajućih svojstava i metoda.

Pregled strukture objekata

Na primjer, pokrenimo cmdlet Get-Process koji vam omogućuje dobivanje informacija o procesima koji se izvode u sustavu:

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Prikazat će neke formatirane tekstualne podatke koji ne daju nikakvu ideju o svojstvima vraćenih objekata i njihovim metodama. Da bismo fino podesili izlaz, moramo naučiti kako ispitati strukturu objekata, a cmdlet Get-Member pomoći će nam u tome:

Get-Process | Get-Member

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Ovdje već vidimo tip i strukturu, a uz pomoć dodatnih parametara možemo npr. prikazati samo svojstva objekta uključenog u unos:

Get-Process | Get-Member -MemberType Property

Ovo znanje bit će potrebno za interaktivno rješavanje administrativnih problema ili za pisanje vlastitih skripti: na primjer, za dobivanje informacija o zaustavljenim procesima pomoću svojstva Responding.

Filtriranje objekata

PowerShell omogućuje da se objekti koji ispunjavaju određeni uvjet prođu kroz cjevovod:

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

Rezultat izvršavanja bloka skripte unutar zagrada mora biti Booleova vrijednost. Ako je true ($true), objekt koji je unesen u cmdlet Where-Object bit će proslijeđen duž cjevovoda, u protivnom ($false) bit će izbrisan. Na primjer, prikažimo popis zaustavljenih servisa Windows Servera, tj. oni čije je svojstvo Status postavljeno na "Stopped":

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Ovdje ponovno vidimo tekstualni prikaz, ali ako želite razumjeti vrstu i unutarnju strukturu objekata koji prolaze kroz cjevovod to nije teško:

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Razvrstavanje objekata

Prilikom cjevovodne obrade objekata često postoji potreba za njihovim sortiranjem. Cmdlet Sort-Object prosljeđuje nazive svojstava (ključeve za sortiranje) i vraća objekte poredane prema njihovim vrijednostima. Lako je razvrstati izlaz pokrenutih procesa prema utrošenom CPU vremenu (cpu svojstvo):

Get-Process | Sort-Object –Property cpu

Parametar -Property može se izostaviti prilikom pozivanja cmdleta Sort-Object; koristi se prema zadanim postavkama. Za obrnuto sortiranje koristite parametar -Descending:

Get-Process | Sort-Object cpu -Descending

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Odabir predmeta i njihovih dijelova

Cmdlet Select-Object omogućuje odabir određenog broja objekata na početku ili kraju cjevovoda pomoću parametara -First ili -Last. Uz njegovu pomoć možete odabrati pojedinačne objekte ili određena svojstva, kao i stvoriti nove objekte na temelju njih. Pogledajmo kako cmdlet radi koristeći jednostavne primjere.

Sljedeća naredba prikazuje informacije o 10 procesa koji troše maksimalnu količinu RAM-a (WS svojstvo):

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Možete odabrati samo određena svojstva objekata koji prolaze kroz cjevovod i stvoriti nova na temelju njih:

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

Kao rezultat rada cjevovoda primit ćemo novi objekt čija će se struktura razlikovati od strukture koju vraća Get-Process cmdlet. Provjerimo ovo koristeći Get-Member:

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Imajte na umu da Select-Object vraća jedan objekt (-First 1) koji ima samo dva polja koja smo naveli: njihove su vrijednosti kopirane iz prvog objekta koji je cmdlet Get-Process proslijedio u cjevovod. Jedan od načina stvaranja objekata u PowerShell skriptama temelji se na korištenju Select-Object:

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Koristeći Select-Object, možete dodati izračunata svojstva objektima koji trebaju biti predstavljeni kao hash tablice. U ovom slučaju, vrijednost njegovog prvog ključa odgovara nazivu svojstva, a vrijednost drugog ključa odgovara vrijednosti svojstva za trenutni element cjevovoda:

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Pogledajmo strukturu objekata koji prolaze kroz transporter:

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

ForEach-Object, Group-Object i Measure-Object

Postoje i drugi cmdleti za rad s objektima. Kao primjer, razgovarajmo o tri najkorisnija:

Za svaki objekt omogućuje vam pokretanje PowerShell koda za svaki objekt u cjevovodu:

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

Grupa-Objekt grupira objekte prema vrijednosti svojstva:

Group-Object PropertyName

Ako ga pokrenete s parametrom -NoElement, možete saznati broj elemenata u grupama.

Mjera-Objekat agregira različite parametre sažetka prema vrijednostima polja objekta u cjevovodu (izračunava zbroj, a također pronalazi minimalnu, maksimalnu ili prosječnu vrijednost):

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

Obično se cmdleti o kojima se govori koriste interaktivno i često se stvaraju u skriptama. funkcije s blokovima Početak, Proces i Kraj.

Stvaranje .NET i COM objekata (novi objekt)

Postoje mnoge softverske komponente s .NET Core i COM sučeljima koje su korisne administratorima sustava. Pomoću klase System.Diagnostics.EventLog možete upravljati zapisnicima sustava izravno iz Windows PowerShell. Pogledajmo primjer stvaranja instance ove klase pomoću cmdleta New-Object s parametrom -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Budući da nismo naveli određeni dnevnik događaja, rezultirajuća instanca klase ne sadrži podatke. Da biste to promijenili, trebate pozvati posebnu metodu konstruktora tijekom njegove izrade pomoću parametra -ArgumentList. Ako želimo pristupiti dnevniku aplikacije, trebali bismo proslijediti string "Application" kao argument konstruktoru:

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Imajte na umu da smo izlaz naredbe spremili u varijablu $AppLog. Iako se cjevovodi obično koriste u interaktivnom načinu rada, pisanje skripti često zahtijeva održavanje reference na objekt. Osim toga, osnovne klase .NET Core sadržane su u System namespaceu: PowerShell prema zadanim postavkama traži navedene tipove u njemu, pa je pisanje Diagnostics.EventLog umjesto System.Diagnostics.EventLog sasvim ispravno.

Za rad s zapisnikom možete koristiti odgovarajuće metode:

$AppLog | Get-Member -MemberType Method

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Recimo da se briše metodom Clear() ako postoje prava pristupa:

$AppLog.Clear()

New-Object cmdlet također se koristi za rad s COM komponentama. Ima ih dosta - od biblioteka isporučenih s Windows poslužiteljem skripti do ActiveX aplikacija, kao što je Internet Explorer. Da biste stvorili COM objekt, trebate postaviti parametar -ComObject s programskim ProgId-om željene klase:

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

Za stvaranje vlastitih objekata s proizvoljnom strukturom korištenje New-Object čini se previše arhaičnim i glomaznim; ovaj se cmdlet koristi za rad sa softverskim komponentama izvan PowerShell-a. U budućim člancima ovo će se pitanje detaljnije raspravljati. Osim .NET i COM objekata, također ćemo istražiti CIM (WMI) i ADSI objekte.

Pozivanje statičkih metoda

Neke klase .NET Core ne mogu se instancirati, uključujući System.Environment i System.Math. Oni su statički i sadrže samo statička svojstva i metode. To su u biti referentne biblioteke koje se koriste bez stvaranja objekata. Možete se pozvati na statičku klasu kroz literal tako da naziv tipa stavite u uglate zagrade. Međutim, ako pogledamo strukturu objekta koristeći Get-Member, vidjet ćemo tip System.RuntimeType umjesto System.Environment:

[System.Environment] | Get-Member

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Za prikaz samo statičkih članova, pozovite Get-Member s parametrom -Static (obratite pažnju na tip objekta):

[System.Environment] | Get-Member -Static

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Za pristup statičkim svojstvima i metodama upotrijebite dvije uzastopne dvotočke umjesto točke iza literala:

[System.Environment]::OSVersion

ili

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Upišite PSCustomObject

Među brojnim vrstama podataka dostupnih u PowerShell-u, vrijedi spomenuti PSCustomObject, dizajniran za pohranjivanje objekata s proizvoljnom strukturom. Stvaranje takvog objekta pomoću cmdleta New-Object smatra se klasičnim, ali glomaznim i zastarjelim načinom:

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

Pogledajmo strukturu objekta:

$object | Get-Member

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Počevši od PowerShell 3.0, dostupna je druga sintaksa:

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

Podacima možete pristupiti na jedan od ekvivalentnih načina:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Evo primjera pretvaranja postojeće hash tablice u objekt:

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Jedan od nedostataka objekata ove vrste je da se redoslijed njihovih svojstava može promijeniti. Da biste to izbjegli, morate koristiti atribut [ordered]:

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

Postoje i druge opcije za stvaranje objekta: gore smo pogledali korištenje cmdleta Odaberi-objekt. Ostaje samo smisliti dodavanje i uklanjanje elemenata. Učiniti ovo za objekt iz prethodnog primjera vrlo je jednostavno:

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Cmdlet Add-Member omogućuje dodavanje ne samo svojstava, već i metoda prethodno stvorenom $objectu pomoću konstrukcije "-MemberType ScriptMethod":

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

Imajte na umu da smo koristili varijablu $ScriptBlock tipa ScriptBlock za pohranjivanje koda za novu metodu.

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Za uklanjanje svojstava upotrijebite odgovarajuću metodu:

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

Stvaranje vlastitih razreda

PowerShell 5.0 uveo je mogućnost definiranja klase koristeći sintaksu karakterističnu za objektno orijentirane programske jezike. Tome je namijenjena servisna riječ Class, nakon koje treba navesti naziv klase i opisati njezino tijelo u operatorskim zagradama:

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

Ovo je pravi .NET Core tip, s tijelom koje opisuje njegova svojstva, metode i druge elemente. Pogledajmo primjer definiranja najjednostavnije klase:

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

Da biste stvorili objekt (instancu klase), koristite cmdlet Novi objekt, ili literal tipa [MyClass] i pseudostatička metoda novo (zadani konstruktor):

$object = New-Object -TypeName MyClass

ili

$object = [MyClass]::new()

Analizirajmo strukturu objekta:

$object | Get-Member

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Ne zaboravite na opseg: ne možete se odnositi na naziv tipa kao niz ili koristiti literal tipa izvan skripte ili modula u kojem je definirana klasa. U tom slučaju funkcije mogu vratiti instance klase (objekte) kojima će se pristupiti izvan modula ili skripte.

Nakon kreiranja objekta, ispunite njegova svojstva:

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

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Imajte na umu da opis klase navodi ne samo tipove svojstava, već i njihove zadane vrijednosti:

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

Opis metode klase nalikuje opisu funkcije, ali bez korištenja funkcijske riječi. Kao u funkciji, parametri se prosljeđuju metodama ako je potrebno:

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

Sada se predstavnik našeg razreda može nasmiješiti:

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

Metode mogu biti preopterećene; osim toga, klasa ima statička svojstva i metode, kao i konstruktori čija se imena poklapaju s nazivom same klase. Klasa definirana u skripti ili PowerShell modulu može poslužiti kao baza za drugu - tako se implementira nasljeđivanje. U ovom slučaju dopušteno je koristiti postojeće .NET klase kao osnovne:

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

Naš opis rada s objektima u PowerShell-u nije iscrpan. U sljedećim publikacijama pokušat ćemo to produbiti praktičnim primjerima: peti članak u nizu bit će posvećen pitanjima integracije PowerShell-a sa softverskim komponentama trećih strana. Prošle dijelove možete pronaći na poveznicama ispod.

1. dio: Osnovne značajke Windows PowerShell
2. dio: Uvod u programski jezik Windows PowerShell
Dio 3: prosljeđivanje parametara skriptama i funkcijama, stvaranje cmdleta

Što je Windows PowerShell i za što se koristi? 4. dio: Rad s objektima, vlastite klase

Izvor: www.habr.com

Dodajte komentar