Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Textový výstup příkazů v okně interpretru PowerShell je pouze způsob, jak zobrazit informace v lidsky čitelné podobě. Ve skutečnosti je prostředí je zaměřena určeno pro práci s objekty: příkazy (cmdlety) a funkce je přijímají jako vstup a vracejí jako výstup, a typy proměnných dostupných v interaktivním režimu a ve skriptech jsou založeny na třídách .NET. V čtvrtém článku cyklu se podíváme na práci s objekty podrobněji.

Obsah:

Objekty v PowerShell
Zobrazení struktury objektů
Filtrace objektů
Třídění objektů
Vyčlenění objektů a jejich částí
ForEach-Object, Group-Object a Measure-Object
Vytváření objektů .NET a COM (New-Object)
Volání statických metod
Typ PSCustomObject
Vytváření vlastních tříd

Objekty v PowerShell

Připomeňme, že objekt je souhrn datových polí (vlastností, událostí atd.) a způsobů, jak je zpracovat (metod). Jeho struktura je definována typem, který je obvykle založen na třídách používaných v unifikované platformě .NET Core. Také je možné pracovat s objekty COM, CIM (WMI) a ADSI. Vlastnosti a metody jsou potřebné k provádění různých operací s daty; navíc v PowerShell lze objekty předávat jako argumenty funkcím a příkazům a přiřazovat jejich hodnoty proměnným, a také existuje mechanismus kompozice příkazů (potrubí nebo pipeline). Každý příkaz v potrubí předává svůj výstup následujícímu postupně — objekt za objektem. K zpracování lze použít zkompilované příkazy nebo vytvářet vlastní rozšířené funkce, které provádějí různé manipulace s objekty v potrubí: filtrování, třídění, skupinování a dokonce i změnu jejich struktury. Přenos dat tímto způsobem má významnou výhodu: přijímajícímu příkazu není potřeba provádět syntaktickou analýzu datového toku (textu), všechny potřebné informace lze snadno extrahovat pomocí přístupu k odpovídajícím vlastnostem a metodám.

Zobrazení struktury objektů

Pro příklad spustíme příkaz Get-Process, který umožňuje získat informace o běžících procesech v systému:

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Vytiskne na obrazovku nějaká naformátovaná textová data, která neposkytují představu o vlastnostech vracených objektů a jejich metodách. Pro precizní analýzu výstupu se musíme naučit zkoumat strukturu objektů, a v tom nám pomůže příkaz Get-Member:

Get-Process | Get-Member

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Zde už vidíme typ a strukturu, a pomocí dalších parametrů můžeme například vypsat pouze vlastnosti vstupujícího objektu:

Get-Process | Get-Member -MemberType Property

Tyto znalosti budou potřebné pro řešení administračních úkolů v interaktivním režimu nebo pro psaní vlastních skriptů: například pro získání informací o zablokovaných procesech na základě vlastnosti Responding.

Filtrace objektů

PowerShell umožňuje procházet objekty potrubím, které splňují určitá podmínka:

Where-Object { skriptový blok }

Výsledkem provedení skriptového bloku v závorkách musí být logická hodnota. Pokud je pravdivá ($true), vstupující objekt do cmdletu Where-Object bude předán dál potrubím, jinak (hodnota $false) bude odstraněn. Například vypíšeme seznam zastavených služeb Windows Server, tj. těch, které mají vlastnost Status nastavenu na "Stopped":

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Zde opět vidíme textovou reprezentaci, ale pokud chceme pochopit typ a vnitřní uspořádání objektů procházejících potrubím, není to složité:

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Třídění objektů

Při zpracování objektů potrubím často vzniká potřeba je třídit. K cmdletu Sort-Object jsou předávány názvy vlastností (klíče pro třídění) a on vrací objekty seřazené podle jejich hodnot. Výstup běžících procesů se snadno seřadí podle využitého procesorového času (vlastnost cpu):

Get-Process | Sort-Object –Property cpu

Parametr -Property při volání cmdletu Sort-Object není nutné uvádět — používá se automaticky. Pro sestupné třídění se používá parametr -Descending:

Get-Process | Sort-Object cpu -Descending

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Vyčlenění objektů a jejich částí

Cmdlet Select-Object umožňuje vybrat určité množství objektů na začátku nebo na konci potrubí pomocí parametrů -First nebo -Last. S jeho pomocí lze vybrat jednotlivé objekty nebo určité vlastnosti a také na jejich základě vytvořit nové objekty. Prozkoumejme práci cmdletu na jednoduchých příkladech.

Následující příkaz vypisuje informace o 10 procesech s nejvyšší spotřebou paměti (vlastnost WS):

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Můžeme vybrat pouze určité vlastnosti procházejících objekty a vytvořit na jejich základě nové:

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

Výsledkem práce potrubí získáme nový objekt, jehož struktura se bude lišit od struktury vracené příkazem Get-Process. Ujistíme se o tom pomocí Get-Member:

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Všimněte si, že Select-Object vrací jediný objekt (-First 1), který má pouze dvě námi uvedená pole: jejich hodnoty byly zkopírovány z prvního objektu předaného do potrubí příkazem Get-Process. Na používání Select-Object je založen jeden ze způsobů, jak vytvářet objekty ve scénářích PowerShell:

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Pomocí Select-Object můžeme objektům přidávat vypočítaná vlastnosti, které je třeba představit ve formě hashovací tabulky. Přičemž hodnota jejího prvního klíče odpovídá názvu vlastnosti a hodnota druhého — hodnotě vlastnosti pro aktuální prvek potrubí:

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Podívejme se na strukturu objektů procházejících potrubím:

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

ForEach-Object, Group-Object a Measure-Object

Pro práci s objekty existují i další příkazy. Pro příklad si povíme o třech nejvíce užitečných:

ForEach-Object umožňuje vykonat kód v jazyce PowerShell pro každý objekt v potrubí:

ForEach-Object { blok scénáře }

Group-Object skupinu objektů podle hodnoty vlastnosti:

Group-Object PropertyName

Pokud ho spustíte s parametrem -NoElement, můžete zjistit počet prvků ve skupinách.

Measure-Object agreguje různé souhrnné parametry podle hodnot polí objektů v potrubí (počítá součet a také zjistí minimální, maximální nebo průměrnou hodnotu):

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

Obvykle se zmiňované příkazy používají v interaktivním módu, zatímco ve skriptech se častěji vytvářejí funkce s bloky Begin, Process a End.

Vytváření objektů .NET a COM (New-Object)

Existuje mnoho programových komponent s rozhraními .NET Core a COM, které se hodí systémovým administrátorům. Pomocí třídy System.Diagnostics.EventLog lze spravovat systémové deníky přímo z Windows PowerShell. Rozebráme příklad vytvoření instance této třídy pomocí příkazu New-Object s parametrem -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Jelikož jsme neuvedli konkrétní protokol o událostech, obdržená instance třídy neobsahuje žádná data. Chcete-li to změnit, je třeba při jejím vytváření zavolat speciální konstruktor pomocí parametru -ArgumentList. Pokud chceme získat přístup k protokolu aplikace, je nutné předat jako argument řetězec „Application“ do konstruktoru:

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Všimněte si: výstup příkazu jsme uložili do proměnné $AppLog. Ačkoli se v interaktivním režimu obvykle používají p pipelines, psaní skriptů často vyžaduje uložení odkazu na objekt. Hlavní třídy .NET Core se navíc nacházejí v prostoru názvů System: PowerShell je vyhledává ve výchozím nastavení, takže psaní Diagnostics.EventLog místo System.Diagnostics.EventLog je zcela správné.

Pro práci s protokolem lze používat odpovídající metody:

$AppLog | Get-Member -MemberType Method

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Řekněme, že se čistí metodou Clear() za předpokladu, že jsou k dispozici potřebná oprávnění:

$AppLog.Clear()

Cmdlet New-Object se používá také k práci se složkami COM. Existuje jich docela hodně - od scriptových knihoven dodávaných se serverem Windows až po aplikace ActiveX, jako je například Internet Explorer. Chcete-li vytvořit objekt COM, je třeba zadat parametr -ComObject s programovým identifikátorem ProgId požadované třídy:

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

Pro vytváření vlastních objektů s libovolnou strukturou se používání New-Object jeví jako příliš zastaralé a objemné, tento cmdlet se používá pro práci se softwarovými komponenty mimo PowerShell. V následujících článcích se tímto tématem budeme zabývat podrobněji. Kromě objektů .NET a COM také prozkoumáme objekty CIM (WMI) a ADSI.

Volání statických metod

Některé instance tříd .NET Core nelze vytvořit: zahrnují System.Environment a System.Math. Jsou statické a obsahují pouze statické vlastnosti a metody. V podstatě se jedná o referenční knihovny, které se používají bez vytváření objektů. Na statickou třídu lze odkázat pomocí literálového zápisu s názvem typu v hranatých závorkách. Když se podíváme na strukturu objektu pomocí Get-Member, uvidíme typ System.RuntimeType místo System.Environment:

[System.Environment] | Get-Member

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Pro zobrazení pouze statických prvků je třeba zavolat Get-Member s parametrem -Static (všimněte si typu objektu):

[System.Environment] | Get-Member -Static

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Pro přístup ke statickým vlastnostem a metodám se používají dvě po sobě jdoucí dvojtečky místo tečky po literálu:

[System.Environment]::OSVersion

Nebo

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Typ PSCustomObject

Mezi mnoha dostupnými typy dat v PowerShellu se zvlášť zmiňuje PSCustomObject, určený pro ukládání objektů s libovolnou strukturou. Vytváření takového objektu pomocí cmdletu New-Object se považuje za klasický, ale objemný a zastaralý způsob:

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

Podívejme se na strukturu objektu:

$object | Get-Member

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Od PowerShell 3.0 je k dispozici i jiná syntaxe:

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

K datům lze přistupovat jedním z ekvivalentních způsobů:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Uveďme příklad převodu na objekt existující hash tabulky:

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Jednou z nevýhod objektů tohoto typu je, že pořadí jejich vlastností se může změnit. Abychom tomu zabránili, je třeba použít atribut [ordered]:

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

Existují i další varianty, jak vytvořit objekt: výše jsme se podívali na použití cmdletu Select-Object. Ještě zbývá vyřešit přidávání a odstraňování prvků. Pro objekt z předchozího příkladu to jde celkem jednoduše:

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

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Cmdlet Add-Member umožňuje přidávat k již vytvořenému objektu $object nejen vlastnosti, ale také metody pomocí konstrukce "-MemberType ScriptMethod":

$ScriptBlock = {
    # kód 
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member

Všimněte si: pro uchování kódu nové metody jsme použili proměnnou $ScriptBlock typu ScriptBlock.

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Pro odstraňování vlastností se používá odpovídající metoda:

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

Vytváření vlastních tříd

V PowerShell 5.0 byla zavedena možnost definice tříd s použitím syntaxe typické pro objektově orientované programovací jazyky. K tomu slouží klíčové slovo Class, po kterém následuje název třídy a popis jejího těla v složených závorkách:

class MyClass
{
    # tělo třídy
}

To je skutečný typ .NET Core, jehož tělo popisuje jeho vlastnosti, metody a další prvky. Podívejme se na příklad definice nejjednodušší třídy:

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

K vytvoření objektu (instance třídy) se používá cmdlet New-Object, nebo literál typu [MyClass] a pseudostatická metoda new (výchozí konstruktor):

$object = New-Object -TypeName MyClass

nebo

$object = [MyClass]::new()

Analyzujme strukturu objektu:

$object | Get-Member

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Není třeba zapomínat na oblast platnosti: nelze odkazovat na název typu v podobě řetězce nebo používat literál typu mimo skript nebo modul, ve kterém je třída definována. Funkce však mohou vracet instance třídy (objekty), které budou dostupné mimo modul nebo skript.

Po vytvoření objektu naplníme jeho vlastnosti:

$object.Name = 'Ivan Danko'
$object.City = 'Moskva'
$object.Country = 'Rusko'
$object

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Všimněte si, že v popisu třídy jsou zadány nejen typy vlastností, ale také jejich výchozí hodnoty:

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

Popis metody třídy připomíná popis funkce, ale bez použití klíčového slova function. Stejně jako u funkcí se do metod podle potřeby předávají parametry:

class MyClass 
{
     [string]$Name
     [string]$City
     [string]$Country
     
     #popis metody
     Smile([bool]$param1)
     {
         If($param1) {
            Write-Host ':)'
         }
     }
}

Nyní představitel naší třídy umí se usmívat:

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

Metody lze přetěžovat, navíc třídy mohou mít statické vlastnosti a metody, stejně jako konstruktory, jejichž názvy se shodují s názvem samotné třídy. Třída definovaná ve skriptu nebo modulu PowerShell může sloužit jako základ pro jinou — tím se realizuje dědičnost. Přičemž lze jako základ použít existující třídy .NET:

class MyClass2 : MyClass
{
      #tělo nové třídy, která je základní pro MyClass
}
[MyClass2]::new().Smile($true)

Naše popisování práce s objekty v PowerShell těžko nazveme vyčerpávajícím. V dalších publikacích se pokusíme hlouběji proniknout do praktických příkladů: pátý článek cyklu bude věnován otázkám integrace PowerShell s externími softwarovými komponenty. Minulé části lze nalézt na níže uvedených odkazech.

Část 1: hlavní možnosti Windows PowerShell
Část 2: Úvod do programovacího jazyka Windows PowerShell
Část 3: Předávání parametrů do skriptů a funkcí, vytváření cmdletů

Co je Windows PowerShell a k čemu slouží? Část 4: Práce s objekty, vlastní třídy

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster