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
Obsah:
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ž
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:
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
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"}
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
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
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
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
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()
Pomocou Select-Object môžete pridať vypočítané vlastnosti k objektom, ktoré je potrebné reprezentovať ako
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
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
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.
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
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
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
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ú
[System.Environment] | Get-Member
Ak chcete zobraziť iba statické členy, zavolajte Get-Member s parametrom -Static (všimnite si typ objektu):
[System.Environment] | Get-Member -Static
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
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ť
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
$object = New-Object -TypeName MyClass
alebo
$object = [MyClass]::new()
Poďme analyzovať štruktúru objektu:
$object | Get-Member
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
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á
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.
Zdroj: hab.com