što Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene klase

što Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 { блок сценария }

Результатом выполнения блока сценария в операторных скобках должно быть логические значение. Если оно истинно ($true) попавший на вход командлету Where-Object объект будет передан по конвейеру дальше, в противном случае (значение $false) он будет удален. Для примера выведем список остановленных служб Windows Server, т.е. таких, у которых свойство Status имеет значение «Stopped»:

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

što Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene klase

Pogledajmo strukturu objekata koji prolaze kroz transporter:

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

što Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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)

Есть множество программных компонентов с интерфейсами .NET Core и COM, которые пригодятся системным администраторам. С помощью класса System.Diagnostics.EventLog можно управлять системными журналами непосредственно из Windows PowerShell. Разберем пример создания экземпляра этого класса при помощи командлета New-Object с параметром -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

što Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene klase

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

$AppLog.Clear()

Командлет New-Object применяется и для работы с СОМ-компонентами. Их довольно много — от поставляемых с сервером сценариев Windows библиотек до приложений ActiveX, таких, например, как Internet Explorer. Чтобы создать СОМ-объект, требуется задать параметр -ComObject с программным идентификатора ProgId нужного класса:

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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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 Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene 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: основные возможности Windows PowerShell
Часть 2: введение в язык программирования Windows PowerShell
Dio 3: prosljeđivanje parametara skriptama i funkcijama, stvaranje cmdleta

što Windows PowerShell i što jesti s njim? 4. dio: Rad s objektima, prilagođene klase

Izvor: www.habr.com

Kupite pouzdan hosting za stranice s DDoS zaštitom, VPS VDS poslužiteljima 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster