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ə
Mündəricat:
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.
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:
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
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"}
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
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
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
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
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()
Select-Object-dən istifadə edərək, kimi təqdim edilməli olan obyektlərə hesablanmış xassələri əlavə edə bilərsiniz
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Konveyerdən keçən obyektlərin quruluşuna baxaq:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
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.
.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
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
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
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
[System.Environment] | Get-Member
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
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
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
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
$object = New-Object -TypeName MyClass
və ya
$object = [MyClass]::new()
Obyektin strukturunu təhlil edək:
$object | Get-Member
Ə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
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
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.
Mənbə: www.habr.com