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
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
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 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"}
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 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
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 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
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
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 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.
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
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 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
[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]::OSVersion
ili
$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
$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
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
$object = New-Object -TypeName MyClass
ili
$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
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