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 za rad s objektima: cmdleti i funkcije primaju ih kao ulaz i , 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
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 (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 za 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:

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 
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 PropertyOvo 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"} 
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 
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 cpuParametar -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 
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 
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 1Kao 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 
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() 
Koristeći Select-Object, možete dodati izračunata svojstva objektima koji trebaju biti predstavljeni kao . 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}} 
Pogledajmo strukturu objekata koji prolaze kroz transporter:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member 
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 PropertyNameAko 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 -SumObično se cmdleti o kojima se govori koriste interaktivno i često se stvaraju u skriptama. 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 
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 
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 
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.FileSystemObjectZa 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 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 
Za prikaz samo statičkih članova, pozovite Get-Member s parametrom -Static (obratite pažnju na tip objekta):
[System.Environment] | Get-Member -Static 
Za pristup statičkim svojstvima i metodama upotrijebite dvije uzastopne dvotočke umjesto točke iza literala:
[System.Environment]::OSVersionili
$test=[System.Math]::Sqrt(25)
$test
$test.GetType() 
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 
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()

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 . 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

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.

Za uklanjanje svojstava upotrijebite odgovarajuću metodu:
$object.psobject.properties.remove('Name')
Stvaranje vlastitih razreda
PowerShell 5.0 uveo je mogućnost definiranja 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 , ili literal tipa [MyClass] i novo (zadani konstruktor):
$object = New-Object -TypeName MyClassili
$object = [MyClass]::new()Analizirajmo strukturu objekta:
$object | Get-Member 
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

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 , 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.
Izvor: www.habr.com
