PowerShell котормочу терезесиндеги буйруктардын тексттик чыгышы маалыматты адамдын кабылдоосуна ылайыктуу формада көрсөтүүнүн бир жолу. Негизи шаршемби
Мазмуну:
PowerShell ичиндеги объекттер
Эске салсак, объект бул маалымат талааларынын (касиеттери, окуялары ж.б.) жана аларды иштетүү ыкмаларынын (методдор) жыйындысы. Анын түзүмү түрү боюнча көрсөтүлөт, ал адатта бирдиктүү .NET Core платформасында колдонулган класстарга негизделген. Ошондой эле COM, CIM (WMI) жана ADSI объекттери менен иштөөгө болот. Берилиштер боюнча ар кандай аракеттерди аткаруу үчүн касиеттер жана ыкмалар керек; Мындан тышкары, PowerShellде объекттер функцияларга жана командлеттерге аргумент катары берилиши мүмкүн, алардын баалуулуктары өзгөрмөлөргө ыйгарылган, ошондой эле бар.
Объекттердин структурасын көрүү
Мисалы, Get-Process командлетин иштетели, ал системада иштеп жаткан процесстер жөнүндө маалымат алууга мүмкүндүк берет:
Ал кайтарылган объекттердин касиеттери жана алардын ыкмалары жөнүндө эч кандай түшүнүк бербеген кээ бир форматталган текст маалыматтарын көрсөтөт. Чыгарууну тактоо үчүн биз объекттердин структурасын изилдөөнү үйрөнүшүбүз керек жана Get-Müşe cmdlet бул жагынан бизге жардам берет:
Get-Process | Get-Member
Бул жерде биз түрүн жана структурасын көрүп жатабыз жана кошумча параметрлердин жардамы менен, мисалы, киргизүүгө киргизилген объекттин гана касиеттерин көрсөтө алабыз:
Get-Process | Get-Member -MemberType Property
Бул билим башкаруу маселелерин интерактивдүү чечүү үчүн же өзүңүздүн скриптиңизди жазуу үчүн керек болот: мисалы, Responding касиетин колдонуу менен илинген процесстер жөнүндө маалымат алуу.
Объекттерди чыпкалоо
PowerShell белгилүү бир шартка жооп берген объекттерди түтүк аркылуу өткөрүүгө мүмкүндүк берет:
Where-Object { блок сценария }
Кашанын ичиндеги скрипт блогун аткаруунун натыйжасы логикалык маани болушу керек. Эгер ал чын болсо ($true), Кайда-Объект комдлетине киргизилген объект конвейер боюнча өткөрүлөт, антпесе ($false) жок кылынат. Мисалы, токтоп калган Windows Server кызматтарынын тизмесин көрсөтөлү, б.а. Status касиети "Токтоду" деп коюлгандар:
Get-Service | Where-Object {$_.Status -eq "Stopped"}
Бул жерде дагы бир тексттик сүрөттөлүштү көрөбүз, бирок сиз түтүк аркылуу өткөн объекттердин түрүн жана ички түзүлүшүн түшүнгүңүз келсе, бул кыйын эмес:
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Get-Member
Объекттерди сорттоо
Объекттерди түтүк жолу менен иштетүүдө көп учурда аларды сорттоо зарылчылыгы келип чыгат. Sort-Object командлетине касиеттердин аттары (сорттоочу ачкычтар) берилет жана объекттерди алардын маанилери боюнча иреттелген кайтарат. Иштеп жаткан процесстердин жыйынтыгын CPU убактысына жараша сорттоо оңой (cpu касиети):
Get-Process | Sort-Object –Property cpu
Sort-Object командлетин чакырганда -Property параметрин өткөрүп жиберүүгө болот; ал демейки боюнча колдонулат. Тескери сорттоо үчүн -Төмөндөө параметрин колдонуңуз:
Get-Process | Sort-Object cpu -Descending
Объекттерди жана алардын бөлүктөрүн тандоо
Select-Object командлети -Биринчи же -Акыркы параметрлерди колдонуу менен түтүктүн башында же аягында объекттердин белгилүү санын тандоого мүмкүндүк берет. Анын жардамы менен сиз жалгыз объекттерди же белгилүү касиеттерди тандап, ошондой эле алардын негизинде жаңы объекттерди түзө аласыз. Келгиле, жөнөкөй мисалдарды колдонуу менен cmdlet кантип иштээрин карап көрөлү.
Төмөнкү команда RAMдын максималдуу көлөмүн (WS касиети) керектөөчү 10 процесс жөнүндө маалыматты көрсөтөт:
Get-Process | Sort-Object WS -Descending | Select-Object -First 10
Сиз түтүк аркылуу өткөн объекттердин айрым гана касиеттерин тандап, алардын негизинде жаңыларын түзө аласыз:
Get-Process | Select-Object ProcessName, Id -First 1
Түтүктүн иштешинин натыйжасында биз жаңы объектти алабыз, анын түзүмү Get-Process командлети кайтарган структурадан айырмаланат. Келиңиз, муну Get-мүчөсү аркылуу текшерели:
Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member
Select-Object биз көрсөткөн эки талааны гана камтыган бир объектти (-Биринчи 1) кайтарарын эске алыңыз: алардын маанилери Get-Process комдлети аркылуу түтүккө өткөн биринчи объекттен көчүрүлдү. PowerShell скрипттеринде объекттерди түзүүнүн жолдорунун бири Select-Object колдонууга негизделген:
$obj = Get-Process | Select-Object ProcessName, Id -First 1
$obj.GetType()
Select-Object колдонуп, сиз катары көрсөтүлүшү керек болгон объекттерге эсептелген касиеттерди кошо аласыз
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Конвейер аркылуу өтүүчү объектилердин түзүлүшүн карап көрөлү:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
ForEach-Object, Group-Object жана Measure-Object
Объекттер менен иштөө үчүн башка комдлеттер бар. Мисал катары, эң пайдалуу үчөө жөнүндө сүйлөшөлү:
ForEach-Object түтүктөгү ар бир объект үчүн PowerShell кодун иштетүүгө мүмкүндүк берет:
ForEach-Object { блок сценария }
Топ-объект объекттерди менчик наркы боюнча топтор:
Group-Object PropertyName
Эгер сиз аны -NoElement параметри менен иштетсеңиз, топтордогу элементтердин санын биле аласыз.
Өлчөм-объект түтүктөгү объект талаасынын маанилери боюнча ар кандай жыйынтыктоочу параметрлерди бириктирет (сумманы эсептейт, ошондой эле минималдуу, максималдуу же орточо маанини табат):
Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum
Эреже катары, талкууланган cmdlets интерактивдүү колдонулат жана көбүнчө сценарийлерде түзүлөт.
.NET жана COM объекттерин түзүү (New-Object)
Системалык администраторлор үчүн пайдалуу болгон .NET Core жана COM интерфейстери бар көптөгөн программалык камсыздоо компоненттери бар. System.Diagnostics.EventLog классын колдонуу менен сиз система журналдарын түздөн-түз Windows PowerShellден башкара аласыз. Келгиле, -TypeName параметри менен New-Object командлетинин жардамы менен бул класстын үлгүсүн түзүүнүн мисалын карап көрөлү:
New-Object -TypeName System.Diagnostics.EventLog
Биз конкреттүү окуялар журналын көрсөтпөгөндүктөн, класстын жыйынтыгында эч кандай маалымат жок. Муну өзгөртүү үчүн -ArgumentList параметрин колдонуу менен аны түзүү учурунда атайын конструктор ыкмасын чакырышыңыз керек. Эгерде биз тиркеме журналына кирүүнү кааласак, конструкторго аргумент катары "Колдонмо" сабын беришибиз керек:
$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application
$AppLog
Биз буйруктун жыйынтыгын $AppLog өзгөрмөсүндө сактаганыбызды эске алыңыз. Түтүк өткөргүчтөр көбүнчө интерактивдүү режимде колдонулса да, скрипттерди жазуу көбүнчө объектке шилтемени сактоону талап кылат. Кошумча, негизги .NET Core класстары Системанын аттар мейкиндигинде камтылган: PowerShell демейки боюнча андагы көрсөтүлгөн типтерди издейт, андыктан System.Diagnostics.EventLog ордуна Diagnostics.EventLog жазуу абдан туура.
журналы менен иштөө үчүн, сиз тиешелүү ыкмаларды колдоно аласыз:
$AppLog | Get-Member -MemberType Method
Кирүү укуктары бар болсо, ал Clear() ыкмасы менен тазаланды дейли:
$AppLog.Clear()
New-Object командлети COM компоненттери менен иштөө үчүн да колдонулат. Алардын саны абдан көп - Windows скрипт сервери менен камсыздалган китепканалардан баштап, Internet Explorer сыяктуу ActiveX тиркемелерине чейин. COM объектисин түзүү үчүн, сиз каалаган класстын программалык ProgId менен -ComObject параметрин коюшуңуз керек:
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. Алар
[System.Environment] | Get-Member
Статикалык мүчөлөрдү гана көрүү үчүн Get-Member дегенге -Static параметри менен чалыңыз (объекттин түрүнө көңүл буруңуз):
[System.Environment] | Get-Member -Static
Статикалык касиеттерге жана методдорго жетүү үчүн сөзмө-сөздөн кийинки чекиттин ордуна эки катарлаш кош чекиттерди колдонуңуз:
[System.Environment]::OSVersion
же
$test=[System.Math]::Sqrt(25)
$test
$test.GetType()
PSCustomObject териңиз
PowerShellде жеткиликтүү болгон көп сандаган маалымат түрлөрүнүн ичинен PSCustomObjectти белгилей кетүү керек, ыктыярдуу түзүлүш менен объекттерди сактоо үчүн иштелип чыккан. New-Object командлетинин жардамы менен мындай объектти түзүү классикалык, бирок түйшүктүү жана эскирген ыкма болуп эсептелет:
$object = New-Object –TypeName PSCustomObject -Property @{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'}
Объекттин түзүлүшүн карап көрөлү:
$object | Get-Member
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()
Бул типтеги объекттердин кемчиликтеринин бири алардын касиеттеринин тартиби өзгөрүшү мүмкүн. Мунун алдын алуу үчүн, сиз [ordered] атрибутун колдонушуңуз керек:
$object = [PSCustomObject][ordered]@{Name = 'Ivan Danko';
City = 'Moscow';
Country = 'Russia'
}
Объектти түзүүнүн башка варианттары бар: жогоруда биз cmdlet колдонууну карадык
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
Add-Müşe командлети "-MemberType ScriptMethod" конструкциясын колдонуу менен мурда түзүлгөн $объектке касиеттерди гана эмес, методдорду да кошууга мүмкүндүк берет:
$ScriptBlock = {
# код
}
$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock
$object | Get-Member
Жаңы ыкманын кодун сактоо үчүн ScriptBlock түрүндөгү $ScriptBlock өзгөрмөсүн колдонгонубузду эске алыңыз.
касиеттерин алып салуу үчүн, тиешелүү ыкманы колдонушат:
$object.psobject.properties.remove('Name')
Өзүңүздүн класстарыңызды түзүү
PowerShell 5.0 аныктоо мүмкүнчүлүгүн киргизди
class MyClass
{
# тело класса
}
Бул чыныгы .NET Core түрү, анын касиеттерин, ыкмаларын жана башка элементтерин сүрөттөгөн денеси бар. Эң жөнөкөй классты аныктоонун мисалын карап көрөлү:
class MyClass
{
[string]$Name
[string]$City
[string]$Country
}
Объектти (класстын инстанциясын) түзүү үчүн, cmdlet колдонуңуз
$object = New-Object -TypeName MyClass
же
$object = [MyClass]::new()
Объекттин түзүлүшүн талдап көрөлү:
$object | Get-Member
Колдонуу чөйрөсү жөнүндө унутпаңыз: типтин аталышын сап катары атай албайсыз же класс аныкталган скрипттен же модулдан тышкары типтин литералын колдоно албайсыз. Бул учурда, функциялар модулдан же скрипттен тышкары жеткиликтүү боло турган класс инстанцияларын (объекттерди) кайтара алат.
Объектти түзгөндөн кийин анын касиеттерин толтуруңуз:
$object.Name = 'Ivan Danko'
$object.City = 'Moscow'
$object.Country = 'Russia'
$object
Класстын сыпаттамасы менчиктин түрлөрүн гана эмес, ошондой эле алардын демейки маанилерин да белгилей турганын эске алыңыз:
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)
Методдор ашыкча жүктөлүшү мүмкүн; Мындан тышкары, класс бар
class MyClass2 : MyClass
{
#тело нового класса, базовым для которого является MyClass
}
[MyClass2]::new().Smile($true)
PowerShellдеги объектилер менен иштөө сүрөттөлүшүбүз толук эмес. Кийинки басылмаларда биз аны практикалык мисалдар менен тереңдетүүгө аракет кылабыз: сериядагы бешинчи макала PowerShell программасын үчүнчү тараптын программалык камсыздоо компоненттери менен интеграциялоо маселелерине арналат. Өткөн бөлүктөрдү төмөнкү шилтемелерден тапса болот.
Source: www.habr.com