Windows Powershell – Bölüm 6 – Filtering Object – Part 1

By | 12 December 2016

Powershell anlatım serisine filtering ile devam ediyoruz. Konu ile ilişkili bir önceki makaleye aşağıdaki link üzerinden ulaşabilirsiniz.

Bölüm 5 – Importing Data

Filtering işlemi ile pipeline üzerinde tutulacak objeler belirlenir. Bu belirleme sırasında kriterler kullanılır. Bu kriterlerin yazılmasında da karşılaştırma operatörlerinden faydalanılır.

Objelerin property’lerine göre operatörler kullanılarak karşılaştırma yapılır, karşılaştırma sonucunda döndürülen değer “true” ise obje tutulur, “false” ise obje silinir.

 

Powershell üzerinde kullanılabilecek karşılaştırma operatörleri aşağıdaki gibidir;

  • -eq : Eşittir (equal to)
  • -ne : Eşit Değildir (not equal to)
  • -gt : Büyüktür (greater than)
  • -lt : Küçüktür (less than)
  • -le : Küçük yada Eşit (less than or equal to)
  • -ge : Büyük yada Eşit (greater than or equal to)

 

Bu operatörlerin hepsi string karşılaştırma değerleri için case sensitive değildir. Yani büyük küçük harf’e aldırış etmez. Eğer sting değerler için case sensitive bir karşılaştırmaya ihtiyaç duyulursa  -ceq ve -cne operatörleri kullanılabilir.

Bu operatörlerin yanında powershell üzerinde daha gelişmiş operatörler de vardır. Örneğin;

  • -in ve -contains operatörleri belirli bir objenin bir collection içerisinde bulunup bulunmadığını sorgular.
  • -as operatörü bir objenin belirli tipte olup olmadığına göre işlem yapmayı sağlar.
  • -match ve cmatch operatörü string değeri regular expressions ile karşılaştırır.

 

Powershell içerisinde karşılaştırmaları tersine yapan bir çok operatör de mevcuttur.

Örn:  -notlike , -notin

Karşılaştırma operatörleri powershell konsoluna direkt oalrak yazılabilir.

image001

image002

 

Powershell mimarisinde filtreleme yapılırken Where-Object (yada kısaca Where) komutu kullanılır. Where-Object komutu ile filtreleme iki şekilde yapılır.

1- Basic Filtering Syntax

Where-Object komutu kullanılarak basit filtreleme işlemi yapıldığında komutu karşılaştırılacak property,operatör ve karşılaştırılacak değer takip eder. Bunun sonucunda da kritere uyan değerler tutulurken diğerleri silinirler.

Basic filtering seçeneğinde komutun yazılması ve okunması diğerine göre oldukça kolaydır.

Get-Service | Where Status –eq Running

image003

Burada dikkat edilecek nokta karşılaştırılacak property isimlerinin düzgün yazılmasıdır. Herhangi bir kısaltma karşılaştırma durumunda kabul edilemez, çünkü kesinlik belirtmek gerekir.

Sınırlılıkları

Basic syntax ile sadece bir karşılaştırma yapılabilir. Yani kriter içerisinde sadece tek bir koşul belirtilebilir.

Örneğin bir servis için hem durumu “running” hem de başlangıç modu “automatic” olanlar listelenmek istendiğinde bu işlem basic syntax ile yapılamaz.

Bir diğer sınırlılık ise property’lere ait metodlara basic syntax ile ulaşılamaz. Örneğin isim uzunluğu 5 karakterden fazla olan process’ler listelenmek istenip aşağıdaki komut yazılırsa, komut istenilen sonucu vermez.

image004

 

Yukarıdaki örnekte name property’si System.String objesini kullanır ve System.String objesi Length property’sine sahiptir. Ancak bu değeri basic sytanx ile almak mümkün değildir.

2- Advanced Filtering Syntax

Where-Object advanced systax ile script filtreleme kullanır. Bu script içerisinde builtin olarak gelen $PSItem ($_.) değişkeni kullanılarak pipe edilmiş obje referans olarak gösterilir.Komut tarafından pipe edilen her bir obje için bu script bir kez çalıştırılır.Eğer sonuç “True” dönerse obje listelenir. Eğer sonuç “False” dönerse obje pipeline’dan silinir.

Aşağıdaki iki komut için sonuç aynıdır. Bunlardan birisi basic diğeri advanced sytax ile yazılmıştır.

Get-Service | Where name -eq BITS

Get-Service | where -FilterScript { $PSItem.Name -eq ‘BITS’}

image005

 

-FilterScript parametresi durumsal olarak kullanılır. Kullanılması zorunlu değildir.

Bazen filtreleme komutlarında where kelimesi yerine “?” kullanılabilir. Bu where kelimesinin aliası’dır.  Yani yukarıda kullanılan advanced syntax’a ait komutun alias’lar kullanılarak yazılım şekli aşağıdaki gibidir.

Get-Service | where -FilterScript { $PSItem.Name -eq ‘BITS’}

Get-Service | ? {$_.Name -eq ‘BITS’}

image006

 

BITS kelimesini yazarken ‘BITS’ şeklinde tırnak içine almak gereklidir. Aksi taktirde powershell BITS kelimesinde komut arama yolunu seçecektir.

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

Kaynak : Microsoft DMOC

Fırat

Leave a Reply