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
İçindekiler:
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
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:
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
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"}
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
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
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
İş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
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()
Select-Object'i kullanarak, şu şekilde temsil edilmesi gereken nesnelere hesaplanan özellikler ekleyebilirsiniz:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}}
Konveyörden geçen nesnelerin yapısına bakalım:
Get-Process | Select-Object -Property ProcessName, @{Name="StartTime"; Expression = {$_.StartTime.Minute}} | Get-Member
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.
.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
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
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
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
[System.Environment] | Get-Member
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
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()
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
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()
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
$object | Add-Member –MemberType NoteProperty –Name Age –Value 33
$object | Get-Member
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.
Ö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ı
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
$object = New-Object -TypeName MyClass
veya
$object = [MyClass]::new()
Nesnenin yapısını analiz edelim:
$object | Get-Member
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
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
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.
Kaynak: habr.com