PowerShell Diziler
PowerShell dizi nasıl tanımlanır? PowerShell array yapısı, PowerShell listeler (array list), PowerShell hash tabloları (hash table, dictionary), PowerShell döngü (for, foreach, while) ile dizi elemanlarına erişmek
PowerShell Diziler Hakkında
Dizi, bir öğe koleksiyonunu saklamak için kullanılabilen bir veri yapısı türüdür. Öğe koleksiyonu aynı veri tipinden veya farklı olabilir. Bir dizideki öğelere indeks kullanılarak erişilebilir. Dizinin indeksi genellikle 0’dan başlar ve bu nedenle ilk öğeye erişmek için [0] indeksini kullanmanız gerekir. Genellikle dizilere öğe ekleme veya öğe kaldırma şeklinde iki işlem olabilir. Bu yazıda, PowerShell Diziler hakkında bilgi verilecektir.
PowerShell Dizi (Array) Tanımlamak
Bir dizi aşağıdaki yollardan biriyle tanımlanabilir:
- Bir dizi tanımlamanın yollarından biri
@()
şeklindedir.
Örnek:$Dersler= @('Tarih','Coğrafya','Matematik')
- Bir dizi, virgülle ayrılmış bir liste olarak da oluşturulabilir.
Örnek:$DomainUsers='ahmet','attila','reis'
- Belirli bir veri türü için bir dizi oluşturulabilir.
Örnek:[int[]] $numbersarray = 1,2,3,4,5
PowerShell Dizi Elemanlarına Erişmek
PowerShell dizi elemanlarına erişmek konusuna aşağıdaki örnek üzerinden devam edelim.
Örnek:
$Dosyalar=@('Personel.xls','Maas.xls','Terfi.xls','Haftalik_Rapor.doc')
$Dosyalar[0] komutu “Personel.xls” sonucunu, $Dosyalar[3] komutu ise “Haftalik_Rapor.doc” sonucunu döndürecektir. Birçok dil yalnızca tek bir indeks belirtilmesine izin verirken, PowerShell dilinde birden çok indeks aynı anda kullanılabilir. $Dosyalar[1,2] komutu “Maas.xls” ve “Terfi.xls” sonucunu döndürecektir.
PowerShell Dizi İşlemleri
PowerShell Diziye Eleman Eklemek
Mevcut bir diziye nasıl öğe ekleneceğine ilişkin bir örnek görelim.
Örnek:
$Title=@('Aktif','Dizin')
Yukarıdaki diziye bir eleman eklemek için ‘+ =’ operatörü kullanılabilir.
$Title+='Servisi'
$Title komutu çıktısı:
PS C:\Users\ahmet> $Title=@('Aktif','Dizin') $Title+='Servisi' $Title Aktif Dizin Servisi PS C:\Users\ahmet>
PowerShell Dizi Elemanının Değerini Değiştirmek
Bir dizinin herhangi bir elemanını değiştirmek için o elemanın indeksi kullanılır.
Örnek:
PS C:\Users\ahmet> $Title=@('Aktif','Dizin', 'Dersleri') $Title[2] = 'Ders Notları' $Title Aktif Dizin Ders Notları PS C:\Users\ahmet>
PowerShell Diziler Eleman Sayılarının Bulunması
Bir dizinin eleman sayısı aşağıdaki şekilde ‘.Count‘ ile alınabilir.
Örnek:
PS C:\Users\ahmet> $Dosyalar=@('Personel.xls','Maas.xls','Terfi.xls','Haftalik_Rapor.doc') $Dosyalar.Count 4 PS C:\Users\ahmet>
PowerShell Dizi Elemanlarını Sıralamak
Öğeler aynı veri türündeyse, “Sort” operatörü bir dizinin öğelerini sıralamak için kullanılabilir. Hiçbir özellik uygulanmazsa varsayılan olarak küçükten büyüğe sıralama yapacaktır.
Örnek:
PS C:\Users\ahmet> $numaralar=@(4,6,7,11,9) $numaralar | sort 4 6 7 9 11 PS C:\Users\ahmet>
Büyükten küçüğe sıralamak için “-Descending” parametresi kullanılır.
PS C:\Users\ahmet> $numaralar=@(4,6,7,11,9) $numaralar | Sort -Descending 11 9 7 6 4 PS C:\Users\ahmet>
PowerShell Dizi Elemanını Bulmak
Bir dizi içindeki herhangi bir elemanı aramak ve bulmak için “-like” operatörü kullanılabilir. “*” karakteri ile ilgili ileride derinlemesine bilgi veriyor olacağız. Ancak şimdilik “*erson*” ifadesinin başlangıç ve bitişindeki karakterlerinin önemi olmaksızın “erson” içeren “Personel.xls” gibi ifadeleri getireceğini bilmemiz yeterli olacaktır.
PS C:\Users\ahmet> $Dosyalar=@('Personel.xls','Maas.xls','Terfi.xls','Haftalik_Rapor.doc') $Dosyalar -like "*erson*" Personel.xls PS C:\Users\ahmet>
PowerShell Çok Boyutlu Diziler
$TestMultidimensionalArrays = @(1,2,3), @(4,5,6), @(7,8,9)
Aşağıdaki şekilde yani “$TestMultidimensionalArrays[2][1]” şeklinde bu dizinin 2. satırının 1. sütunundaki öğeye erişilebilir.
PS C:\Users\ahmet> $TestMultidimensionalArrays = @(1,2,3), @(4,5,6), @(7,8,9) $TestMultidimensionalArrays[2][1] 8 PS C:\Users\ahmet>
PowerShell For Döngüsü İle Dizi Elemanlarına Erişmek
Diğer dillerde olduğu gibi, for döngüsü bir dizideki elemanlara erişmek için kullanılabilir.
PS C:\Users\ahmet> $Dosyalar=@('Personel.xls','Maas.xls','Terfi.xls','Haftalik_Rapor.doc') for($i=0;$i -lt $Dosyalar.Length; $i++) { Write-Host $Dosyalar[$i] } Personel.xls Maas.xls Terfi.xls Haftalik_Rapor.doc PS C:\Users\ahmet>
PowerShell While Döngüsü İle Dizi Elemanlarına Erişmek
#Kod: $SicilNo = 46008978, 46008975, 46008972, 46008971, 46008976, 46008977, 46008978, 46008979, 46008928, 46008178 $i = 0 while($i -lt $SicilNo.Length) { $SicilNo[$i]; $i++ } #Çıktı 46008978 46008975 46008972 46008971 46008976 46008977 46008978 46008979 46008928 46008178
PowerShell ForEach Döngüsü İle Dizi Elemanlarına Erişmek
ForEach dizideki her öğeye karşı bir eylem gerçekleştirmek ve yine For döngüsü gibi her elemana erişebilmek için kullanılabilir.
PS C:\Users\ahmet> $test=@(1,4,5,6,7,8,9,10) foreach($i in $test) { $i=$i+5 Write-Host $i } 6 9 10 11 12 13 14 15 PS C:\Users\ahmet>
PowerShell Listeler (PowerShell Array List)
PowerShell Listeler Örnek:
$Baslik = [System.Collections.ArrayList]::new() $Baslik.Add("Aktif") $Baslik.Add("Dizin") $Baslik.Add("Servisi") $Baslik
PowerShell Listeler Örnek Çıktısı:
PS C:\Users\ahmet> $Baslik Aktif Dizin Servisi PS C:\Users\ahmet>
İlk satır, listeyi oluşturmanın yoludur ve sonraki satırlar bu listeye eleman eklemektir.
PowerShell Diziler vs Listeler İçin Performans Karşılaştırması (Array vs Array List)
Aşağıdaki örnekler, bir dizi veya listede işlem gerçekleştirirken performans farkını gösterir. Örnekte “$dizi” isminde bir dizi ve “$liste” isminde bir liste oluşturulup 5000’er eleman yüklenmiştir. İkiside “ForEach” döngüsüne sokulup performansları “Measure-Command” ile ölçülmüştür.
Girdi:
#Dizi Performansı $dizi = @() $dizi_performansı = Measure-Command -Expression { 0..5000 | ForEach-Object { $dizi += $_+1 }} $dizi_performansı Write-Host `n #Liste Performansı $liste = [System.Collections.ArrayList]@() $liste_performansı = Measure-Command -Expression { 0..5000 | ForEach-Object { $liste += $_+1 }} $liste_performansı
Çıktı:
#Dizi Performans Çıktısı Days : 0 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 576 Ticks : 5762328 TotalDays : 6,66936111111111E-06 TotalHours : 0,000160064666666667 TotalMinutes : 0,00960388 TotalSeconds : 0,5762328 TotalMilliseconds : 576,2328 #Liste Performans Çıktısı Days : 0 Hours : 0 Minutes : 0 Seconds : 0 Milliseconds : 521 Ticks : 5218206 TotalDays : 6,03959027777778E-06 TotalHours : 0,000144950166666667 TotalMinutes : 0,00869701 TotalSeconds : 0,5218206 TotalMilliseconds : 521,8206
Bu teste göre listelerin performansı dizilerin performansından daha hızlı ve daha iyidir.
PowerShell Diziler İçin Örnekler
Aşağıdaki örneklerle şimdiye kadar öğrendiklerimizi pekiştirelim.
Aşağıdaki örnekte bir dizi kullanıldı ve “C:\Windows” altında bulunan tüm klasörler bu dizi elemanı olarak eklendi. Ardından “foreach” döngüsü ile dizi elemanları sıralandı.
Örnek:
$win = ls "C:\Windows" $objeler = $win.Name foreach($obje in $objeler) { Write-Host $obje }
Aşağıdaki örnekte PowerShell “Get-EventLog” komutu ile Windows Event Logs altından tüm System event logları “$Loglar” isimli bir listeye eklenmiştir. Ardından yine bir “For” döngüsü ile tüm EventID’ler listelenmiştir.
Örnek:
$Loglar = [System.Collections.ArrayList]@() $Loglar = Get-EventLog -LogName System for ($i = 0; $i -lt $Loglar.Length; $i += 1) { Write-Host $Loglar[$i].EventID }
PowerShell Hash Tablosu
PowerShell Hash Tablosu bir yapısal dizidir. Bir PowerShell hash tablosu elemanlarını anahtar-değer (key-value) formatında tutar. Bu yapı diğer dillerde Sözlük (Dictionary) yada İlişkisel Dizi (Associative Array) olarak da isimlendirilir.
PowerShell Hash Tablosu Örnek:
#Boş bir PowerShell Hash Tablosu Tanımlamak: $testhashtable=@{}
PowerShell Hash Tablosu Örnek:
PS C:\aktifdizin> $Personel=@{ Adi="Ahmet";Soyadi="Elibol";Gorevi="Yazar"} $Personel Name Value ---- ----- Adi Ahmet Soyadi Elibol Gorevi Yazar PS C:\aktifdizin>
Yukarıdaki örnekte “$Personel” isminde bir PowerShell Hash Tablosu yani Dictionary tanımlandı. “Adi“, “Soyadi” ve “Gorevi” anahtarları için “Ahmet“, “Elibol“, “Yazar” değerleri atandı.
Sadece anahtarlara erişim için “.Keys” kullanılır.
PS C:\aktifdizin> $Personel=@{ Adi="Ahmet";Soyadi="Elibol";Gorevi="Yazar"} $Personel.Keys Adi Soyadi Gorevi PS C:\aktifdizin>
Sadece değerlere erişim için “.Values” kullanılır.
PS C:\aktifdizin> $Personel=@{ Adi="Ahmet";Soyadi="Elibol";Gorevi="Yazar"} $Personel.Values Ahmet Elibol Yazar PS C:\aktifdizin>
PowerShell Hash Tablosu Örnekler:
Girdi:
$Notlar = @{ Turkce = "100"; English = "85"; Matematik = "95"} write-host("Hash Tablosu Anahtarları Yazdırılıyor") $Notlar.keys write-host("Hash Tablosu Değerleri Yazdırılıyor") $Notlar.values write-host("Hash Tablosu Veri Adeti") $Notlar.Count write-host("Hash Tablosu Veri Ekleniyor") $Notlar["Sosyal"] = "93" write-host("Hash Tablosu Veri Ekleniyor") $Notlar.Add("Coğrafya","88") write-host("Hash Tablosu Veri Adeti") $Notlar.Count write-host("English Dersi Siliniyor") $Notlar.Remove("English") write-host("Hash Tablosu Veri Adeti") $Notlar.Count write-host("Hash Tablosu Anahtara Göre Sıralanıyor") $Notlar.GetEnumerator() | Sort-Object -Property key
Çıktı:
Hash Tablosu Anahtarları Yazdırılıyor English Matematik Turkce Hash Tablosu Değerleri Yazdırılıyor 85 95 100 Hash Tablosu Veri Adeti 3 Hash Tablosu Veri Ekleniyor Hash Tablosu Veri Ekleniyor Hash Tablosu Veri Adeti 5 English Dersi Siliniyor Hash Tablosu Veri Adeti 4 Hash Tablosu Anahtara Göre Sıralanıyor Hash Tablosu Değerlere Göre Sıralanıyor Name Value ---- ----- Matematik 95 Sosyal 93 Coğrafya 88 Turkce 100
PowerShell Diziler
Bir dizinin ana avantajı bellek yönetimidir. Bunlara doğrudan önbellekten erişilebilir, bu da daha hızlı alınmasına yardımcı olur. Tanımlandıktan sonra birden çok kez tekrar kullanılabilirler.
PowerShell Diziler
Makalemizi okuduğunuz için teşekkür ederiz. Soru ve önerilerinizi aşağıdaki formu kullanarak bize iletebilirsiniz. “PowerShell Nedir?” isimli makalemiz ilginizi çekebilir.
Güzel örnekler ile çok faydalı olmuş hocam teşekkürler,
Ben teşekkür ederim. İşinize yaramasına sevindim.