PowerShell tarjimoni oynasidagi buyruqlarning matn chiqishi shunchaki ma'lumotni inson idrokiga mos keladigan shaklda ko'rsatish usulidir. Aslida chorshanba
Oglavlenie:
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.
Ob'ektlarning tuzilishini ko'rish
Masalan, tizimda ishlayotgan jarayonlar haqida ma'lumot olish imkonini beruvchi Get-Process cmdletini ishga tushiramiz:
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
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"}
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
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
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
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
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()
Select-Object-dan foydalanib, sifatida ifodalanishi kerak bo'lgan ob'ektlarga hisoblangan xususiyatlarni qo'shishingiz mumkin
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Keling, konveyerdan o'tadigan ob'ektlarning tuzilishini ko'rib chiqaylik:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
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.
.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
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
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
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
[System.Environment] | Get-Member
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
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
Xususiyatlarni olib tashlash uchun tegishli usuldan foydalaning:
$object.psobject.properties.remove('Name')
O'z sinflaringizni yaratish
PowerShell 5.0 aniqlash qobiliyatini taqdim etdi
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
$object = New-Object -TypeName MyClass
yoki
$object = [MyClass]::new()
Ob'ektning tuzilishini tahlil qilaylik:
$object | Get-Member
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
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
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.
Manba: www.habr.com