PowerShell Temel DERSLER 9 (Filtreleme -filter, where-object)

Merhaba Arkadaşlar, geçen ders Windowsun temel yapısına erişebileceğimiz WMI teknolojisinden bahsetmiştik. Bu servis sayesinde windows un mahrem bileşenlerine powershell ile erişebiliyorduk. Şimdi powershell de filtreleme konusunu işleyeceğiz. Nedir bu filtreleme konusu derseniz kısa ve öz olarak şunu söyleyebiliriz powershell de işlem yaptığınızda varsayılan durumda powershell size ne var ne yok herşeyi sunar. Örneğin windows klasörüne geçipte Get-ChildItem komutunu yürüttüğünüzde o klasörde ne var ne yok hepsini listeler. Amacınız sadece .exe dosyalarını listelemekse filtreleme yapmak durumundasınız. Bunun gibi birçok komut için filtreleme yapmak durumunda kalabiliriz demiyorum kesin kalırız 🙂

Bu yüzden temel derslerin en önemli konularından biride filtreleme konusudur.

Basit bir filtreleme örneği yapalım.

Get-ChildItem -path C:\Windows komutu windows klasörü altındaki hertürlü dosya ve klasörleri listeler.

Get-ChildItem -path C:\Windows -filter *.exe komutu windows klasörü altındaki uzantısı .exe olan dosyaları listeler.

Snap_2018.03.12 16.51.24_007

Bu şekilde basit bir filtreleme yapmış olduk.

Powershell de hemen hemen tüm komutların çıktılarını filtre edebilecek, araç parametre yada yöntemler bulabilirsiniz. Örneklerimize Get-ChildItem üzerinden devam edelim. Bildiğiniz gibi Get-ChildItem dosya ve klasörleri listelemeye yarıyordu.

Get-Help Get-ChildItem -Online komutu ile online yardım alıyoruz. Komut bizi tarayıcıya yönlendirip bir web sayfası üzerinde yardım dosyasını görüntülüyor.

Get-Help Get-ChildItem -Examples komutu yardım dosyasını biraz daha filtreleyip sadece örnek komutlar gösterir.

Get-ChildItem  komutu bulunduğumuz path içerisindeki dosya ve klasörleri listeler demiştik.
Get-ChildItem -Path *.txt -Recurse -Force komutuda  uzantısı .txt olan dosyaları listeliyor.
Get-ChildItem -Path C:\Windows\Logs\* -Include *.txt -Exclude A*  uzantısı .txt olanlar arasında “A” harfi ile başlamayan dosyaları listeler.

Get-ChildItem -Path C:\Windows -Include *mouse* -Exclude *.png komutumuz dosya isimlerinde “mouse” ifadesi geçeni ama uzantısı .png olmayan dosyaları listeler

Get-ChildItem -Path C:\Windows -recurse komutu windows klasörü altındaki dosya ve klasörlerin yanısıra alt klasörler ve varsa içiçe olan klasörleride listeler

Get-ChildItem -Path C:\Windows -Depth 2 komutu windows klasöründeki dosya ve klasörleri listeler fakat iç içe olan klasörlerden sadece 2 seviye ye kadar gösterir. Örneğin Windows klasörünü listeler windows klasörü altındaki system32 klasörünü de listeler fakat system32 nin alt klasörlerinin içeriğini listelemez. Hatırlayın -recurse parametresi içiçe olan tüm klasörlerin içeriğinide listelemişti.

-Filter Parametresi

Burada Get-ChildItem komutunun kendine has parametrelerini kullanarak filtreleme yapıp sonuçlara ulaştık. Şimdide -filter parametresine sahip olan komutlardan örnekler vereceğiz.

Şimdiki örneğimiz Get-WmiObject komutu, aşağıdaki ekran görüntüsünü inceleyelim.

1 numaralı komutumuzda Get-WmiObject ile WMI sınıflarından disk sürücülerini göstermeye yarayan win32diskdrive sınıfını kullandık. Varsayılan durumda tüm diskler listelendi..

2 numaralı komutumuzla tüm sonuçları değilde istediğimiz sonucu -filtre parametresi ile belirterek sonuca gittik. İsteğimiz Modeli JMCR SD SCSI Disk Device olan diskleri görüntülemekti. Bunuda bir önceki komutumuza -filter parametresini ekleyerek yaptık.

Snap_2018.03.13 08.24.55_009

Şirketinizin Active Directory sunucusunu yönettiğinizi düşünün patronunuz sizden işletim sistemi Windows 10 olan bilgisayarlarının listesini istemiş olsun. İlerde anlatacağımız ama burada çok kısa değineceğimiz Active Directory komutlarından olan Get-AdComputer komutundan bahsedelim.

Get-AdComputer -filter * komutu tüm bilgisayarları listeler.

Get-AdComputer -filter {operatingsystem -like “Windows 10*”} |Select name  komutu işletim sistemi Windows 10 olan bilgisayarların name özelliklerini listeler.

Hangi komutlar  -Filter parametresi kullanır sorusuna cevap verip örneklerimize devam edelim.

Get-Command -ParameterName Filter komutu filter parametresine sahip komutları gösterir. (Elbetteki bu sonuçlar her bilgisayar için farklı gelebilir. Buna şimdilik takılmayın powershell e eklenen module ler ile alakalı bir durum. Örneğin Active Directory veya Exchange için kullanabileceğim komutlar setini barındıran modülleri yüklemiş olsaydım sonuçlar daha fazla gelebilirdi.)

Snap_2018.03.13 09.18.31_011

Get-AdComputer -filter * komutundaki * ifadesi herşey anlamına gelir. Bunu biraz daha kısıtlamak için -filter {  } yani köşeli parantezler ifadesinin içerisine filtremiz için şartlar belirtiriz.

Get-AdComputer -filter {operatingsystem -like “Windows 10*”} komutu için işletim sistemi özelliğinin Windows 10 ile başladığını 10 dan sonraki ifadenin herşey olabileceği anlamına gelmektedir. Bu sayede Windows 10 Pro, Windows 10 Enterprise gibi farklı windows işletim sistemlerini listeleyebiliyor olacağız.

Aklınıza şöyle bir soru gelebilir. “Pekiya ben Get-AdComputer ın operatingsystem özelliğini tuttuğunu nerden bilecektim.” Önceki derslerden hatırlayınız.

Get-ADComputer -filter * -properties * |Get-Member komutu kullanabileceğimiz özellik, metod ve olayları gösterirdi.

Snap_2018.03.13 09.28.33_012

Aynı şeyi Get-ADComputer client01 -Properties * | Get-Member komutu ile Client1 için kullanabileceğimiz özellik, metod ve olayları görebiliriz.

Şimdide parantez içerisindeki -like ifadesine bakalım.

-filter {operatingsystem -like “Windows 10*”}

Burada artık operatörler konusuna girmemiz gerekiyor. Matematikte bildiğiniz üzere sayılar üzerinde toplama,çıkarma,çarpma ve bölme gibi işlemler yapabiliyoruz. İşte burada iki sayıyı toplamak için toplam operatöründen faydalanırız. Benzer mantıkta powershellde de bazı işlemleri yapabilmemiz için operatörlerden faydalanırız. Matematikte olduğu gibi powershell dede toplama,çıkarma,çarpma ve bölme operatörleri vardır bunların yanısıra başka operatörlerde mevcuttur örneğin -like gibi

help about_operators yazarak powershell deki operatörler ile ilgili yardım alabiliriz.

help about_operators komutu ile powershell de kullanılabilecek tüm operatörleri görebiliriz. Ayrı bir makale konusu olduğu için çok detaylarına inmiyoruz.

Snap_2018.03.13 10.43.47_013

burada bilmemiz gereken -like bir powershell operatörüdür ve “gibi” anlamına gelen işlemleri filtreler örneğin;

-like “Windows*”   Başında Windows ibaresi olup ondan sonraki kısmı herhangi birşey olan

-like “*win*” içerisinde win ibaresi olanlar anlamına gelmektedir.

-filter { }parametresini kullanırken parantez içerisinde birden fazla şart kullanılabilir.

Örneğin; aşağıdaki komutları inceleyelim.

 

Get-ADUser -filter {badpwdcount -eq '0'} | Select-Object Name

Get-ADUser -filter {(badpwdcount -eq '0') -and (enabled -eq 'true')} | Select-Object Name

Get-ADComputer -filter {(operatingsystem -like '*2016*') -and (name -like 'dc*')}

Birinci komutta -filter içerisinde tek bir şart kullanılmıştır buradaki -eq bir karşılaştırma öperatörüdür eşittir anlamına gelir yani badpwdcount özelliği ‘0’ a eşit olanlar anlamı katmaktadır..

İkinci komutumuzun -filter parametresinde iki tane şart bulunmaktadır. Bunlardan biri badpwdcount özelliği ‘0’ a eşit olanlar ve enable özelliği ‘true’ olanlar anlamına gelmektedir yine buradaki -and operatörü mantıksal öperatörlerden bir tanesidir. İki özelliğin aynı anda sağlanması için -and mantıksal operatörünü kullanırız.

Üçüncü komutumuz işletim sistemi özelliğinin içinde 2016 ibaresi olan ismi dc ile başlayan bilgisayarlar anlamına gelen komutumuzdur.

-filter parametresin çoğunlukla operatörlerle kullanılır. Bu yüzden operatörleri bilmeden detaylı filtreler oluşturamayız.

Where-Object ile Filtreleme

Filtre oluşturma yöntemlerinden biride Where-Object komutudur. Genellikle ‘|’ işaretinden sonra kullanılır.

Şimdi örneklerle konuyu detaylı inceleyelim.

Get-Process | Where-Object {$_.handles -gt 200 -and $_.name -eq "svchost"}

Get-ChildItem c:\scripts | Where-Object {$_.length -gt 100000}

Get-Hotfix | Where-Object HotfixID -like KB31*

Get-Hotfix | Where-Object {$_.HotfixID -like 'KB31*'}

İlk örneğimizde tıpkı -filter da yaptığımız gibi Where-Object in { } parantezleri arasına koşul içeren ifadelerimizi girdik burada -gt karşılaştırma operatörüdür ve ‘grater than’ anlamına gelmektedir. Yani büyüktür anlamında -eq eşittir anlamına geliyordu.

Get-Process komutundan dönen sonuçlar ‘|’ işaretinden sonra sırayla Where-Object komutuna aktarılıyor. $_ değişkeni bu sonuçlardan herbirini temsil ediyor.  $_.handles ifadesi dönen sonuçlardan herbirinin handles özelliğini, $_.name yine dönen herbir ifadenin name özelliğini temsil etmektedir. Bu sayede filtrelerimizi oluşturuyoruz. Önceki derslerimizde $_ değişkeninden bahsetmiştik.

İkinci örneğimizde Get-ChildItem komutunun sonuçlarını Where-Object komutu ile length özelliğine göre filtreliyoruz. Yani dönen sonuçlardan length özelliği 100000 byte dan büyük olanlar.

Üç ve dördüncü örneklerimiz aynı amaca hizmet etmektedirler. Yani Get-Hotfix ten (Bilgisayarımızda yüklü hotfix leri listeleyen komut) dönen sonuçlardan KB31 ile başlayanları listeler. Her iki kullanımda doğrudur. Süslü parantez olmadan yapılan kullanım powershell in bize yeni versiyonlarında sunduğu kolaylıktır. Süslü parantez ile olan kullanımı geriye uyumluluk açısından tavsiye edeceğim bir kullanım şeklidir.

Evet arkadaşlar konuyu toparlamak gerekirse Powershell komutlarının çıktılarını istediğimiz gibi filtreleyebiliyorduk demiştik.  Bunun için iki yöntem olan -filter parametresi ve Where-Object komutundan bahsetmiştik. Bir anlamda Select-Object komutuda filtreleme yapar ama bu tam anlamı ile bir filtrelemeyi ifade etmediği için Select-Object i filtreleme konusuna dahil etmedik.

Filtrelemede esas olan powershell in karşılaştırma operatörleridir. Bu operatörleri bilmemiz gerekiyor.

Filtreleme yöntemlerinden en çok hangisi kullanılıyor diye soracak olursanız bana göre Where-Object filtrelemesidir.

Başka bir makalede görüşmek üzere…

Kürşat ARI / System Engineer & PowerShell Developer

 

 

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s