Windows Powershell – Bölüm 7 – Filtering Object – Part 2

By | 12 December 2016

Powershell filtering’i anlatmaya ikinci kısım ile devam ediyoruz. Bir önceki kısım için aşağıdaki linki kullanabilirsiniz.

Bölüm 6 – Part 1- Filtering

Multiple Criteria

Advanced sytax kullanmanın en önemli nedeni birden çok kriter belirtebilmektir. Bunu yaparken script bloğu içerisinde –and ve –or mantıksal operatörlerini kullanır.

Aşağıdaki ifadede where koşulu içerisine EventID ve Source property’lerine ilişkin koşullar kontrol edilmiştir ve bunun sonucuna göre kritere uygun objeler listelenmiştir.

Get-EventLog -LogName Application -Newest 1000 | where {$_.EventID -eq 1000 -and $_.Source -eq ‘Application Error’}

image007

Birden çok koşullu ifade yazarken yapılan bazı yanlışlarda vardır. Bunlardan en sık yapılanları aşağıdaki gibidir.

Get-Process | where {$_.CPu -gt 30 -and VM -lt 9000 }

Buradaki hata property’yi direk olarak yazmaktır. Where koşulu içerisinde bu şekilde basic syntax’ta olduğu gibi yazım yapılamaz. $PSItem.VM yada $_.VM şeklinde yazılması gerekir.

Yine bir diğer çok karşılaşılan yazım hatası da aşağıdaki gibidir.

Get-Service | where {$_.Status -eq ‘Running’ -or ‘Stopped’ }

Bu komut çalıştırıldığında hata vermez ancak tutarlı ve doğru bir listeleme de yapmaz. Bunun nedeni direkt olarak –or ifadesinden sonra ‘Stopped’ düzgün bir karşılaştırma ifadesi değildir. Komutun aşağıdaki şekilde yazılması gerekir.

Get-Service | where {$_.Status -eq ‘Running’ -or $_.Status -eq ‘Stopped’ }

True ve False Değeri barındıran Property’ler

Where koşulu ile filtreleme yaparken amaç belirtilen koşul yada koşullara göre true yada false değeri döndürmektir. Çoğunlukla da bu durum mantıksal operatörler yardımıyla sağlanır. (-eq,-ne vb..) Bazen koşul içerisinde kullanılan property’ler kendiliğinden true yada false değerine sahip olabilirler.(boolean data tipinde olabilirler). Bu gibi durumlarda herhangi bir çift taraflı karşılaştırmaya gerek olmadan property değerlerinin true yada false oluşu sorgulanabilir.

Aşağıdaki komutta olduğu gibi CanShutdown property’sinin değerinin true olup olmadığı direk  mantıksal operatörler kullanılıp $true değişkenine eşitlenerek karşılaştırılabilir.

Get-Service | where {$_.CanShutdown -eq $true }

image008

Yada alternatif olarak where koşulu içerisine herhangi bir mantıksal operatör kullanmadan direkt property yazılarak da karşılaştırma yapılabilir. Bunun nedeni CanShutdown property’sinin hali hazırda true yada false değeri taşıyor olmasıdır.

Get-Service | where {$_.CanShutdown}

image009

 

Koşulun tam zıttı yazılmak istenirse komut aşağıdaki gibi düzenlenmelidir. –not mantıksal operatörü where koşulunun içerisine eklenmelidir.

Get-Service | where { -not $_.CanShutdown }

image010

-not operatörü dönen true değerini false ile, false değerini true ile değiştirir.

 

Son olarak basic sytax’ta sadece property’nin kendisine erişiliyordu. Property’e ait bir metod koşul içerisinde kullanılmak istendiğinde powershell hata veriyordu.

Advanced syntax’ta bu konuda bir limit yoktur. Property’lere ait tüm metodlara erişilebilir ve where koşulu içerisinde kriter olarak kullanılabilir.

Örneğin isminin uzunluğu 10 karakterden fazla olan servisler listelenmek istendiğinde aşağıdaki gibi bir komut kolaylıkla çalıştırılabilir.

(bu komut basic syntax ile denendiğinde hata alınmıştı)

Get-Service | where {$_.Name.Length -gt 10 }

image011

 

Filtreleme işlemi yaparken göz önünde bulundurulması gereken bir diğer durum ise performanstır. Veri büyük olduğunda filtreleme performansı göz önünde bulundurmak gibi bir durum söz konusudur.

Bu durumla ilgili filtreleme sırasında dikkat edilmesi gereken bir kaç önemli nokta bulunmakta.

  • Örneğin aşağıdaki iki örnek komut aynı objeleri listelerler. Ancak ikinci komut birinciye göre daha hızlıdır. Çünkü filtreleme yapılmadan önce pipeline üzerinden istenmeyen blokları siler. Böylece filtreleme işlemi daha az obje üzerinden yapılmış olur.

Birinci komut bütün objeleri sıraladığı için, sıralama için harcadığı efor diğerine göre daha fazladır.

        Get-Service | Sort-Object -Property name | where -FilterScript { $PSItem.Status -eq ‘Running’ }

        Get-Service | where -FilterScript { $PSItem.Status -eq ‘Running’ } | Sort-Object -Property name

 

  • Örneğin bazı komutlarda filtreleme işlemi yapmadan önce komut ile birlikte parametre kullanarak komut çıktısı limitlendirilebilir.

Örneğin Get-ChildItem komutu kullanılarak bir dizindeki dosya ve klasörler listelenebilir. Bu komutun PSIsContainer parametresi vardır ve bu parametre dosyalar için false değerini döndürür.

Get-Childıtem komutu ile dosyalar listelenmek istendiğinde aşağıdaki komut kullanılabilir.

      Get-ChildItem | where {-not $PSItem.PSIsContainer}

Fakat yinede bu performans bakımından çok efektif bir yöntem değildir. Get-ChildItem komutunun –File parametresi vardır ve bu parametre kullanılarak filtreleme en başta yapılırsa komut daha efektif çalışır.

     Get-ChildItem -File *

 

  • Son olarak örneğin ismi svc ile başlayan servisler listelenmek istendiğinde aşağıdaki komut kullanılabilir. Fakat bu komut yine tüm objeleri önce get edip sonrasında bunlar içerisinde ismi wi ile başlayan servisleri filtreleyecektir.

     Get-Service | where name -Like wi*

Bunun yerine aşağıdaki komutun kullanılması daha efektif olur.

    Get-Service -Name wi*

 

Bir sonraki makalede görüşmek üzere.

Kaynak : Microsoft DMOC

Fırat

Leave a Reply