Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Textový výstup príkazov v okne tlmočníka PowerShell je len spôsob, ako zobraziť informácie vo forme vhodnej pre ľudské vnímanie. Vlastne v stredu orientovaný na prácu s objektmi: cmdlety a funkcie ich prijímajú ako vstup a vrátil pri východea typy premenných dostupné interaktívne a v skriptoch sú založené na triedach .NET. Vo štvrtom článku série si prácu s objektmi preštudujeme podrobnejšie.

Obsah:

Objekty v prostredí PowerShell
Zobrazenie štruktúry objektov
Filtrovanie objektov
Triedenie predmetov
Výber objektov a ich častí
ForEach-Object, Group-Object a Measure-Object
Vytváranie objektov .NET a COM (New-Object)
Volanie statických metód
Napíšte PSCustomObject
Vytváranie vlastných tried

Objekty v prostredí PowerShell

Pripomeňme, že objekt je súbor dátových polí (vlastností, udalostí atď.) a metód na ich spracovanie (metódy). Jeho štruktúra je určená typom, ktorý zvyčajne vychádza z tried používaných v jednotnej platforme .NET Core. Je možné pracovať aj s objektmi COM, CIM (WMI) a ADSI. Vlastnosti a metódy sú potrebné na vykonávanie rôznych akcií s údajmi; okrem toho v PowerShell možno objekty odovzdávať ako argumenty funkciám a cmdletom, priraďovať ich hodnoty premenným a tiež mechanizmus skladania príkazov (dopravník alebo potrubie). Každý príkaz v potrubí odovzdáva svoj výstup ďalšiemu v poradí, objekt po objekte. Na spracovanie môžete použiť kompilované cmdlety alebo si vytvoriť vlastné pokročilé vlastnostivykonávať rôzne manipulácie s objektmi v potrubí: filtrovať, triediť, zoskupovať a dokonca meniť ich štruktúru. Prenos dát v tejto forme má vážnu výhodu: prijímajúci tím nemusí analyzovať bajtový tok (text), všetky potrebné informácie sa jednoducho získajú volaním príslušných vlastností a metód.

Zobrazenie štruktúry objektov

Spustite napríklad cmdlet Get-Process, ktorý vám umožní získať informácie o procesoch spustených v systéme:

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Zobrazí niektoré formátované textové údaje, ktoré nedávajú žiadnu predstavu o vlastnostiach vrátených objektov a ich metódach. Na doladenie výstupu sa musíme naučiť skúmať štruktúru objektov a pomôže nám s tým cmdlet Get-Member:

Get-Process | Get-Member

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Tu už vidíme typ a štruktúru a pomocou ďalších parametrov môžeme napríklad zobraziť iba vlastnosti objektu zahrnutého vo vstupe:

Get-Process | Get-Member -MemberType Property

Tieto znalosti budú potrebné na interaktívne riešenie administračných problémov alebo na písanie vlastných skriptov: napríklad na získanie informácií o pozastavených procesoch pomocou vlastnosti Responding.

Filtrovanie objektov

PowerShell umožňuje, aby objekty, ktoré spĺňajú určitú podmienku, prechádzali potrubím:

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

Výsledkom spustenia bloku skriptu v zátvorkách musí byť boolovská hodnota. Ak je to pravda ($true), objekt, ktorý je vstupom do rutiny cmdlet Where-Object, bude odovzdaný potrubím, v opačnom prípade ($false) bude odstránený. Ukážme si napríklad zoznam zastavených služieb Windows Server, t.j. tie, ktorých vlastnosť Status je nastavená na „Zastavené“:

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Opäť tu vidíme textovú reprezentáciu, ale ak chcete pochopiť typ a vnútornú štruktúru objektov prechádzajúcich potrubím, nie je to ťažké:

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Triedenie predmetov

Pri potrubnom spracovaní objektov je často potrebné ich triediť. Rutina cmdlet Sort-Object odovzdá názvy vlastností (triediace kľúče) a vráti objekty zoradené podľa ich hodnôt. Je ľahké triediť výstup bežiacich procesov podľa stráveného času CPU (vlastnosť CPU):

Get-Process | Sort-Object –Property cpu

Parameter -Property možno pri volaní cmdlet Sort-Object vynechať; používa sa predvolene. Pre spätné zoradenie použite parameter -Descending:

Get-Process | Sort-Object cpu -Descending

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Výber objektov a ich častí

Rutina cmdlet Select-Object vám umožňuje vybrať konkrétny počet objektov na začiatku alebo konci kanála pomocou parametrov -First alebo -Last. S jeho pomocou môžete vybrať jednotlivé objekty alebo určité vlastnosti a tiež vytvoriť nové objekty na ich základe. Pozrime sa, ako cmdlet funguje na jednoduchých príkladoch.

Nasledujúci príkaz zobrazí informácie o 10 procesoch spotrebúvajúcich maximálne množstvo pamäte RAM (vlastnosť WS):

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Môžete vybrať iba určité vlastnosti objektov prechádzajúcich potrubím a na základe nich vytvoriť nové:

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

V dôsledku prevádzky potrubia dostaneme nový objekt, ktorého štruktúra sa bude líšiť od štruktúry vrátenej cmdlet Get-Process. Overme si to pomocou Get-Member:

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Všimnite si, že Select-Object vracia jeden objekt (-First 1), ktorý má iba dve polia, ktoré sme zadali: ich hodnoty boli skopírované z prvého objektu odovzdaného do kanála cmdlet Get-Process. Jeden zo spôsobov vytvárania objektov v skriptoch PowerShell je založený na použití Select-Object:

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Pomocou Select-Object môžete pridať vypočítané vlastnosti k objektom, ktoré je potrebné reprezentovať ako hashovacie tabuľky. V tomto prípade hodnota jeho prvého kľúča zodpovedá názvu vlastnosti a hodnota druhého kľúča zodpovedá hodnote vlastnosti pre aktuálny prvok potrubia:

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Pozrime sa na štruktúru predmetov prechádzajúcich cez dopravník:

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

ForEach-Object, Group-Object a Measure-Object

Na prácu s objektmi existujú ďalšie cmdlety. Ako príklad si povedzme o troch najužitočnejších:

Pre každý objekt umožňuje spustiť kód PowerShell pre každý objekt v potrubí:

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

Skupina-Objekt zoskupuje objekty podľa hodnoty vlastnosti:

Group-Object PropertyName

Ak ho spustíte s parametrom -NoElement, môžete zistiť počet prvkov v skupinách.

Measure-Object agreguje rôzne súhrnné parametre podľa hodnôt poľa objektu v potrubí (vypočíta súčet a tiež nájde minimálnu, maximálnu alebo priemernú hodnotu):

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

Typicky sa diskutované cmdlety používajú interaktívne a často sa vytvárajú v skriptoch. функции s blokmi Začiatok, Proces a Koniec.

Vytváranie objektov .NET a COM (New-Object)

Existuje mnoho softvérových komponentov s rozhraniami .NET Core a COM, ktoré sú užitočné pre systémových administrátorov. Pomocou triedy System.Diagnostics.EventLog môžete spravovať systémové denníky priamo z prostredia Windows PowerShell. Pozrime sa na príklad vytvorenia inštancie tejto triedy pomocou cmdlet New-Object s parametrom -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Keďže sme nešpecifikovali konkrétny protokol udalostí, výsledná inštancia triedy neobsahuje žiadne údaje. Aby ste to zmenili, musíte počas jej vytvárania zavolať špeciálnu metódu konštruktora pomocou parametra -ArgumentList. Ak chceme získať prístup k denníku aplikácie, mali by sme konštruktorovi odovzdať reťazec „Aplikácia“ ako argument:

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Upozorňujeme, že výstup príkazu sme uložili do premennej $AppLog. Hoci sa potrubia bežne používajú v interaktívnom režime, písanie skriptov často vyžaduje udržiavanie odkazu na objekt. Okrem toho sú základné triedy .NET Core obsiahnuté v System namespace: PowerShell v ňom predvolene hľadá špecifikované typy, takže zápis Diagnostics.EventLog namiesto System.Diagnostics.EventLog je celkom správny.

Na prácu s denníkom môžete použiť príslušné metódy:

$AppLog | Get-Member -MemberType Method

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Povedzme, že sa vymaže metódou Clear(), ak existujú prístupové práva:

$AppLog.Clear()

Rutina cmdlet New-Object sa používa aj na prácu s komponentmi COM. Je ich pomerne veľa – od knižníc dodávaných so skriptovacím serverom Windows až po aplikácie ActiveX, ako je Internet Explorer. Ak chcete vytvoriť objekt COM, musíte nastaviť parameter -ComObject s programovým ProgId požadovanej triedy:

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

Na vytváranie vlastných objektov s ľubovoľnou štruktúrou sa používanie New-Object zdá príliš archaické a ťažkopádne; tento cmdlet sa používa na prácu so softvérovými komponentmi mimo PowerShell. V ďalších článkoch sa tejto problematike budeme venovať podrobnejšie. Okrem objektov .NET a COM preskúmame aj objekty CIM (WMI) a ADSI.

Volanie statických metód

Niektoré triedy .NET Core nemožno vytvoriť, vrátane System.Environment a System.Math. Oni sú statické a obsahujú iba statické vlastnosti a metódy. Ide v podstate o referenčné knižnice, ktoré sa používajú bez vytvárania objektov. Na statickú triedu môžete odkazovať prostredníctvom literálu tak, že názov typu uzatvoríte do hranatých zátvoriek. Ak sa však pozrieme na štruktúru objektu pomocou Get-Member, namiesto System.Environment uvidíme typ System.RuntimeType:

[System.Environment] | Get-Member

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Ak chcete zobraziť iba statické členy, zavolajte Get-Member s parametrom -Static (všimnite si typ objektu):

[System.Environment] | Get-Member -Static

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Ak chcete získať prístup k statickým vlastnostiam a metódam, použite dve po sebe nasledujúce dvojbodky namiesto bodky za literálom:

[System.Environment]::OSVersion

alebo

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Napíšte PSCustomObject

Spomedzi mnohých dátových typov dostupných v PowerShell stojí za zmienku PSCustomObject, určený na ukladanie objektov s ľubovoľnou štruktúrou. Vytvorenie takéhoto objektu pomocou cmdlet New-Object sa považuje za klasický, ale ťažkopádny a zastaraný spôsob:

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

Pozrime sa na štruktúru objektu:

$object | Get-Member

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Počnúc PowerShell 3.0 je k dispozícii ďalšia syntax:

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

K údajom môžete pristupovať jedným z ekvivalentných spôsobov:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Tu je príklad prevodu existujúcej hašovacej tabuľky na objekt:

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Jednou z nevýhod objektov tohto typu je, že poradie ich vlastností sa môže meniť. Aby ste tomu zabránili, musíte použiť atribút [ordered]:

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

Existujú aj ďalšie možnosti na vytvorenie objektu: vyššie sme sa pozreli na použitie cmdlet Vyberte objekt. Zostáva len vymyslieť pridávanie a odstraňovanie prvkov. Urobiť to pre objekt z predchádzajúceho príkladu je celkom jednoduché:

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Rutina cmdlet Add-Member vám umožňuje pridávať nielen vlastnosti, ale aj metódy do predtým vytvoreného $object pomocou konštrukcie „-MemberType ScriptMethod“:

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

Upozorňujeme, že na uloženie kódu pre novú metódu sme použili premennú $ScriptBlock typu ScriptBlock.

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Ak chcete odstrániť vlastnosti, použite zodpovedajúcu metódu:

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

Vytváranie vlastných tried

PowerShell 5.0 zaviedol možnosť definovať vyučovanie pomocou syntaxe charakteristickej pre objektovo orientované programovacie jazyky. Na to je určené servisné slovo Class, po ktorom by ste mali zadať názov triedy a opísať jej telo v zátvorkách operátora:

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

Toto je skutočný typ .NET Core s telom, ktoré popisuje jeho vlastnosti, metódy a ďalšie prvky. Pozrime sa na príklad definovania najjednoduchšej triedy:

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

Ak chcete vytvoriť objekt (inštanciu triedy), použite cmdlet Nový objekt, alebo literál typu [MyClass] a pseudostatická metóda nový (predvolený konštruktor):

$object = New-Object -TypeName MyClass

alebo

$object = [MyClass]::new()

Poďme analyzovať štruktúru objektu:

$object | Get-Member

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Nezabudnite na rozsah: nemôžete odkazovať na názov typu ako reťazec alebo použiť typový literál mimo skriptu alebo modulu, v ktorom je trieda definovaná. V tomto prípade môžu funkcie vrátiť inštancie triedy (objekty), ktoré budú prístupné mimo modulu alebo skriptu.

Po vytvorení objektu vyplňte jeho vlastnosti:

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

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Všimnite si, že popis triedy špecifikuje nielen typy vlastností, ale aj ich predvolené hodnoty:

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

Opis metódy triedy pripomína opis funkcie, ale bez použitia slova funkcie. Ako vo funkcii, parametre sa v prípade potreby odovzdávajú metódam:

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

Teraz sa zástupca našej triedy môže usmievať:

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

Metódy môžu byť preťažené, navyše trieda má statické vlastnosti a metódy, ako aj konštruktory, ktorých názvy sa zhodujú s názvom samotnej triedy. Trieda definovaná v skripte alebo module PowerShell môže slúžiť ako základ pre inú – takto sa implementuje dedičnosť. V tomto prípade je povolené používať existujúce triedy .NET ako základné:

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

Náš popis práce s objektmi v PowerShell je sotva vyčerpávajúci. V nasledujúcich publikáciách sa ho pokúsime prehĺbiť na praktických príkladoch: piaty článok série bude venovaný problematike integrácie PowerShellu so softvérovými komponentmi tretích strán. Minulé časti nájdete na nižšie uvedených odkazoch.

Časť 1: Základné funkcie prostredia Windows PowerShell
Časť 2: Úvod do programovacieho jazyka Windows PowerShell
Časť 3: odovzdávanie parametrov skriptom a funkciám, vytváranie cmdletov

Čo je Windows PowerShell a na čo sa používa? 4. časť: Práca s objektmi, vlastné triedy

Zdroj: hab.com

Pridať komentár