Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

PowerShell tərcüməçi pəncərəsindəki əmrlərin mətn çıxışı sadəcə məlumatı insan qavrayışına uyğun formada göstərmək üçün bir üsuldur. Əslində çərşənbə yönəlmişdir obyektlərlə işləmək üçün: cmdletlər və funksiyalar onları giriş və kimi qəbul edir çıxışda geri döndü, və interaktiv və skriptlərdə mövcud dəyişən növləri .NET siniflərinə əsaslanır. Seriyanın dördüncü məqaləsində biz obyektlərlə işləməyi daha ətraflı öyrənəcəyik.

Mündəricat:

PowerShell-dəki obyektlər
Obyektlərin strukturuna baxmaq
Obyektlərin süzülməsi
Obyektlərin çeşidlənməsi
Obyektlərin və onların hissələrinin seçilməsi
ForEach-Object, Group-Object və Measure-Object
.NET və COM obyektlərinin yaradılması (New-Object)
Statik metodların çağırılması
PSCustomObject yazın
Öz Dərslərinizi Yaradın

PowerShell-dəki obyektlər

Yada salaq ki, obyekt məlumat sahələrinin (xassələr, hadisələr və s.) və onların işlənməsi üsullarının (metodların) məcmusudur. Onun strukturu adətən vahid .NET Core platformasında istifadə olunan siniflərə əsaslanan tiplə müəyyən edilir. COM, CIM (WMI) və ADSI obyektləri ilə də işləmək mümkündür. Məlumatlar üzərində müxtəlif hərəkətləri yerinə yetirmək üçün xüsusiyyətlər və metodlar lazımdır; əlavə olaraq, PowerShell-də obyektlər funksiyalara və cmdletlərə arqument kimi ötürülə bilər, onların dəyərləri dəyişənlərə təyin edilə bilər və həmçinin var. komanda tərkibi mexanizmi (konveyer və ya boru kəməri). Boru kəmərindəki hər bir əmr öz çıxışını növbə ilə obyekt üzrə növbəti birinə ötürür. Emal üçün tərtib edilmiş cmdletlərdən istifadə edə və ya özünüz yarada bilərsiniz qabaqcıl xüsusiyyətlərboru kəmərindəki obyektlərlə müxtəlif manipulyasiyalar etmək: süzgəcdən keçirmək, çeşidləmək, qruplaşdırmaq və hətta onların strukturunu dəyişdirmək. Məlumatların bu formada ötürülməsi ciddi üstünlüyə malikdir: qəbul edən komandanın bayt axınını (mətni) təhlil etməsinə ehtiyac yoxdur, bütün lazımi məlumatlar müvafiq xassələri və metodları çağırmaqla asanlıqla əldə edilir.

Obyektlərin strukturuna baxmaq

Məsələn, sistemdə işləyən proseslər haqqında məlumat əldə etməyə imkan verən Get-Process cmdletini işə salaq:

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Qaytarılan obyektlərin xüsusiyyətləri və onların metodları haqqında heç bir fikir verməyən bəzi formatlaşdırılmış mətn məlumatlarını göstərəcəkdir. Çıxışı dəqiq tənzimləmək üçün biz obyektlərin strukturunu necə yoxlamağı öyrənməliyik və Get-Member cmdlet bu işdə bizə kömək edəcək:

Get-Process | Get-Member

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Burada biz artıq növü və strukturunu görürük və əlavə parametrlərin köməyi ilə, məsələn, girişə daxil edilmiş obyektin yalnız xassələrini göstərə bilərik:

Get-Process | Get-Member -MemberType Property

Bu bilik idarəetmə problemlərini interaktiv şəkildə həll etmək və ya öz skriptlərinizi yazmaq üçün lazım olacaq: məsələn, Responding xüsusiyyətindən istifadə edərək asılmış proseslər haqqında məlumat əldə etmək.

Obyektlərin süzülməsi

PowerShell müəyyən bir şərtə cavab verən obyektlərin boru kəmərindən keçməsinə imkan verir:

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

Mötərizədə skript blokunun icrasının nəticəsi mantiqi dəyər olmalıdır. Əgər doğrudursa ($true), Harada-Object cmdletinə daxil edilən obyekt boru xətti boyunca ötürüləcək, əks halda ($false) silinəcək. Məsələn, dayandırılmış Windows Server xidmətlərinin siyahısını göstərək, yəni. Status mülkiyyəti “Dayandırıldı” olaraq təyin olunanlar:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Burada yenə mətn təsvirini görürük, lakin boru kəmərindən keçən obyektlərin növünü və daxili quruluşunu başa düşmək istəyirsinizsə, bu çətin deyil:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Obyektlərin çeşidlənməsi

Obyektləri boru kəməri ilə emal edərkən çox vaxt onları çeşidləməyə ehtiyac var. Sort-Obyekt cmdletinə xassələrin adları (çeşidləmə açarları) ötürülür və onların dəyərlərinə görə sıralanmış obyektləri qaytarır. Çalışan proseslərin nəticəsini sərf olunan CPU vaxtına görə çeşidləmək asandır (cpu xüsusiyyəti):

Get-Process | Sort-Object –Property cpu

Sort-Obyekt cmdletini çağırarkən -Property parametri buraxıla bilər, o, standart olaraq istifadə olunur. Əks çeşidləmə üçün -Azalan parametrdən istifadə edin:

Get-Process | Sort-Object cpu -Descending

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Obyektlərin və onların hissələrinin seçilməsi

Select-Object cmdlet -First və ya -Son parametrlərindən istifadə edərək boru kəmərinin əvvəlində və ya sonunda müəyyən sayda obyekt seçməyə imkan verir. Onun köməyi ilə siz tək obyektləri və ya müəyyən xassələri seçə, həmçinin onların əsasında yeni obyektlər yarada bilərsiniz. Sadə nümunələrdən istifadə edərək cmdletin necə işlədiyinə baxaq.

Aşağıdakı əmr maksimum RAM miqdarını (WS xüsusiyyəti) istehlak edən 10 proses haqqında məlumatları göstərir:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Siz boru kəmərindən keçən obyektlərin yalnız müəyyən xassələrini seçə və onların əsasında yenilərini yarada bilərsiniz:

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

Boru kəmərinin işləməsi nəticəsində strukturu Get-Process cmdletinin qaytardığı strukturdan fərqlənəcək yeni obyekt alacağıq. Get-Member istifadə edərək bunu yoxlayaq:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Qeyd edək ki, Select-Object müəyyən etdiyimiz sahələrdən yalnız ikisi olan tək obyekti (-Birinci 1) qaytarır: onların dəyərləri Get-Process cmdleti ilə boru xəttinə ötürülən ilk obyektdən kopyalanıb. PowerShell skriptlərində obyektlər yaratmağın yollarından biri Select-Object istifadəsinə əsaslanır:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Select-Object-dən istifadə edərək, kimi təqdim edilməli olan obyektlərə hesablanmış xassələri əlavə edə bilərsiniz hash cədvəlləri. Bu halda, onun birinci açarının dəyəri mülkiyyət adına, ikinci açarın dəyəri isə cari boru kəməri elementinin mülkiyyət dəyərinə uyğundur:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Konveyerdən keçən obyektlərin quruluşuna baxaq:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

ForEach-Object, Group-Object və Measure-Object

Obyektlərlə işləmək üçün başqa cmdletlər var. Nümunə olaraq, ən faydalı üçü haqqında danışaq:

Hər bir obyekt üçün boru kəmərindəki hər bir obyekt üçün PowerShell kodunu işə salmağa imkan verir:

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

Qrup-Obyekt obyektləri əmlak dəyərinə görə qruplaşdırır:

Group-Object PropertyName

Əgər onu -NoElement parametri ilə işlədirsinizsə, qruplardakı elementlərin sayını öyrənə bilərsiniz.

Ölçü-Obyekt boru kəmərindəki obyekt sahəsinin dəyərlərinə görə müxtəlif xülasə parametrlərini birləşdirir (cəmi hesablayır, həmçinin minimum, maksimum və ya orta dəyəri tapır):

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

Tipik olaraq, müzakirə olunan cmdletlər interaktiv şəkildə istifadə olunur və çox vaxt skriptlərdə yaradılır. funksiyaları Begin, Process və End blokları ilə.

.NET və COM obyektlərinin yaradılması (New-Object)

Sistem administratorları üçün faydalı olan .NET Core və COM interfeysləri olan bir çox proqram komponentləri var. System.Diagnostics.EventLog sinifindən istifadə edərək, sistem qeydlərini birbaşa Windows PowerShell-dən idarə edə bilərsiniz. -TypeName parametri ilə New-Object cmdletindən istifadə edərək bu sinfin nümunəsinin yaradılması nümunəsinə baxaq:

New-Object -TypeName System.Diagnostics.EventLog

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Biz konkret hadisə jurnalını təyin etmədiyimiz üçün sinfin nəticə nümunəsində heç bir məlumat yoxdur. Bunu dəyişmək üçün -ArgumentList parametrindən istifadə edərək onun yaradılması zamanı xüsusi konstruktor metodunu çağırmaq lazımdır. Tətbiq jurnalına daxil olmaq istəsək, konstruktora arqument kimi "Application" sətrini ötürməliyik:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Nəzərə alın ki, komandanın çıxışını $AppLog dəyişənində saxladıq. Boru kəmərləri adətən interaktiv rejimdə istifadə olunsa da, skriptlərin yazılması çox vaxt obyektə istinadın saxlanmasını tələb edir. Bundan əlavə, əsas .NET Core sinifləri Sistem ad məkanında yer alır: PowerShell defolt olaraq orada müəyyən edilmiş növləri axtarır, ona görə də System.Diagnostics.EventLog yerinə Diagnostics.EventLog yazmaq olduqca düzgündür.

Günlüklə işləmək üçün müvafiq üsullardan istifadə edə bilərsiniz:

$AppLog | Get-Member -MemberType Method

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Deyək ki, əgər giriş hüquqları varsa Clear() metodu ilə təmizlənir:

$AppLog.Clear()

New-Object cmdleti COM komponentləri ilə işləmək üçün də istifadə olunur. Onların kifayət qədər çoxu var - Windows skript serveri ilə təchiz edilmiş kitabxanalardan Internet Explorer kimi ActiveX proqramlarına qədər. COM obyekti yaratmaq üçün istədiyiniz sinfin proqramlı ProgId ilə -ComObject parametrini təyin etməlisiniz:

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

Öz obyektlərinizi ixtiyari bir quruluşla yaratmaq üçün New-Object-dən istifadə çox arxaik və çətin görünür; bu cmdlet PowerShell-dən kənar proqram komponentləri ilə işləmək üçün istifadə olunur. Gələcək məqalələrdə bu məsələ daha ətraflı müzakirə olunacaq. .NET və COM obyektlərinə əlavə olaraq biz CIM (WMI) və ADSI obyektlərini də araşdıracağıq.

Statik metodların çağırılması

Bəzi .NET Core sinifləri, System.Environment və System.Math daxil olmaqla, yaradıla bilməz. Onlar statik və yalnız statik xassələri və metodları ehtiva edir. Bunlar əsasən obyekt yaratmadan istifadə olunan istinad kitabxanalarıdır. Növ adını kvadrat mötərizələrə daxil etməklə statik sinifə hərf vasitəsilə istinad edə bilərsiniz. Bununla belə, Get-Member istifadə edərək obyektin strukturuna nəzər salsaq, System.Environment əvəzinə System.RuntimeType tipini görərik:

[System.Environment] | Get-Member

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Yalnız statik üzvləri görmək üçün -Static parametri ilə Get-Member-ə zəng edin (obyekt tipini qeyd edin):

[System.Environment] | Get-Member -Static

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Statik xassələrə və metodlara daxil olmaq üçün hərfidən sonrakı nöqtə əvəzinə iki ardıcıl iki nöqtədən istifadə edin:

[System.Environment]::OSVersion

Və ya

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

PSCustomObject yazın

PowerShell-də mövcud olan çoxsaylı məlumat növləri arasında ixtiyari strukturlu obyektlərin saxlanması üçün nəzərdə tutulmuş PSCustomObject-i qeyd etmək lazımdır. New-Object cmdletindən istifadə edərək belə bir obyekt yaratmaq klassik, lakin çətin və köhnəlmiş bir yol hesab olunur:

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

Obyektin strukturuna baxaq:

$object | Get-Member

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

PowerShell 3.0-dan başlayaraq başqa sintaksis mövcuddur:

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

Verilənlərə ekvivalent yollardan biri ilə daxil ola bilərsiniz:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Mövcud hashtable-ni obyektə çevirmək nümunəsi:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Bu tip obyektlərin çatışmazlıqlarından biri onların xassələrinin sırasının dəyişə bilməsidir. Bunun qarşısını almaq üçün [sifarişli] atributundan istifadə etməlisiniz:

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

Obyekt yaratmaq üçün başqa variantlar da var: yuxarıda biz cmdlet-dən istifadəyə baxdıq Seçin-Obyekt. Qalan şey elementlərin əlavə edilməsi və çıxarılmasını anlamaqdır. Əvvəlki nümunədəki obyekt üçün bunu etmək olduqca sadədir:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Add-Member cmdleti "-MemberType ScriptMethod" konstruksiyasından istifadə edərək əvvəllər yaradılmış $obyektə yalnız xassələri deyil, həm də metodları əlavə etməyə imkan verir:

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

Nəzərə alın ki, biz yeni metodun kodunu saxlamaq üçün ScriptBlock tipli $ScriptBlock dəyişənindən istifadə etdik.

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Xüsusiyyətləri aradan qaldırmaq üçün müvafiq metoddan istifadə edin:

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

Öz Dərslərinizi Yaradın

PowerShell 5.0 müəyyən etmək qabiliyyətini təqdim etdi siniflər obyekt yönümlü proqramlaşdırma dillərinin sintaksis xarakteristikasından istifadə etməklə. Class xidmət sözü bunun üçün nəzərdə tutulub, bundan sonra siz sinfin adını qeyd etməli və operator mötərizələrində onun gövdəsini təsvir etməlisiniz:

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

Bu, xassələrini, metodlarını və digər elementlərini təsvir edən gövdə ilə əsl .NET Core növüdür. Ən sadə sinfi təyin etmək üçün bir nümunəyə baxaq:

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

Bir obyekt (sinif nümunəsi) yaratmaq üçün cmdletdən istifadə edin Yeni-Obyekt, və ya [MyClass] tipli hərfi və psevdostatik üsul yeni (standart konstruktor):

$object = New-Object -TypeName MyClass

və ya

$object = [MyClass]::new()

Obyektin strukturunu təhlil edək:

$object | Get-Member

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Əhatə dairəsi haqqında unutmayın: siz tip adına sətir kimi istinad edə və ya sinfin müəyyən edildiyi skript və ya moduldan kənar tip hərfi istifadə edə bilməzsiniz. Bu halda, funksiyalar modul və ya skriptdən kənarda əlçatan olacaq sinif nümunələrini (obyektlərini) qaytara bilər.

Obyekt yaratdıqdan sonra onun xüsusiyyətlərini doldurun:

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

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Qeyd edək ki, sinif təsviri yalnız mülkiyyət növlərini deyil, həm də onların standart dəyərlərini müəyyən edir:

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

Sinif metodunun təsviri funksiyanın təsvirinə bənzəyir, lakin funksiya sözündən istifadə etmədən. Funksiyada olduğu kimi, lazım olduqda parametrlər metodlara ötürülür:

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

İndi sinifimizin nümayəndəsi gülümsəyə bilər:

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

Metodlar həddən artıq yüklənə bilər; əlavə olaraq, bir sinif var statik xassələri və üsulları, həmçinin adları sinfin özünün adı ilə üst-üstə düşən konstruktorlar. Skriptdə və ya PowerShell modulunda müəyyən edilmiş sinif digəri üçün əsas ola bilər - miras belə həyata keçirilir. Bu halda, mövcud .NET siniflərindən əsas kimi istifadə etməyə icazə verilir:

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

PowerShell-də obyektlərlə işləmək təsvirimiz çətin ki, tamdır. Növbəti nəşrlərdə biz bunu praktiki nümunələrlə dərinləşdirməyə çalışacağıq: seriyanın beşinci məqaləsi PowerShell-in üçüncü tərəf proqram komponentləri ilə inteqrasiyası məsələlərinə həsr olunacaq. Keçmiş hissələrlə aşağıdakı linklərdə tanış olmaq olar.

Hissə 1: Əsas Windows PowerShell Xüsusiyyətləri
Hissə 2: Windows PowerShell Proqramlaşdırma Dilinə Giriş
3-cü hissə: skriptlərə və funksiyalara parametrlərin ötürülməsi, cmdletlərin yaradılması

Windows PowerShell nədir və nə üçün istifadə olunur? 4-cü hissə: Obyektlərlə işləmək, öz sinifləri

Mənbə: www.habr.com

Добавить комментарий