Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

PowerShell yorumlayıcı penceresindeki komutların metin çıktısı, bilgileri insan algısına uygun bir biçimde görüntülemenin bir yoludur. Aslında Çarşamba odaklı nesnelerle çalışmak için: cmdlet'ler ve işlevler bunları girdi olarak alır ve çıkışta geri döndümve etkileşimli olarak ve komut dosyalarında kullanılabilen değişken türleri .NET sınıflarını temel alır. Serinin dördüncü yazısında nesnelerle çalışmayı daha detaylı inceleyeceğiz.

İçindekiler:

PowerShell'deki nesneler
Nesnelerin yapısını görüntüleme
Nesneleri filtreleme
Nesneleri sıralama
Nesneleri ve parçalarını seçme
ForEach-Nesne, Grup-Nesne ve Ölçü-Nesne
.NET ve COM nesneleri oluşturma (Yeni Nesne)
Statik Yöntemlerin Çağrılması
PSCustomObject yazın
Kendi Sınıflarınızı Oluşturma

PowerShell'deki nesneler

Bir nesnenin, veri alanları (özellikler, olaylar vb.) ve bunları işlemeye yönelik yöntemler (yöntemler) topluluğu olduğunu hatırlayalım. Yapısı, genellikle birleşik .NET Core platformunda kullanılan sınıfları temel alan bir tür tarafından belirtilir. COM, CIM (WMI) ve ADSI nesneleri ile çalışmak da mümkündür. Veriler üzerinde çeşitli eylemler gerçekleştirmek için özelliklere ve yöntemlere ihtiyaç vardır; ayrıca PowerShell'de nesneler işlevlere ve cmdlet'lere argüman olarak aktarılabilir, değerleri değişkenlere atanabilir ve ayrıca komut kompozisyon mekanizması (konveyör veya boru hattı). Boru hattındaki her komut, çıktısını nesne nesne sırayla bir sonrakine aktarır. İşleme için derlenmiş cmdlet'leri kullanabilir veya kendinizinkini oluşturabilirsiniz. Gelişmiş özelliklerboru hattındaki nesnelerle çeşitli manipülasyonlar gerçekleştirmek: filtreleme, sıralama, gruplandırma ve hatta yapılarını değiştirme. Verileri bu formda iletmenin ciddi bir avantajı vardır: Alıcı ekibin bayt akışını (metni) ayrıştırmasına gerek yoktur, gerekli tüm bilgiler uygun özellikler ve yöntemler çağrılarak kolayca alınır.

Nesnelerin yapısını görüntüleme

Örneğin, sistemde çalışan işlemler hakkında bilgi edinmenizi sağlayan Get-Process cmdlet'ini çalıştıralım:

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Döndürülen nesnelerin özellikleri ve yöntemleri hakkında herhangi bir fikir vermeyen bazı biçimlendirilmiş metin verilerini görüntüleyecektir. Çıktıya ince ayar yapmak için nesnelerin yapısını nasıl inceleyeceğimizi öğrenmemiz gerekir ve Get-Member cmdlet'i bu konuda bize yardımcı olacaktır:

Get-Process | Get-Member

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Burada türü ve yapıyı zaten görüyoruz ve ek parametrelerin yardımıyla örneğin yalnızca girdide yer alan nesnenin özelliklerini görüntüleyebiliriz:

Get-Process | Get-Member -MemberType Property

Bu bilgi, yönetim sorunlarını etkileşimli olarak çözmek veya kendi komut dosyalarınızı yazmak için gerekli olacaktır: örneğin, Yanıt Verme özelliğini kullanarak askıda kalan işlemler hakkında bilgi edinmek için.

Nesneleri filtreleme

PowerShell, belirli bir koşulu karşılayan nesnelerin bir işlem hattından geçirilmesine olanak tanır:

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

Parantez içindeki komut dosyası bloğunun yürütülmesinin sonucu bir boole değeri olmalıdır. Doğruysa ($true), Where-Object cmdlet'ine girilen nesne ardışık düzen boyunca iletilir, aksi takdirde ($false) silinir. Örneğin, durdurulan Windows Server hizmetlerinin bir listesini görüntüleyelim; Durum özelliği “Durduruldu” olarak ayarlananlar:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Burada yine metinsel bir temsil görüyoruz, ancak boru hattından geçen nesnelerin türünü ve iç yapısını anlamak istiyorsanız bu zor değildir:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Nesneleri sıralama

Nesnelerin ardışık düzende işlenmesi sırasında, genellikle onları sıralamaya ihtiyaç duyulur. Sort-Object cmdlet'i özelliklerin adlarını (sıralama anahtarları) iletir ve nesneleri değerlerine göre sıralanmış olarak döndürür. Çalışan işlemlerin çıktısını harcanan CPU zamanına (cpu özelliği) göre sıralamak kolaydır:

Get-Process | Sort-Object –Property cpu

Sort-Object cmdlet'i çağrılırken -Property parametresi atlanabilir; varsayılan olarak kullanılır. Tersine sıralama için -Descending parametresini kullanın:

Get-Process | Sort-Object cpu -Descending

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Nesneleri ve parçalarını seçme

Select-Object cmdlet'i, -First veya -Last parametrelerini kullanarak bir işlem hattının başında veya sonunda belirli sayıda nesne seçmenize olanak tanır. Onun yardımıyla tek nesneleri veya belirli özellikleri seçebilir ve bunlara dayalı olarak yeni nesneler oluşturabilirsiniz. Basit örnekler kullanarak cmdlet'in nasıl çalıştığına bakalım.

Aşağıdaki komut, maksimum RAM miktarını (WS özelliği) tüketen 10 işlem hakkındaki bilgileri görüntüler:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

İşlem hattından geçen nesnelerin yalnızca belirli özelliklerini seçebilir ve bunlara dayalı olarak yenilerini oluşturabilirsiniz:

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

Pipeline'ın çalışması sonucunda yapısı Get-Process cmdlet'inin döndürdüğü yapıdan farklı olacak yeni bir nesne alacağız. Bunu Get-Member kullanarak doğrulayalım:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Select-Object'in belirttiğimiz alanlardan yalnızca ikisine sahip tek bir nesne (-First 1) döndürdüğünü unutmayın: bunların değerleri, Get-Process cmdlet'i tarafından ardışık düzene iletilen ilk nesneden kopyalanmıştır. PowerShell betiklerinde nesne oluşturmanın yollarından biri Select-Object kullanımına dayanmaktadır:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Select-Object'i kullanarak, şu şekilde temsil edilmesi gereken nesnelere hesaplanan özellikler ekleyebilirsiniz: karma tabloları. Bu durumda, ilk anahtarının değeri, özellik adına karşılık gelir ve ikinci anahtarın değeri, geçerli boru hattı öğesinin özellik değerine karşılık gelir:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Konveyörden geçen nesnelerin yapısına bakalım:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

ForEach-Nesne, Grup-Nesne ve Ölçü-Nesne

Nesnelerle çalışmak için başka cmdlet'ler de vardır. Örnek olarak en faydalı üç tanesinden bahsedelim:

ForEach-Nesne ardışık düzendeki her nesne için PowerShell kodunu çalıştırmanıza olanak tanır:

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

Grup-Nesne nesneleri özellik değerine göre gruplandırır:

Group-Object PropertyName

-NoElement parametresi ile çalıştırırsanız gruplardaki eleman sayısını öğrenebilirsiniz.

Ölçü-Nesne çeşitli özet parametrelerini ardışık düzendeki nesne alanı değerlerine göre toplar (toplamı hesaplar ve ayrıca minimum, maksimum veya ortalama değeri bulur):

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

Tipik olarak tartışılan cmdlet'ler etkileşimli olarak kullanılır ve genellikle komut dosyalarında oluşturulur. Özellikler Başlangıç, Süreç ve Bitiş bloklarıyla.

.NET ve COM nesneleri oluşturma (Yeni Nesne)

Sistem yöneticilerinin işine yarayacak .NET Core ve COM arayüzlerine sahip birçok yazılım bileşeni bulunmaktadır. System.Diagnostics.EventLog sınıfını kullanarak sistem günlüklerini doğrudan Windows PowerShell'den yönetebilirsiniz. New-Object cmdlet'ini -TypeName parametresiyle kullanarak bu sınıfın bir örneğini oluşturma örneğine bakalım:

New-Object -TypeName System.Diagnostics.EventLog

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Belirli bir olay günlüğü belirtmediğimiz için sınıfın ortaya çıkan örneği hiçbir veri içermiyor. Bunu değiştirmek için, oluşturma sırasında -ArgumentList parametresini kullanarak özel bir kurucu yöntemini çağırmanız gerekir. Uygulama günlüğüne erişmek istiyorsak, "Uygulama" dizesini yapıcıya argüman olarak iletmeliyiz:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Lütfen komutun çıktısını $AppLog değişkenine kaydettiğimizi unutmayın. İşlem hatları yaygın olarak etkileşimli modda kullanılsa da, komut dosyaları yazmak çoğu zaman bir nesneye referansın korunmasını gerektirir. Ek olarak, çekirdek .NET Core sınıfları Sistem ad alanında bulunur: PowerShell varsayılan olarak burada belirtilen türleri arar, bu nedenle System.Diagnostics.EventLog yerine Diagnostics.EventLog yazmak oldukça doğrudur.

Günlükle çalışmak için uygun yöntemleri kullanabilirsiniz:

$AppLog | Get-Member -MemberType Method

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Erişim hakları varsa Clear() yöntemiyle temizlendiğini varsayalım:

$AppLog.Clear()

New-Object cmdlet'i aynı zamanda COM bileşenleriyle çalışmak için de kullanılır. Windows komut dosyası sunucusuyla birlikte sağlanan kitaplıklardan Internet Explorer gibi ActiveX uygulamalarına kadar oldukça fazla sayıda var. Bir COM nesnesi oluşturmak için -ComObject parametresini istenen sınıfın programlı ProgId'si ile ayarlamanız gerekir:

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

Rastgele bir yapıya sahip kendi nesnelerinizi oluşturmak için New-Object'i kullanmak çok eski ve hantal görünüyor; bu cmdlet, PowerShell dışındaki yazılım bileşenleriyle çalışmak için kullanılır. Gelecek yazılarda bu konu daha ayrıntılı olarak ele alınacaktır. .NET ve COM nesnelerine ek olarak CIM (WMI) ve ADSI nesnelerini de inceleyeceğiz.

Statik Yöntemlerin Çağrılması

System.Environment ve System.Math dahil olmak üzere bazı .NET Core sınıfları örneklenemez. Bunlar statik ve yalnızca statik özellikleri ve yöntemleri içerir. Bunlar aslında nesne oluşturulmadan kullanılan referans kitaplıklardır. Tür adını köşeli parantez içine alarak bir değişmez değer aracılığıyla statik bir sınıfa başvurabilirsiniz. Ancak Get-Member kullanarak nesnenin yapısına bakarsak System.Environment yerine System.RuntimeType tipini göreceğiz:

[System.Environment] | Get-Member

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Yalnızca statik üyeleri görüntülemek için Get-Member'ı -Static parametresiyle çağırın (nesne türüne dikkat edin):

[System.Environment] | Get-Member -Static

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Statik özelliklere ve yöntemlere erişmek için, değişmez değerden sonra nokta yerine iki ardışık iki nokta üst üste kullanın:

[System.Environment]::OSVersion

Veya

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

PSCustomObject yazın

PowerShell'de bulunan çok sayıda veri türü arasında, nesneleri rastgele bir yapıya sahip depolamak için tasarlanmış PSCustomObject'ten bahsetmeye değer. New-Object cmdlet'ini kullanarak böyle bir nesne oluşturmak klasik ancak hantal ve modası geçmiş bir yöntem olarak kabul edilir:

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

Nesnenin yapısına bakalım:

$object | Get-Member

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

PowerShell 3.0'dan itibaren başka bir sözdizimi mevcuttur:

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

Verilere eşdeğer yollardan biriyle erişebilirsiniz:

$object.Name

$object.'Name'

$value = 'Name'
$object.$value

Mevcut bir karma tablosunu bir nesneye dönüştürmenin bir örneğini burada bulabilirsiniz:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Bu tür nesnelerin dezavantajlarından biri de özelliklerinin sırasının değişebilmesidir. Bunu önlemek için [ordered] özelliğini kullanmalısınız:

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

Bir nesne oluşturmak için başka seçenekler de var: yukarıda cmdlet'in kullanımına baktık Select-Nesne. Geriye kalan tek şey, öğeleri eklemeyi ve kaldırmayı çözmektir. Önceki örnekteki nesne için bunu yapmak oldukça basittir:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Add-Member cmdlet'i, "-MemberType ScriptMethod" yapısını kullanarak önceden oluşturulmuş bir $object'e yalnızca özellikleri değil aynı zamanda yöntemleri de eklemenizi sağlar:

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

Yeni yöntemin kodunu depolamak için ScriptBlock türündeki $ScriptBlock değişkenini kullandığımızı lütfen unutmayın.

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Özellikleri kaldırmak için ilgili yöntemi kullanın:

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

Kendi Sınıflarınızı Oluşturma

PowerShell 5.0 tanımlama yeteneğini tanıttı sınıflar Nesne yönelimli programlama dillerinin sözdizimi özelliklerini kullanma. Class hizmet sözcüğü bunun için tasarlanmıştır; bundan sonra sınıfın adını belirtmeli ve gövdesini operatör parantezleri içinde tanımlamalısınız:

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

Bu, özelliklerini, yöntemlerini ve diğer öğelerini açıklayan bir gövdeye sahip gerçek bir .NET Core türüdür. En basit sınıfı tanımlamanın bir örneğine bakalım:

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

Bir nesne (sınıf örneği) oluşturmak için cmdlet'i kullanın Yeni-Nesne, veya [Sınıfım] türünde bir değişmez değer ve psödostatik yöntem yeni (varsayılan yapıcı):

$object = New-Object -TypeName MyClass

veya

$object = [MyClass]::new()

Nesnenin yapısını analiz edelim:

$object | Get-Member

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Kapsamı unutmayın: Bir tür adına dize olarak başvuramaz veya sınıfın tanımlandığı komut dosyası veya modülün dışında bir tür değişmez değeri kullanamazsınız. Bu durumda işlevler, modülün veya betiğin dışından erişilebilecek sınıf örneklerini (nesneleri) döndürebilir.

Nesneyi oluşturduktan sonra özelliklerini doldurun:

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

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Sınıf açıklamasının yalnızca özellik türlerini değil aynı zamanda bunların varsayılan değerlerini de belirttiğini unutmayın:

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

Bir sınıf yönteminin açıklaması, bir işlevin açıklamasına benzer, ancak işlev sözcüğü kullanılmaz. Bir fonksiyonda olduğu gibi, gerekirse parametreler yöntemlere iletilir:

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

Artık sınıfımızın temsilcisi gülümseyebilir:

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

Yöntemler aşırı yüklenebilir; buna ek olarak bir sınıfın Statik özellikler ve yöntemleradları sınıfın adıyla çakışan kurucuların yanı sıra. Bir komut dosyasında veya PowerShell modülünde tanımlanan bir sınıf, bir başkası için temel görevi görebilir; devralma bu şekilde uygulanır. Bu durumda, mevcut .NET sınıflarının temel sınıflar olarak kullanılmasına izin verilir:

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

PowerShell'de nesnelerle çalışmaya ilişkin açıklamamız pek kapsamlı değildir. Sonraki yayınlarda bunu pratik örneklerle derinleştirmeye çalışacağız: Serinin beşinci makalesi PowerShell'i üçüncü taraf yazılım bileşenleriyle entegre etme konularına ayrılacak. Geçmiş bölümlere aşağıdaki bağlantılardan ulaşabilirsiniz.

Bölüm 1: Temel Windows PowerShell Özellikleri
Bölüm 2: Windows PowerShell Programlama Diline Giriş
Bölüm 3: komut dosyalarına ve işlevlere parametrelerin aktarılması, cmdlet'lerin oluşturulması

Windows PowerShell nedir ve ne için kullanılır? Bölüm 4: Nesnelerle çalışma, kendi sınıfları

Kaynak: habr.com

Yorum ekle