Windows PowerShell чист ва он барои чӣ истифода мешавад? Қисми 4: Кор бо объектҳо, синфҳои худ

Windows PowerShell чист ва он барои чӣ истифода мешавад? Қисми 4: Кор бо объектҳо, синфҳои худ

Натиҷаи матни фармонҳо дар равзанаи тарҷумони PowerShell танҳо як роҳи намоиши иттилоот дар шакли барои дарки инсон мувофиқ аст. Дар асл чоршанбе нигаронида шудааст барои кор бо объектҳо: cmdlets ва функсияҳо онҳоро ҳамчун вуруд қабул мекунанд ва дар баромад баргашт, ва намудҳои тағирёбандаҳо, ки ба таври интерактивӣ ва дар скриптҳо дастрасанд, ба синфҳои .NET асос ёфтаанд. Дар мақолаи чоруми силсила мо кор бо объектҳоро муфассалтар меомӯзем.

Мундариҷа:

Объектҳо дар PowerShell
Намоиши сохтори объектҳо
Филтр кардани объектҳо
Ҷойгиркунии объектҳо
Интихоби объектҳо ва қисмҳои онҳо
ForEach-Object, Group-Object ва Measure-Object
Эҷоди объектҳои .NET ва COM (New-Object)
Даъват ба усулҳои статикӣ
PSCustomObject-ро нависед
Эҷоди синфҳои шахсии худ

Объектҳо дар PowerShell

Ёдовар мешавем, ки объект маҷмӯи майдонҳои додаҳо (хусусиятҳо, рӯйдодҳо ва ғ.) ва усулҳои коркарди онҳо (методҳо) мебошад. Сохтори он аз рӯи намуд муайян карда мешавад, ки одатан ба синфҳои дар платформаи ягонаи .NET Core истифодашаванда асос меёбад. Инчунин бо объектҳои COM, CIM (WMI) ва ADSI кор кардан мумкин аст. Хусусиятҳо ва усулҳо барои иҷрои амалҳои гуногун дар додаҳо лозиманд; Илова бар ин, дар PowerShell, объектҳоро метавон ҳамчун далел ба функсияҳо ва cmdletҳо интиқол дод, арзишҳои онҳоро ба тағирёбандаҳо таъин кард ва инчунин вуҷуд дорад. механизми таркиби фармон (конвейер ё қубур). Ҳар як фармони қубур баромади худро бо навбат ба объект ба объект интиқол медиҳад. Шумо метавонед cmdlet-ҳои тартибдодашударо барои коркард истифода баред ё худ эҷод кунед хусусиятҳои пешрафтаки бо объектхои дар трубопровод буда кор карда баромадани гуногун: филтр кардан, ба навъхо чудо кардан, гуруххо чудо кардан ва хатто тагьир додани сохти онхо. Интиқоли маълумот дар ин шакл бартарии ҷиддӣ дорад: ба гурӯҳи қабулкунанда лозим нест, ки ҷараёни байт (матн) таҳлил кунад, тамоми маълумоти зарурӣ бо даъват кардани хосиятҳо ва усулҳои мувофиқ ба осонӣ гирифта мешавад.

Намоиши сохтори объектҳо

Масалан, биёед cmdlet-и Get-Process-ро иҷро кунем, ки ба шумо имкон медиҳад маълумотро дар бораи равандҳои дар система иҷрошаванда ба даст оред:

Windows PowerShell чист ва он барои чӣ истифода мешавад? Қисми 4: Кор бо объектҳо, синфҳои худ

Он баъзе маълумотҳои матнии форматшударо намоиш медиҳад, ки дар бораи хосиятҳои объектҳои баргардонидашуда ва усулҳои онҳо тасаввурот намедиҳад. Барои дуруст танзим кардани натиҷа, мо бояд тарзи тафтиш кардани сохтори объектҳоро омӯзем ва cmdlet Get-Member дар ин кор ба мо кӯмак мекунад:

Get-Process | Get-Member

Windows PowerShell чист ва он барои чӣ истифода мешавад? Қисми 4: Кор бо объектҳо, синфҳои худ

Дар ин ҷо мо аллакай намуд ва сохторро мебинем ва бо ёрии параметрҳои иловагӣ мо метавонем, масалан, танҳо хосиятҳои объекти ба вуруд дохилшударо намоиш диҳем:

Get-Process | Get-Member -MemberType Property

Ин дониш барои ҳалли интерактивии масъалаҳои маъмурӣ ё навиштани скриптҳои шахсии шумо лозим аст: масалан, барои гирифтани маълумот дар бораи равандҳои овезон бо истифода аз моликияти Responding.

Филтр кардани объектҳо

PowerShell имкон медиҳад, ки объектҳое, ки ба шарти муайян мувофиқанд, тавассути қубур гузаранд:

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

Натиҷаи иҷрои блоки скрипт дар дохили қавс бояд арзиши мантиқӣ бошад. Агар ин дуруст бошад ($true), объекте, ки ба cmdlet дар куҷо-Объект ворид карда мешавад, дар қад-қади қубур интиқол дода мешавад, вагарна ($дурӯғ) он нест карда мешавад. Масалан, биёед рӯйхати хидматҳои қатъшудаи Windows Server-ро намоиш диҳем, яъне. онҳое, ки амволи Статуси онҳо ба "Қатъ шудааст" гузошта шудааст:

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

Ҳангоми занг задан ба cmdlet Sort-Object параметри -Property мумкин аст сарфи назар карда шавад; он бо нобаёнӣ истифода мешавад. Барои мураттабсозии баръакс, параметри -Дастшавиро истифода баред:

Get-Process | Sort-Object cpu -Descending

Windows PowerShell чист ва он барои чӣ истифода мешавад? Қисми 4: Кор бо объектҳо, синфҳои худ

Интихоби объектҳо ва қисмҳои онҳо

Командлети Интихоб-Объект ба шумо имкон медиҳад, ки шумораи мушаххаси объектҳоро дар аввал ё охири қубур бо истифода аз параметрҳои -Аввал ё -охирин интихоб кунед. Бо ёрии он шумо метавонед объектҳои алоҳида ё хосиятҳои муайянро интихоб кунед ва инчунин дар асоси онҳо объектҳои нав эҷод кунед. Биёед бубинем, ки чӣ тавр 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 як объекти ягонаро (-Аввал 1) бар мегардонад, ки танҳо ду майдонҳои муайянкардаи мо дорад: арзишҳои онҳо аз объекти аввалине, ки тавассути cmdlet 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

Одатан, 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 даъват кунед. Агар мо хоҳем, ки ба сабти барнома дастрасӣ пайдо кунем, мо бояд сатри "Application" -ро ҳамчун аргумент ба созанда гузаронем:

$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()

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.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-ро зикр кард, ки барои нигоҳ доштани объектҳо бо сохтори худсарона пешбинӣ шудааст. Эҷоди чунин объект бо истифода аз 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: Кор бо объектҳо, синфҳои худ

Яке аз нуқсонҳои объектҳои ин намуд он аст, ки тартиби хосиятҳои онҳо метавонад тағир ёбад. Барои пешгирӣ кардани ин, шумо бояд атрибути [ordered] -ро истифода баред:

$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: Кор бо объектҳо, синфҳои худ

Командлети 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
}

Барои сохтани объект (мисоли синф) 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: Кор бо объектҳо, синфҳои худ

Манбаъ: will.com

Илова Эзоҳ