Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Излезот на текст на командите во прозорецот за толкувач на PowerShell е само начин да се прикажат информациите во форма погодна за човечка перцепција. Всушност среда ориентирана за работа со објекти: cmdlets и функции ги примаат како влез и се врати на излезот, а типовите на променливи достапни интерактивно и во скрипти се базирани на .NET класи. Во четвртиот напис од серијата, подетално ќе ја проучуваме работата со предмети.

Содржина:

Објекти во PowerShell
Преглед на структурата на објектите
Филтрирање на објекти
Сортирање на предмети
Избор на предмети и нивни делови
За секој-објект, група-објект и мерка-објект
Креирање .NET и COM објекти (New-Object)
Повикувајќи статични методи
Напишете PSCustomObject
Создавање свои часови

Објекти во PowerShell

Да потсетиме дека објектот е збирка од полиња со податоци (својства, настани итн.) и методи за нивна обработка (методи). Неговата структура е специфицирана со тип, кој обично се заснова на класи што се користат во унифицираната .NET Core платформа. Исто така е можно да се работи со објекти COM, CIM (WMI) и ADSI. Потребни се својства и методи за извршување на различни дејства на податоците; покрај тоа, во PowerShell, објектите може да се пренесат како аргументи до функциите и cmdlets, да им се доделат нивните вредности на променливите, а исто така има и механизам за состав на команди (транспортник или цевковод). Секоја команда во цевководот го пренесува својот излез на следната за возврат, објект по објект. За обработка, можете да користите компајлирани cmdlet или да креирате свои напредни функциида врши разни манипулации со објекти во нафтоводот: филтрирање, сортирање, групирање, па дури и менување на нивната структура. Пренесувањето податоци во оваа форма има сериозна предност: тимот што прима не треба да го анализира протокот на бајти (текст), сите потребни информации лесно се враќаат со повикување на соодветни својства и методи.

Преглед на структурата на објектите

На пример, да го извршиме Get-Process cmdlet, кој ви овозможува да добиете информации за процесите што се извршуваат во системот:

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Ќе прикаже некои форматирани текстуални податоци што не даваат никаква идеја за својствата на вратените објекти и нивните методи. За да го подесиме излезот, треба да научиме како да ја испитаме структурата на објектите, а cmdlet-от Get-Member ќе ни помогне во ова:

Get-Process | Get-Member

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Овде веќе ги гледаме типот и структурата, а со помош на дополнителни параметри можеме, на пример, да ги прикажеме само својствата на објектот вклучен во влезот:

Get-Process | Get-Member -MemberType Property

Ова знаење ќе биде потребно за интерактивно решавање на административните проблеми или за пишување сопствени скрипти: на пример, за добивање информации за обесени процеси користејќи го својството Responding.

Филтрирање на објекти

PowerShell дозволува објектите што исполнуваат одреден услов да се пренесуваат низ цевковод:

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

Резултатот од извршувањето на блокот на скрипта во заградите мора да биде булова вредност. Ако е точно ($true), објектот што се внесува во Where-Object cmdlet ќе биде пренесен по линијата, во спротивно ($false) ќе се избрише. На пример, да прикажеме листа на запрени услуги на Windows Server, т.е. оние чие својство Статус е поставено на „Стопено“:

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Овде повторно гледаме текстуална претстава, но ако сакате да го разберете видот и внатрешната структура на предметите што минуваат низ цевководот не е тешко:

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Сортирање на предмети

Кога се обработуваат предмети со цевковод, често има потреба да се сортираат. Сортирај-објект cmdlet ги пренесува имињата на својствата (копчињата за сортирање) и ги враќа објектите подредени според нивните вредности. Лесно е да се сортира излезот од процесите што се извршуваат според времето поминато на процесорот (својство на процесорот):

Get-Process | Sort-Object –Property cpu

Параметарот -Property може да се испушти при повикување на сортирање-објект cmdlet; тој се користи стандардно. За обратно сортирање, користете го параметарот -Descending:

Get-Process | Sort-Object cpu -Descending

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Избор на предмети и нивни делови

cmdlet Select-Object ви овозможува да изберете одреден број на објекти на почетокот или на крајот на цевководот користејќи ги параметрите -First или -Last. Со негова помош, можете да изберете единечни објекти или одредени својства, а исто така да креирате нови објекти врз основа на нив. Ајде да погледнеме како функционира cmdlet користејќи едноставни примери.

Следната команда прикажува информации за 10-те процеси кои трошат максимална количина RAM (својство WS):

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Можете да изберете само одредени својства на објектите што минуваат низ цевководот и да креирате нови врз основа на нив:

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

Како резултат на работата на гасоводот, ќе добиеме нов објект, чија структура ќе се разликува од структурата вратена од cmdlet-от Get-Process. Ајде да го потврдиме ова користејќи Get-Member:

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Имајте на ум дека Select-Object враќа еден објект (-First 1) кој има само две полиња што ги наведовме: нивните вредности беа копирани од првиот објект што беше пренесен во цевководот од Get-Process cmdlet. Еден од начините за креирање објекти во скриптите на PowerShell се заснова на користење на Select-Object:

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Користејќи Select-Object, можете да додадете пресметани својства на објектите што треба да бидат претставени како хаш табели. Во овој случај, вредноста на неговиот прв клуч одговара на името на имотот, а вредноста на вториот клуч одговара на вредноста на својствата за тековниот елемент на гасоводот:

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Ајде да ја погледнеме структурата на предметите што минуваат низ транспортерот:

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

За секој-објект, група-објект и мерка-објект

Постојат и други cmdlet за работа со предмети. Како пример, да разговараме за трите најкорисни:

За секој предмет ви овозможува да извршите код на PowerShell за секој објект во нафтоводот:

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

Група-Објект групира објекти по вредност на имотот:

Group-Object PropertyName

Ако го извршите со параметарот -NoElement, можете да го дознаете бројот на елементи во групите.

Мерка-Објект собира различни резиме параметри по вредности на полето на објектот во цевководот (ја пресметува збирот, а исто така ја наоѓа минималната, максималната или просечната вредност):

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

Вообичаено, дискутираните cmdlet се користат интерактивно и често се креираат во скрипти. функции со блокови за почеток, процес и крај.

Креирање .NET и COM објекти (New-Object)

Има многу софтверски компоненти со .NET Core и COM интерфејси кои се корисни за системските администратори. Користејќи ја класата System.Diagnostics.EventLog, можете да управувате со системските дневници директно од Windows PowerShell. Ајде да погледнеме пример за создавање на пример од оваа класа користејќи го cmdlet New-Object со параметарот -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Бидејќи не наведовме специфичен дневник за настани, добиениот примерок на класата не содржи податоци. За да го промените ова, треба да повикате посебен метод на конструктор за време на неговото создавање користејќи го параметарот -ArgumentList. Ако сакаме да пристапиме до дневникот на апликацијата, треба да ја пренесеме низата „Апликација“ како аргумент на конструкторот:

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Ве молиме имајте предвид дека го зачувавме излезот од командата во променливата $AppLog. Иако цевководите вообичаено се користат во интерактивен режим, пишувањето скрипти често бара одржување на референца на објект. Дополнително, основните класи .NET Core се содржани во именскиот простор на системот: PowerShell стандардно бара одредени типови во него, така што пишувањето Diagnostics.EventLog наместо System.Diagnostics.EventLog е сосема точно.

За да работите со дневникот, можете да ги користите соодветните методи:

$AppLog | Get-Member -MemberType Method

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Да речеме дека е исчистено со методот Clear() ако има права за пристап:

$AppLog.Clear()

cmdlet New-Object исто така се користи за работа со COM компоненти. Ги има доста - од библиотеките испорачани со серверот за скрипти на Windows до апликациите ActiveX, како што е Internet Explorer. За да креирате COM објект, треба да го поставите параметарот -ComObject со програмскиот ProgId од саканата класа:

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

За да креирате сопствени објекти со произволна структура, користењето на New-Object изгледа премногу архаично и незгодно; овој cmdlet се користи за работа со софтверски компоненти надвор од PowerShell. Во идните написи ова прашање ќе се дискутира подетално. Покрај објектите .NET и COM, ќе ги истражуваме и објектите CIM (WMI) и ADSI.

Повикувајќи статични методи

Некои .NET Core класи не може да се инстанцираат, вклучувајќи ги System.Environment и System.Math. Тие се статични и содржат само статички својства и методи. Овие се во суштина референтни библиотеки кои се користат без создавање објекти. Може да се повикате на статична класа преку буквален со приложување на името на типот во квадратни загради. Меѓутоа, ако ја погледнеме структурата на објектот користејќи Get-Member, ќе го видиме типот System.RuntimeType наместо System.Environment:

[System.Environment] | Get-Member

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

За да гледате само статични членови, повикајте го Get-Member со параметарот -Static (забележете го типот на објектот):

[System.Environment] | Get-Member -Static

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

За да пристапите до статички својства и методи, користете две последователни две точки наместо точка по буквалното:

[System.Environment]::OSVersion

Или

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Напишете PSCustomObject

Меѓу бројните типови податоци достапни во PowerShell, вреди да се спомене PSCustomObject, дизајниран за складирање на објекти со произволна структура. Создавањето таков објект со помош на cmdlet New-Object се смета за класичен, но тежок и застарен начин:

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

Ајде да ја погледнеме структурата на објектот:

$object | Get-Member

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Почнувајќи со PowerShell 3.0, достапна е друга синтакса:

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

Можете да пристапите до податоците на еден од еквивалентни начини:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Еве пример за конвертирање на постоечки хаштаб во објект:

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Еден од недостатоците на објектите од овој тип е тоа што редоследот на нивните својства може да се промени. За да го избегнете ова, мора да го користите атрибутот [нарачан]:

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

Постојат и други опции за создавање на објект: погоре погледнавме со користење на cmdlet Изберете-предмет. Сè што останува е да дознаеме додавање и отстранување на елементи. Да се ​​направи ова за објектот од претходниот пример е прилично едноставно:

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

cmdlet-от Add-Member ви овозможува да додавате не само својства, туку и методи на претходно креиран $објект со користење на конструкцијата „-MemberType ScriptMethod“:

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

Ве молиме имајте предвид дека ја користевме променливата $ScriptBlock од типот ScriptBlock за складирање на кодот за новиот метод.

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

За да ги отстраните својствата, користете го соодветниот метод:

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

Создавање свои часови

PowerShell 5.0 воведе можност за дефинирање часови користење на синтакса карактеристична за објектно-ориентирани програмски јазици. Услужниот збор Класа е наменет за ова, по што треба да го наведете името на класата и да го опишете неговото тело во загради на операторот:

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

Ова е вистински .NET Core тип, со тело што ги опишува неговите својства, методи и други елементи. Ајде да погледнеме пример за дефинирање на наједноставната класа:

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

За да креирате објект (пример од класа), користете го cmdlet Нов-Објект, или буквално од типот [MyClass] и псевдостатски метод нов (стандарден конструктор):

$object = New-Object -TypeName MyClass

или

$object = [MyClass]::new()

Ајде да ја анализираме структурата на објектот:

$object | Get-Member

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Не заборавајте за опсегот: не можете да се однесувате на името на типот како низа или да користите буквален тип надвор од скриптата или модулот во кој е дефинирана класата. Во овој случај, функциите можат да враќаат примероци од класи (објекти) кои ќе бидат достапни надвор од модулот или скриптата.

Откако ќе го креирате објектот, пополнете ги неговите својства:

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

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Забележете дека описот на класата ги специфицира не само типовите на својства, туку и нивните стандардни вредности:

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

Описот на методот на класа наликува на описот на функцијата, но без користење на функционалниот збор. Како во функција, параметрите се пренесуваат на методите доколку е потребно:

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

Сега претставникот на нашата класа може да се насмее:

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

Методите може да се преоптоварат; дополнително, класата има статички својства и методи, како и конструктори чии имиња се совпаѓаат со името на самата класа. Класа дефинирана во скрипта или модул PowerShell може да послужи како основа за друг - вака се имплементира наследството. Во овој случај, дозволено е користење на постоечките .NET класи како основни:

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

Нашиот опис за работа со објекти во PowerShell е едвај исцрпен. Во следните публикации, ќе се обидеме да го продлабочиме со практични примери: петтата статија од серијата ќе биде посветена на прашањата за интегрирање на PowerShell со софтверски компоненти од трети страни. Минатите делови може да се најдат на линковите подолу.

Дел 1: Основни карактеристики на Windows PowerShell
Дел 2: Вовед во програмскиот јазик Windows PowerShell
Дел 3: пренесување параметри на скрипти и функции, создавање cmdlets

Што е Windows PowerShell и за што се користи? Дел 4: Работа со предмети, сопствени класи

Извор: www.habr.com

Додадете коментар