PowerShell Öğreniyorum – Döngüler – Bölüm 6

“font-family:Segoe UI; font-size:10pt”>PowerShell Öğreniyorum serisinin bu bölümünde PowerShell içerisinde döngü kullanımı incelenecektir.

Döngü (Loop) kullanımı diğer programa dillerinde olduğu gibi PowerShell içerisinde de belirlenmiş bir kod bloğunun belli bir sayıda ya da şarta bağlı olarak tekrar eder şekilde çalıştırılmasıdır. Bu temel programlama işlemi sayesinde yüklü verilerin komut içerisinde tekrar edilerek işlenmesi sağlanabilir.

Bu bölümde PowerShell içerisinde kullanabileceğiniz 2 farklı döngü tipi incelenecektir. For, ForEach.

For Döngüsü:

For döngüsü kullanımındaki temel amaç herhangi bir kod bloğunun belirlenen kez çalıştırılabilmesidir.

Kullanım Biçimi:

For (baslangic; kıstas; tekrar)

{kod bloğu}

Görüldüğü gibi ilk parantez içerisinde 3 farklı opsiyonel parametre tanımlaması yaptıktan sonra köşeli parantez ile ilgili kod bloğu çalıştırılabilir. Bu opsiyonel parametreler;

Baslangic: Virgül ile ayrılmış komutlar zinciridir ve döngü başlangıcından önce çalışırlar. Daha çok döngü öncesinde değişken atamaları için kullanılır.

Kriter: Her döngü çalışmasında PowerShell tarafından çalıştırılan kıstastır ve konsola True / False Boolean değerlerini döndürür. Eğer kıstas True değerini döndürürse ilgili kod bloğu çalıştırılacaktır.

Repeat: Virgül ile ayrılmış komutlar zinciridir ve her döngüde çalışırlar.

 

Çok sık kullanılan bir örnek ile başlayalım;



 

 

For döngüsündeki ilk parantezde, tüm parametreler (;) ile ayrılıyor.

  • İlk parametre ile $i değişkenine başlangıç değeri atanıyor.
  • İkinci parametre ile değişkenin döngü sonucunda ulaşacağı değer belirtiliyor. Bu değere ulaşıldığında False değeri döndürülerek döngü durduruluyor.
  • Son parametrede ise değişkenin artış değeri belirtiliyor.

Benzer diğer bir örnek;


Yukarıdaki For döngüsünde aynı şekilde $i değişkeni 5 değeri ile 10 değeri arasında döngüye sokulmuştur. Kod bloğunda ise $ekle isimli bir değişken oluşturularak $i'nin string değerinin ip adresinin son oktetine eklenmesi sağlanmıştır.

For döngüsünden bağımsız olarak ping komutu döngü ile her seferinde yeniden şekillenen $ekle değişkenini kullanarak konsola yansıtılmıştır.

Bu döngü sonucunda sırası ile döngüdeki aralıkta bulunan ip adresleri birer kez pinglenecektir.


Yukarıdaki for döngüsünde ise;

  • $input değişkeni boş string olarak atanmıştır.
  • Kriter kısmında $input değişkeni geçerli bir mail adresi içerip içermediğine dair kontrole sunulur. Kullanıcıdan alınan veride @ işareti olması sonrasında da (.) işareti olması istenir. (Örneğin anlaşılır olması için bu geçerlilik kontrolü temel seviyede tutulmuştur)
  • Read-Host komutu ile kullanıcının $input değişkeninin içeriğini doldurması istenir.
  • ! işareti ile sonuç ters çevrilir, True değeri döndürülürse mail adresinin geçersiz olduğu bilgisi konsola iletilir ve Write-Host ile hata metni yansıtılır.

Yukarıdaki döngü “geçerli bir mail adresi” girilene kadar devam edecektir.

For, PowerShell içerisinde bulunan en temel döngü biçimidir. Diğer döngü tipleri ile gerçekleştirilebilen karmaşık senaryolar sebebi ile sıklıkla başvurulmamaktadır.

For-Each Döngüsü:

For-Each döngüsü ile bir dizi içerisinde bulunan tüm öğeler üzerinde komutlar koşturulabilir. Bir önceki bölümde incelendiği gibi For döngüsü ile sınırlarını kendimizin belirlediği bir döngü oluşturup, özel oluşturulmuş bu sınırlar içerisinde döngünün ilerlemesini sağlıyorduk.

For-Each ile hali hazırda sahip olduğumuz bir sınıf ya da dizinin içerisindeki öğe ve alt öğelere müdahale edebilme imkanı bulunmaktadır.

Kullanım Biçimi:

Foreach ($ in $)

{kod bloğu}

Kullanım biçiminde de görüldüğü gibi bir koleksiyon içerisinde bulunan tüm öğelerde ilgili kod bloğunu çalıştırabilme imkânına sahip olunmaktadır.

For döngüsünde kullanılan ilk sayı örneği For-Each için uygulanmak istenirse;


Şeklinde bir döngü kullanılabilir. Bu döngüde 1'den 5' e kadar olan rakamları konsolda çıktı olarak verecektir. Foreach döngüsünü tanımlarken kullandığımız ifadeler üzerinden yukarıdaki örneği açıklamak istersek; var olan bir dizi içerisindeki tüm öğeleri tek tek okuyarak ekrana yansıtmaktadır.

Bu noktada yalnızca integer değerler kullanma zorunluluğu yoktur;



Görüldüğü gibi string değerler de koleksiyon içerisinde öğe olarak kullanılabilir.

Klasik For-Each döngüsünün yanında Pipe kullanımı ile de döngüler elde edilebilir. Sıklıkla kullanılan bu yöntem ile altyapı sistemleri üzerindeki operasyonel aksiyonlar rahatlıkla alınabilir.


Yukarıda iki farklı foreach döngü kullanımı örneklendirilmiştir.

İlk örnekte;

  • Pipeline kullanımı ile öncelikle tamamı alınan process listesinden, ismi iexplore olanlar ayıklanmıştır.
  • Son pipeline ile birlikte ayıklanan bu değerlerin oluşturduğu küme üzerinde foreach döngüsü kullanılmış ve her bir öğe için ekrana Name ve Cpu sütunlarının yansıtılması sağlanmıştır.
  • $_. Konsoldaki sütun isimlerini belirtmek için kullanılan özel karakterdir.

İkinci örnekte;

  • Get-process çıktısı içerisindeki tüm öğeler kümesi tanımlanmış ve her bir öğe $oge değişkenine atanmıştır.
  • If statement'ı kullanılarak ismi iexplore olanlar çekilmiş ve bu grup içerisindeki tüm öğelerin Name ve Cpu bilgilerinin ekrana yansıtılması sağlanmıştır.

Bu noktada dikkat edilmesi gereken nokta, ilk örnekte pipeline ile birlikte kullanılan foreach'in Foreach-Object komutunun kısaltması olduğudur.

ForEach-Object kullanıldığında her bir sonuç, komut işleyişi sırasında gerçek zamanlı döndürülür.

Foreach döngüsü ise tamamıyla kullanılabilir bir oge koleksiyonuna sahip olunmasını gerektirir.