
PowerShell Filtering And Comparison Operators
Merhaba arkadaşlar bu yazımız da filtreleme ve karşılaştırmalı operatörlerden bahsedeceğiz. Filtreleme data’yı süzerek istediğimiz sonucu elde etmek demektir. Komutlar üzerinden gelen bütün data’ya ihtiyacımız çok fazla olmamaktadır. Bu nedenden dolayı amacımıza yönelik olarak komuttan gelen değerleri kullanmak istiyorsak filtreleme kullanmak zorundayız. Örnek olarak servisleri listeleyen “Get-Service” komutun da “-Name” parametresi bir filtreleme özelliğine sahiptir. Eğer siz “Get-Service” komutunu tek başına çalıştırırsanız aşağıdaki gibi bir sonuç elde etmiş olacaksınız.
Fakat burada bizim ihtiyacımız olmayan servislerde bulunmakta, biz tek bir servisi çağırmak istiyoruz fakat burada bilgisayardaki bütün servisler listeleniyor. Burada eğer tek bir servis çağıracaksak “-Name ” parametresini kullanmamız gerekiyor.
Get-Service -Name ALG
Bunun sonucunda çıktı olarak tek servisi çağırabileceğiz, aşağıda çıktısına bakalım.
Cmdletsler üzerindeki bazı parametler bize gelecek datayı filtrelememizi sağlar, aslında komutunun aksiyonunu değiştirir. PowerShell komutların kendi üzerlerindeki filtreleme parametrelerinin yetmediği noktada “Where-Object” cmdletini kullanmamız gerekecektir. “Where-Object” Pipe kullanılarak çalıştırılabilir. Örnek olarak sadece çalışan servisleri listelemek istiyorsanız “Where-Object” filtreleme komutunu kullanabilirsiniz.
Get-Service | Where-Object Status -eq ‘Running’
Çalışan servislerimizi listeleye bildik evet fakat burada “-eq” adında karşılaştırmalı operatörden yardım aldık. PowerShell’de günlük hayatımızda kullandığımız “=” sembolu filtreleme de eşit anlamına gelmiyor. Eğer iki değerin eşit olma durumunu karşılaştıracaksam “-eq” yani “Equality” operatörünü kullanmam gerekiyor. Aşağıda diğer karşılaştırma operatörlerini ve açıklamalarını yazıyor olacağım.
Comparison type (Karşılaştırma tipi) |
Case-insensitive operator (Büyük küçük harf duyarsız) |
Case-sensitive operator (Büyük küçük harf duyarlı) |
Equality (Eşit) | -eq | -ceq |
Inequality(Eşit değil) | -ne | -cne |
Greater than(Büyük) | -gt | -cgt |
Less than(Küçük) | -lt | -clt |
Greater than or equal to(Eşit veya büyük) | -ge | -cge |
Less than or equal to(Eşit veya küçük) | -le | -cle |
Wildcard equality(* karakteri ile eşit) | -like | -clike |
Yukarı daki örnekte gördüğünüz üzere sadece çalışan servisleri lsitelemek için “Where-Object” komutunu kullandım. Burada tek bir şartımız olduğu için “Where-Object” komutunu en basic haliyle kullandım. Eğer çalışan servisler ve displayname de windows geçen servisleri öğrnemek isteseydim “Where-Object”‘in gelişmiş kullanımı gerçekleştirmem gerekecekti. Burada karşılaştırmalı operatorlerden “-like” kullanacağım ayrıca mantıksal operatörlerden “ve” anlamına gelen “-and” operatötünü kullanacağım. Bir örnek ile açıklayalım.
Get-Service | Where-Object -FilterScript {$_.Status -eq “Running” -and $_.DisplayName -like “*Windows*”}
Evet komutumuzun çıktısı ekrana bu şekilde yansıyacak ve istediğimiz şekilde gelen sonucu filtreleyerek manipüle etmiş durumdayız. Filteleme eğer gelişmiş seviyede ise, birden fazla koşulu filtrelememiz gerektiğin de “{ }” koşulumuzu süslü parantez içine yazmamız gerekecektir. Ayrıca yine birden fazla filtreleme koşulumuz var ise “$_” veya “$PSItem” kullanarak pipe ile aldığımız değerleri göstermemiz gerekmektedir. “-Like” operatörünü wildcard yani yıldız kullarak çalıştırabilirsiniz bir kelimeyi,sözcüğü veya harfi “*x*” yıldız sembolu arasına aldığınız taktirde içinde “x” geçen anlamına gelmektedir. Biz yukarıdakş örnekte DisplayName’lerinde windows geçen servisleri ve çalışır durumda olan servisleri listeledik.
Bir örnek daha yaparak açıklayalım. “Get-EvenLog” event logları listeleyen bir cmdlets belirli bir event id ye sahip olan logları listelemek istiyorum bunu aşağıdaki 3 yöntemle gerçekleştirebilirim.
Get-EventLog -LogName Application -InstanceId 1001
Get-EventLog -LogName Application | where EventId -eq 1001
Get-EventLog -LogName Application | where {$_.EventID -eq 1001}
Yukaridaki örneklerde gördüğünüz gibi hepsi aynı sonucu getirmektedir. Fakat burada dikkat edilmesi gereken nokta yazdıgınız script yani kod bloğunun çalışma süresidir. Eğer bir cmdletin filtreleme parametresi varsa ve bu sizin işinize yarıyorsa kesinlikle kendi üzerindeki filtreleme parametresini kullanmalısınız veya eğer işinize yaramıyorsa ana datayı getiren komuttan sonra “Where-Object” kullanmanız tavsiye edilir bu sizin kod bloğunuzun filtrelemede uzun süre zaman kaybetmesini engeller.
Bir yazımızın daha sonuna geldik. Bir sonraki makalemiz de görüşmek dileği ile. Hoşçakalın!
Ercan ESE
Microsoft Product Consultant and Trainer,MCT