Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

PowerShell tarjimoni oynasidagi buyruqlarning matn chiqishi shunchaki ma'lumotni inson idrokiga mos keladigan shaklda ko'rsatish usulidir. Aslida chorshanba yo'naltirilgan ob'ektlar bilan ishlash uchun: cmdletlar va funktsiyalar ularni kirish va sifatida qabul qiladi chiqishda qaytib keldi, va interaktiv va skriptlarda mavjud bo'lgan o'zgaruvchilar turlari .NET sinflariga asoslangan. Seriyaning to'rtinchi maqolasida biz ob'ektlar bilan ishlashni batafsilroq o'rganamiz.

Oglavlenie:

PowerShell'dagi ob'ektlar
Ob'ektlarning tuzilishini ko'rish
Ob'ektlarni filtrlash
Ob'ektlarni saralash
Ob'ektlar va ularning qismlarini tanlash
ForEach-Object, Group-Object va Measure-Object
.NET va COM obyektlarini yaratish (New-Object)
Statik usullarni chaqirish
PSCustomObject yozing
O'z sinflaringizni yaratish

PowerShell'dagi ob'ektlar

Eslatib o'tamiz, ob'ekt ma'lumotlar maydonlari (xususiyatlar, hodisalar va boshqalar) va ularni qayta ishlash usullari (usullari) yig'indisidir. Uning tuzilishi odatda birlashgan .NET Core platformasida ishlatiladigan sinflarga asoslangan tur bilan belgilanadi. COM, CIM (WMI) va ADSI obyektlari bilan ishlash ham mumkin. Ma'lumotlar ustida turli xil harakatlarni bajarish uchun xususiyatlar va usullar kerak; bundan tashqari, PowerShell-da ob'ektlar funktsiyalar va cmdletlarga argument sifatida berilishi, o'zgaruvchilarga ularning qiymatlarini belgilashi mumkin, shuningdek, mavjud. buyruqlar tuzish mexanizmi (konveyer yoki quvur liniyasi). Quvur liniyasidagi har bir buyruq ob'ekt bo'yicha o'z chiqishini navbatdagisiga o'tkazadi. Qayta ishlash uchun kompilyatsiya qilingan cmdletlardan foydalanishingiz yoki o'zingizni yaratishingiz mumkin rivojlangan xususiyatlarquvur liniyasidagi ob'ektlar bilan turli xil manipulyatsiyalarni bajarish: filtrlash, saralash, guruhlash va hatto ularning tuzilishini o'zgartirish. Ushbu shaklda ma'lumotlarni uzatish jiddiy afzalliklarga ega: qabul qiluvchi guruhga bayt oqimini (matnni) tahlil qilish kerak emas, barcha kerakli ma'lumotlar tegishli xususiyatlar va usullarni chaqirish orqali osongina olinadi.

Ob'ektlarning tuzilishini ko'rish

Masalan, tizimda ishlayotgan jarayonlar haqida ma'lumot olish imkonini beruvchi Get-Process cmdletini ishga tushiramiz:

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

U qaytarilgan ob'ektlarning xususiyatlari va ularning usullari haqida hech qanday tasavvurga ega bo'lmagan ba'zi formatlangan matn ma'lumotlarini ko'rsatadi. Chiqarishni aniq sozlash uchun biz ob'ektlar tuzilishini tekshirishni o'rganishimiz kerak va Get-Member cmdlet bu borada bizga yordam beradi:

Get-Process | Get-Member

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Bu erda biz allaqachon turi va tuzilishini ko'ramiz va qo'shimcha parametrlar yordamida, masalan, kirishga kiritilgan ob'ektning faqat xususiyatlarini ko'rsatishimiz mumkin:

Get-Process | Get-Member -MemberType Property

Ushbu bilim ma'muriyat muammolarini interaktiv tarzda hal qilish yoki o'z skriptlaringizni yozish uchun kerak bo'ladi: masalan, Responding xususiyatidan foydalangan holda osilgan jarayonlar haqida ma'lumot olish uchun.

Ob'ektlarni filtrlash

PowerShell ma'lum bir shartga javob beradigan ob'ektlarni quvur liniyasi orqali o'tkazishga imkon beradi:

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

Qavslar ichidagi skript blokini bajarish natijasi mantiqiy qiymat bo'lishi kerak. Agar bu rost bo'lsa ($true), Where-Object cmdletiga kiritilgan ob'ekt quvur liniyasi bo'ylab uzatiladi, aks holda ($false) o'chiriladi. Misol uchun, to'xtatilgan Windows Server xizmatlarining ro'yxatini ko'rsatamiz, ya'ni. Status xususiyati "To'xtatildi" ga o'rnatilganlar:

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Bu erda biz yana matnli tasvirni ko'ramiz, lekin agar siz quvur orqali o'tadigan ob'ektlarning turi va ichki tuzilishini tushunishni istasangiz, bu qiyin emas:

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Ob'ektlarni saralash

Ob'ektlarni quvurlarni qayta ishlashda ko'pincha ularni saralash kerak bo'ladi. Sort-Object cmdletiga xususiyatlar nomlari (tartiblash kalitlari) uzatiladi va ularning qiymatlari bo'yicha tartiblangan ob'ektlarni qaytaradi. Ishlayotgan jarayonlarning chiqishini sarflangan CPU vaqti bo'yicha saralash oson (cpu xususiyati):

Get-Process | Sort-Object –Property cpu

Sort-Object cmdletini chaqirganda -Property parametrini o'tkazib yuborish mumkin, u sukut bo'yicha ishlatiladi. Teskari saralash uchun -Kamuvchi parametrdan foydalaning:

Get-Process | Sort-Object cpu -Descending

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Ob'ektlar va ularning qismlarini tanlash

Select-Object cmdlet -First yoki -Oxirgi parametrlari yordamida quvur liniyasi boshida yoki oxirida ma'lum miqdordagi ob'ektlarni tanlash imkonini beradi. Uning yordami bilan siz alohida ob'ektlarni yoki ma'lum xususiyatlarni tanlashingiz, shuningdek, ular asosida yangi ob'ektlar yaratishingiz mumkin. Keling, oddiy misollar yordamida cmdlet qanday ishlashini ko'rib chiqaylik.

Quyidagi buyruq maksimal RAM miqdorini iste'mol qiladigan 10 ta jarayon haqidagi ma'lumotlarni ko'rsatadi (WS xususiyati):

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Siz quvur liniyasi orqali o'tadigan ob'ektlarning faqat ma'lum xususiyatlarini tanlashingiz va ular asosida yangilarini yaratishingiz mumkin:

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

Quvurning ishlashi natijasida biz yangi ob'ektni olamiz, uning tuzilishi Get-Process cmdleti tomonidan qaytarilgan strukturadan farq qiladi. Keling, buni Get-Member yordamida tasdiqlaymiz:

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

E'tibor bering, Select-Object biz ko'rsatgan ikkita maydonga ega bo'lgan bitta ob'ektni (-Birinchi 1) qaytaradi: ularning qiymatlari Get-Process cmdlet orqali quvur liniyasiga o'tkazilgan birinchi ob'ektdan ko'chirildi. PowerShell skriptlarida ob'ektlarni yaratish usullaridan biri Select-Object-dan foydalanishga asoslangan:

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Select-Object-dan foydalanib, sifatida ifodalanishi kerak bo'lgan ob'ektlarga hisoblangan xususiyatlarni qo'shishingiz mumkin hash jadvallari. Bunday holda, uning birinchi kalitining qiymati xususiyat nomiga mos keladi va ikkinchi kalitning qiymati joriy quvur liniyasi elementining xususiyat qiymatiga mos keladi:

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Keling, konveyerdan o'tadigan ob'ektlarning tuzilishini ko'rib chiqaylik:

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

ForEach-Object, Group-Object va Measure-Object

Ob'ektlar bilan ishlash uchun boshqa cmdletlar mavjud. Misol sifatida, keling, uchta eng foydali haqida gapiraylik:

ForEach-Object quvur liniyasidagi har bir ob'ekt uchun PowerShell kodini ishga tushirishga imkon beradi:

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

Guruh-ob'ekt ob'ektlarni mulk qiymati bo'yicha guruhlash:

Group-Object PropertyName

Agar siz uni -NoElement parametri bilan ishga tushirsangiz, guruhlardagi elementlar sonini bilib olishingiz mumkin.

O'lchov-ob'ekt quvur liniyasidagi ob'ekt maydoni qiymatlari bo'yicha turli xil umumiy parametrlarni jamlaydi (yig'indini hisoblaydi, shuningdek, minimal, maksimal yoki o'rtacha qiymatni topadi):

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

Odatda, muhokama qilingan cmdletlar interaktiv tarzda qo'llaniladi va ko'pincha skriptlarda yaratiladi. vazifalari Begin, Process va End bloklari bilan.

.NET va COM obyektlarini yaratish (New-Object)

Tizim ma'murlari uchun foydali bo'lgan .NET Core va COM interfeyslari bilan ko'plab dasturiy ta'minot komponentlari mavjud. System.Diagnostics.EventLog sinfidan foydalanib, tizim jurnallarini bevosita Windows PowerShell'dan boshqarishingiz mumkin. Keling, -TypeName parametri bilan New-Object cmdlet yordamida ushbu sinfning namunasini yaratish misolini ko'rib chiqaylik:

New-Object -TypeName System.Diagnostics.EventLog

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Biz aniq voqealar jurnalini ko'rsatmaganimiz sababli, sinfning natijaviy misolida hech qanday ma'lumot yo'q. Buni o'zgartirish uchun -ArgumentList parametri yordamida uni yaratishda maxsus konstruktor usulini chaqirish kerak. Agar biz ilovalar jurnaliga kirmoqchi bo'lsak, konstruktorga argument sifatida "Ilova" qatorini o'tkazishimiz kerak:

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Iltimos, biz buyruqning natijasini $AppLog o'zgaruvchisida saqlaganimizni unutmang. Quvurlar odatda interaktiv rejimda qo'llanilsa-da, skriptlarni yozish ko'pincha ob'ektga havolani saqlashni talab qiladi. Bundan tashqari, asosiy .NET Core sinflari Tizim nomlar maydonida mavjud: PowerShell sukut bo'yicha unda belgilangan turlarni qidiradi, shuning uchun System.Diagnostics.EventLog o'rniga Diagnostics.EventLog yozish juda to'g'ri.

Jurnal bilan ishlash uchun siz tegishli usullardan foydalanishingiz mumkin:

$AppLog | Get-Member -MemberType Method

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Aytaylik, agar kirish huquqlari mavjud bo'lsa, u Clear() usuli bilan tozalanadi:

$AppLog.Clear()

New-Object cmdlet COM komponentlari bilan ishlash uchun ham ishlatiladi. Ularning ko'pi bor - Windows skript serveri bilan ta'minlangan kutubxonalardan Internet Explorer kabi ActiveX ilovalarigacha. COM ob'ektini yaratish uchun siz -ComObject parametrini kerakli sinfning dasturiy ProgId bilan o'rnatishingiz kerak:

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

Ixtiyoriy tuzilishga ega o'z ob'ektlaringizni yaratish uchun New-Object-dan foydalanish juda arxaik va noqulay ko'rinadi; bu cmdlet PowerShell-dan tashqari dasturiy ta'minot komponentlari bilan ishlash uchun ishlatiladi. Kelgusi maqolalarda bu masala batafsilroq muhokama qilinadi. .NET va COM ob'ektlaridan tashqari biz CIM (WMI) va ADSI obyektlarini ham o'rganamiz.

Statik usullarni chaqirish

Ayrim .NET Core sinflarini, jumladan, System.Environment va System.Math-ni yaratish mumkin emas. Ular statik va faqat statik xususiyatlar va usullarni o'z ichiga oladi. Bular asosan ob'ektlar yaratmasdan foydalaniladigan mos yozuvlar kutubxonalari. Tur nomini kvadrat qavs ichiga olish orqali statik sinfga literal orqali murojaat qilishingiz mumkin. Biroq, agar Get-Member yordamida ob'ektning tuzilishini ko'rib chiqsak, System.Environment o'rniga System.RuntimeType turini ko'ramiz:

[System.Environment] | Get-Member

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Faqat statik a'zolarni ko'rish uchun -Static parametri bilan Get-Member-ga qo'ng'iroq qiling (ob'ekt turiga e'tibor bering):

[System.Environment] | Get-Member -Static

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Statik xususiyatlar va usullarga kirish uchun harfdan keyingi nuqta o'rniga ikkita ketma-ket ikki nuqta qo'ying:

[System.Environment]::OSVersion

Yoki

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

PSCustomObject yozing

PowerShell-da mavjud bo'lgan ko'plab ma'lumotlar turlari orasida ixtiyoriy tuzilishga ega ob'ektlarni saqlash uchun mo'ljallangan PSCustomObject-ni eslatib o'tish kerak. New-Object cmdlet yordamida bunday ob'ektni yaratish klassik, ammo mashaqqatli va eskirgan usul hisoblanadi:

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

Ob'ektning tuzilishini ko'rib chiqaylik:

$object | Get-Member

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

PowerShell 3.0 dan boshlab boshqa sintaksis mavjud:

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

Ma'lumotlarga ekvivalent usullardan biri bilan kirishingiz mumkin:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Mavjud xesh-jadvalni obyektga aylantirish misoli:

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Ushbu turdagi ob'ektlarning kamchiliklaridan biri ularning xususiyatlarining tartibi o'zgarishi mumkin. Buning oldini olish uchun siz [ordered] atributidan foydalanishingiz kerak:

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

Ob'ektni yaratishning boshqa variantlari mavjud: yuqorida biz cmdletdan foydalanishni ko'rib chiqdik Ob'ektni tanlang. Qolgan narsa elementlarni qo'shish va olib tashlashni aniqlashdir. Oldingi misoldagi ob'ekt uchun buni qilish juda oddiy:

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Add-member cmdleti "-MemberType ScriptMethod" konstruktsiyasidan foydalanib, avval yaratilgan $obyektga nafaqat xususiyatlarni, balki usullarni ham qo'shish imkonini beradi:

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

Esda tutingki, biz yangi usul uchun kodni saqlash uchun ScriptBlock tipidagi $ScriptBlock oʻzgaruvchisidan foydalanganmiz.

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Xususiyatlarni olib tashlash uchun tegishli usuldan foydalaning:

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

O'z sinflaringizni yaratish

PowerShell 5.0 aniqlash qobiliyatini taqdim etdi sinflar ob'ektga yo'naltirilgan dasturlash tillarining sintaksis xususiyatidan foydalanish. Buning uchun Class xizmat so'zi mo'ljallangan, shundan so'ng siz sinf nomini ko'rsatishingiz va uning tanasini operator qavslar ichida tasvirlashingiz kerak:

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

Bu haqiqiy .NET Core turi bo'lib, uning xususiyatlari, usullari va boshqa elementlarini tavsiflovchi korpusga ega. Keling, eng oddiy sinfni aniqlash misolini ko'rib chiqaylik:

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

Ob'ekt (sinf namunasi) yaratish uchun cmdletdan foydalaning Yangi ob'ekt, yoki [MyClass] tipidagi harf va psevdostatik usul yangi (standart konstruktor):

$object = New-Object -TypeName MyClass

yoki

$object = [MyClass]::new()

Ob'ektning tuzilishini tahlil qilaylik:

$object | Get-Member

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Qo'llanish doirasi haqida unutmang: siz tur nomini satr sifatida ko'rsata olmaysiz yoki sinf belgilangan skript yoki moduldan tashqari turdagi harflardan foydalana olmaysiz. Bunday holda, funktsiyalar modul yoki skriptdan tashqarida foydalanish mumkin bo'lgan sinf misollarini (ob'ektlarini) qaytarishi mumkin.

Ob'ektni yaratgandan so'ng, uning xususiyatlarini to'ldiring:

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

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

E'tibor bering, sinf tavsifi nafaqat mulk turlarini, balki ularning standart qiymatlarini ham belgilaydi:

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

Sinf usulining tavsifi funksiya tavsifiga o'xshaydi, lekin funktsiya so'zidan foydalanmasdan. Funktsiyada bo'lgani kabi, agar kerak bo'lsa, parametrlar usullarga uzatiladi:

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

Endi sinfimiz vakili tabassum qilishi mumkin:

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

Usullar haddan tashqari yuklanishi mumkin, bundan tashqari, sinf mavjud statik xususiyatlar va usullar, shuningdek, nomlari sinf nomi bilan mos keladigan konstruktorlar. Skript yoki PowerShell modulida belgilangan sinf boshqasi uchun asos bo'lib xizmat qilishi mumkin - meros shu tarzda amalga oshiriladi. Bunday holda, mavjud .NET sinflaridan asosiy sinflar sifatida foydalanishga ruxsat beriladi:

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

PowerShell-da ob'ektlar bilan ishlash bo'yicha bizning tavsifimiz to'liq emas. Keyingi nashrlarda biz uni amaliy misollar bilan chuqurlashtirishga harakat qilamiz: seriyadagi beshinchi maqola PowerShell-ni uchinchi tomon dasturiy komponentlari bilan integratsiyalash masalalariga bag'ishlanadi. O'tgan qismlarni quyidagi havolalarda topishingiz mumkin.

1-qism: Windows PowerShell-ning asosiy xususiyatlari
2-qism: Windows PowerShell dasturlash tiliga kirish
3-qism: skriptlar va funktsiyalarga parametrlarni o'tkazish, cmdletlarni yaratish

Windows PowerShell nima va u nima uchun ishlatiladi? 4-qism: Ob'ektlar bilan ishlash, o'z sinflari

Manba: www.habr.com

a Izoh qo'shish