Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

PowerShell интерпретатор терезесіндегі пәрмендердің мәтіндік шығысы ақпаратты адамның қабылдауына қолайлы пішінде көрсету тәсілі ғана. Негізі сәрсенбі бағытталған нысандармен жұмыс істеу үшін: командлеттер мен функциялар оларды енгізу және ретінде қабылдайды шығысында қайтып келді, және интерактивті және сценарийлерде қол жетімді айнымалы түрлері .NET сыныптарына негізделген. Топтаманың төртінші мақаласында біз объектілермен жұмыс істеуді толығырақ қарастырамыз.

Мазмұны:

PowerShell ішіндегі нысандар
Объектілердің құрылымын қарау
Объектілерді сүзу
Объектілерді сұрыптау
Объектілерді және олардың бөліктерін таңдау
ForEach-Object, Group-Object және Measure-Object
.NET және COM нысандарын жасау (New-Object)
Статикалық әдістерді шақыру
PSCustomObject теріңіз
Жеке сыныптарыңызды құру

PowerShell ішіндегі нысандар

Еске салайық, объект - бұл деректер өрістерінің (қасиеттер, оқиғалар және т.б.) және оларды өңдеу әдістерінің (әдістердің) жиынтығы. Оның құрылымы әдетте біртұтас .NET Core платформасында пайдаланылатын сыныптарға негізделген түр арқылы көрсетіледі. Сонымен қатар COM, CIM (WMI) және ADSI объектілерімен жұмыс істеуге болады. Деректерде әртүрлі әрекеттерді орындау үшін сипаттар мен әдістер қажет; сонымен қатар, PowerShell бағдарламасында нысандарды функциялар мен командлеттерге дәлел ретінде беруге, олардың мәндерін айнымалыларға тағайындауға болады, сонымен қатар бар. командалық құрам механизмі (конвейер немесе құбыр). Конвейердегі әрбір пәрмен өз шығысын келесіге кезекпен нысан бойынша береді. Өңдеу үшін сіз құрастырылған командлеттерді пайдалана аласыз немесе өзіңізді жасай аласыз кеңейтілген мүмкіндіктерқұбырдағы объектілермен әртүрлі манипуляцияларды орындау: сүзу, сұрыптау, топтау және тіпті олардың құрылымын өзгерту. Бұл пішінде деректерді жіберудің елеулі артықшылығы бар: қабылдаушы топқа байт ағынын (мәтінін) талдау қажет емес, барлық қажетті ақпарат сәйкес қасиеттер мен әдістерді шақыру арқылы оңай алынады.

Объектілердің құрылымын қарау

Мысалы, жүйеде іске қосылған процестер туралы ақпаратты алуға мүмкіндік беретін Get-Process командлетін іске қосайық:

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

Ол қайтарылған нысандардың қасиеттері мен олардың әдістері туралы ешқандай түсінік бермейтін кейбір пішімделген мәтіндік деректерді көрсетеді. Шығарылымды дәл баптау үшін біз нысандардың құрылымын зерттеуді үйренуіміз керек және Get-Member командлеті бізге осыған көмектеседі:

Get-Process | Get-Member

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

Мұнда біз қазірдің өзінде түрі мен құрылымын көреміз және қосымша параметрлердің көмегімен, мысалы, енгізуге енгізілген объектінің тек қасиеттерін көрсете аламыз:

Get-Process | Get-Member -MemberType Property

Бұл білім басқару мәселелерін интерактивті түрде шешу немесе өзіңіздің сценарийлеріңізді жазу үшін қажет болады: мысалы, Responding сипатын пайдаланып ілулі процестер туралы ақпаратты алу.

Объектілерді сүзу

PowerShell белгілі бір шартты қанағаттандыратын нысандарды құбыр арқылы өткізуге мүмкіндік береді:

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

Жақша ішіндегі сценарий блогын орындау нәтижесі логикалық мән болуы керек. Егер ол ақиқат болса ($true), Қайда-Объект командлетіне енгізілген нысан құбыр бойымен жіберіледі, әйтпесе ($false) жойылады. Мысалы, тоқтатылған Windows Server қызметтерінің тізімін көрсетейік, яғни. Status сипаты «Тоқтатылған» күйіне орнатылғандар:

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

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

Мұнда біз тағы да мәтіндік бейнені көреміз, бірақ құбыр арқылы өтетін нысандардың түрі мен ішкі құрылымын түсінгіңіз келсе, бұл қиын емес:

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

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

Объектілерді сұрыптау

Объектілерді құбырмен өңдеу кезінде жиі оларды сұрыптау қажеттілігі туындайды. Sort-Object командлеті сипаттар аттары (сұрыптау кілттері) беріледі және олардың мәндері бойынша реттелген нысандарды қайтарады. Жұмыс істеп тұрған процестердің шығысын жұмсалған CPU уақыты бойынша сұрыптау оңай (cpu қасиеті):

Get-Process | Sort-Object –Property cpu

Sort-Object командлетін шақырғанда -Property параметрін өткізіп жіберуге болады, ол әдепкі бойынша пайдаланылады. Кері сұрыптау үшін -Кему параметрін пайдаланыңыз:

Get-Process | Sort-Object cpu -Descending

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

Объектілерді және олардың бөліктерін таңдау

Select-Object командлеті -Бірінші немесе -Соңғы параметрлерін пайдаланып құбырдың басындағы немесе соңындағы нысандардың белгілі бір санын таңдауға мүмкіндік береді. Оның көмегімен сіз жеке объектілерді немесе белгілі бір қасиеттерді таңдай аласыз, сонымен қатар олардың негізінде жаңа объектілерді жасай аласыз. Қарапайым мысалдар арқылы командлет қалай жұмыс істейтінін қарастырайық.

Келесі пәрмен ЖЖҚ (WS сипаты) максималды көлемін тұтынатын 10 процесс туралы ақпаратты көрсетеді:

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

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

Құбыр арқылы өтетін объектілердің белгілі бір қасиеттерін ғана таңдап, олардың негізінде жаңаларын жасауға болады:

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

Құбырдың жұмысы нәтижесінде құрылымы Get-Process командлеті қайтарған құрылымнан ерекшеленетін жаңа нысанды аламыз. Мұны Get-мүшесі арқылы тексерейік:

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

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

Select-Object біз көрсеткен өрістердің екеуі ғана бар бір нысанды (-Бірінші 1) қайтаратынын ескеріңіз: олардың мәндері Get-Process командлеті арқылы құбырға жіберілген бірінші нысаннан көшірілді. 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-бөлім: Объектілермен жұмыс, өз сыныптары

ForEach-Object, Group-Object және Measure-Object

Объектілермен жұмыс істеуге арналған басқа командлеттер бар. Мысал ретінде ең пайдалы үш туралы сөйлесейік:

ForEach-Object құбырдағы әрбір нысан үшін PowerShell кодын іске қосуға мүмкіндік береді:

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

Топ-объект объектілерді сипат мәні бойынша топтастырады:

Group-Object PropertyName

Егер сіз оны -NoElement параметрімен іске қоссаңыз, топтардағы элементтердің санын білуге ​​болады.

Өлшем-объект құбырдағы нысан өрісінің мәндері бойынша әртүрлі жиынтық параметрлерді біріктіреді (қосынды есептейді, сонымен қатар ең төменгі, максималды немесе орташа мәнді табады):

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

Әдетте, талқыланатын командлеттер интерактивті түрде пайдаланылады және көбінесе сценарийлерде жасалады. функциялары Begin, Process және End блоктарымен.

.NET және COM нысандарын жасау (New-Object)

Жүйе әкімшілеріне пайдалы .NET Core және COM интерфейстері бар көптеген бағдарламалық құрал құрамдастары бар. System.Diagnostics.EventLog сыныбын пайдалану арқылы жүйелік журналдарды тікелей Windows PowerShell бағдарламасынан басқаруға болады. -TypeName параметрі бар New-Object командлетін пайдаланып осы класс данасын жасау мысалын қарастырайық:

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 әдепкі бойынша ондағы көрсетілген түрлерді іздейді, сондықтан System.Diagnostics.EventLog орнына Diagnostics.EventLog жазу өте дұрыс.

Журналмен жұмыс істеу үшін сәйкес әдістерді қолдануға болады:

$AppLog | Get-Member -MemberType Method

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

Қол жеткізу құқықтары бар болса, ол Clear() әдісімен тазартылды делік:

$AppLog.Clear()

New-Object командлеті COM құрамдастарымен жұмыс істеу үшін де пайдаланылады. Олардың өте көп - Windows сценарий серверімен қамтамасыз етілген кітапханалардан бастап, Internet Explorer сияқты ActiveX қолданбаларына дейін. 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 пайдалану тым архаикалық және қиын болып көрінеді; бұл командлет PowerShell бағдарламасына сыртқы бағдарламалық құрал құрамдастарымен жұмыс істеу үшін пайдаланылады. Болашақ мақалаларда бұл мәселе толығырақ талқыланады. .NET және COM нысандарынан басқа, біз CIM (WMI) және ADSI нысандарын да зерттейміз.

Статикалық әдістерді шақыру

Кейбір .NET Core сыныптарын құру мүмкін емес, соның ішінде System.Environment және System.Math. Олар статикалық және тек статикалық қасиеттер мен әдістерді қамтиды. Бұл негізінен объектілерді жасамай пайдаланылатын анықтамалық кітапханалар. Түр атауын төртбұрышты жақшаға алу арқылы статикалық сыныпқа литерал арқылы сілтеме жасай аласыз. Алайда Get-Member арқылы нысанның құрылымын қарастырсақ, System.Environment орнына System.RuntimeType түрін көреміз:

[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-ті атап өткен жөн. 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-бөлім: Объектілермен жұмыс, өз сыныптары

Бұл типтегі объектілердің кемшіліктерінің бірі олардың қасиеттерінің реті өзгеруі мүмкін. Бұған жол бермеу үшін [ordered] төлсипатын пайдалану керек:

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

Нысан жасаудың басқа нұсқалары бар: жоғарыда командлетті пайдалануды қарастырдық Нысанды таңдау. Тек элементтерді қосу және жоюды анықтау ғана қалады. Мұны алдыңғы мысалдағы нысан үшін жасау өте қарапайым:

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

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

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 қызметтік сөзі арналған, содан кейін класс атын көрсетіп, оның денесін оператор жақшаларында сипаттау керек:

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

Бұл оның қасиеттерін, әдістерін және басқа элементтерін сипаттайтын денесі бар шынайы .NET Core түрі. Ең қарапайым классты анықтаудың мысалын қарастырайық:

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

Нысан (сынып данасы) жасау үшін командлетті пайдаланыңыз Жаңа нысан, немесе [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-бөлім: сценарийлер мен функцияларға параметрлерді беру, командлеттерді жасау

Windows PowerShell дегеніміз не және ол не үшін қолданылады? 4-бөлім: Объектілермен жұмыс, өз сыныптары

Ақпарат көзі: www.habr.com

пікір қалдыру