PowerShell Temel DERSLER 6 (Pipe LINE)

Merhaba Arkadaşlar, yeni bir makale, yeni bir konu ile yine birlikteyiz artık temel derslerden kurtulup daha ileri seviyelere ulaşmak istediğinizin farkındayım. Maalesef bir işin temel atması uzun sürüyor. Sonrası zaten hızlı ilerler bu sizin yüzde 80 istek yüzde 20 becerinize kalmış bir şey, istemenin yüzdesini büyük tuttum çünkü istenirse yapılamayacak şey yoktur. Aslına bakarsanız burada başaracağımız şey tam olarak şudur kimse sizden araba yapmanızı istemiyor. Sadece onu kullanın istiyor. Bu iş kolay arkadaşlar arkanıza yaslanın ve devam edin…

Makalelerimi okuyan uzman seviyesinin üzerindeki arkadaşlar, “ah be kardeşim olayı çok basite indirgeyerek anlatmışsın” eleştirilerini sunabilirler. Hedefim bu işe yeni başlayan arkadaşlarımız üzerindeki o gereksiz korkuyu almak olduğu için biraz daha basite indirgedim. Daha önce çalıştığım bir japon firmasında japon felsefelerinden şunu öğrenmiştim. Bir işe başlayacaksan onu en basite indirge mümkün olduğunca sade ve az olsun. Sonra onu yavaş yavaş inşa et. Herneyse önsözü biraz fazla uzattık galiba

Pipeline nedir?

Pipe işareti ile başlayalım, ascii karakter tablosundan “|” şeklinde bir sembolün adıdır pipe. Her klavyedeki yeri farklı olabilir Türkçe klavyelerde genelde sol shift tuşunun sağında bulunur. AltGr tuşuna basarak çıkartıldığınıda söyleyelim.

Önceki konulardan hatırlayacağımız üzere bir komut yazıp çalıştırdığımızda konsol ekranımıza bir çıktı geliyordu. Amacımız komutun üreteceği çıktıları görmek sahip olmaktı. Örneğin Get-ChildItem komutunu çalıştırdığımızda karşımıza dosya ve klasörler çıkıyordu.

Şöyle bir senaryo yazalım diyelimki c:\temp klasöründe binlerce dosyamız var. Bu dosyanın içerisindede .jpg uzantılı onlarca dosyamız olsun. Amacımız bu dosyaları bulup uzantılarını .png yapmak.

Bunu iki şekilde başarabiliriz birincisi Get-ChildItem -path c:\temp\*.jpg komutunu yazıp çıkan sonuçlara bakıp dosya isimlerini tek tek not alıp sonrasında dosyaların uzantılarını tek tek değiştir komutu kullanarak.

Bunuda Rename-Item -path c:\temp\dosya(1).jpg -newname dosya(1).png komutu ile yaparız. Bu onlarca yüzlerce dosya için sanırım gün boyu sürecektir. Üstelikte atlama hata yapma olasılığınız dikkatinize ve yoğunluğunuza bağlı olarak artacaktır.

Neden şöyle birşey olmasınki birinci komutumuz dosyaları istediğimiz şekilde filtreleyip bize göstersin hemen arkasındanda şöyle bir komut olsun. Birinci komutun çıktılarını ikinci komutumuz, biz müdahale etmeden kullansın. Yani birinci komuttan üretilen çıktıları ikinci komut parametresine girdi olarak alsın. İşte “|” işareti artık buna operatör diyelim tam olarak bu işi yapıyor sol tarafında üretilen çıktıları sağ tarafında bir paremetrenin veya parametrelerin girdisi olarak kullanıyor.

Örneğimizde pipe den önceki komutun çıktıları Rename-Item komutunun -newname parametresinin girdisi olarak kabul ediliyor. Bu arada birinci komutun çıktısı bir dizi halinde bellekte saklanıyor. Dizilerinde sırayla birinci ikinci üçüncü…. elemanları ve değerleri oluyor. pipe bu dizideki değerleri tek tek alarak Rename-Item komutunda kullanıyor. Senaryomuzda birinci komutun çıktıları

Get-ChildItem c:\temp*.jpg

Snap_2018.02.28 11.33.40_016

Şimdi ikinci komutumuzu pipe den sonra yazalım

Get-ChildItem c:\temp\*.jpg |Rename-Item -NewName {$_.basename+”.png”}

Snap_2018.02.28 14.11.01_022

Burada ikinci komut yani Rename-Item komutu birinci komutun çıktılarından herbirini sırayla parametre olarak alıp işliyor. Burada “$_ ” o an kullanılan geçici bir değişkendir. Değişken kavramına detaylarıyla, ilerleyen derslerde değineceğiz.

$_ değişkeni komut çalıştığında sırayla dosya(1).jpg, dosya(2).jpg … olarak değişecektir.

Yani ilk olarak dosya(1).jpg alınıp isminin sonuna .png eklenecektir. $_.basename ifadesi ise dosya(1).jpg den sadecece dosya(1) ifadesini almak anlamına geliyor “+” operatoru ile de ifadenin sonuna “.png” yerleştiriyoruz.

Böylece her bir dosya için $_ geçici değişkenini dosya(1).jpg , dosya(2).jpg , dosya(3).jpg … olarak kullanıp işlemlerimizi tamamlıyoruz.

Snap_2018.03.01 08.17.26_023

Pekiya pipe nin solundaki komutların çıktılarının tek tek sağındaki komutlara uygulandığını o esnada neler oluyor görmek istermisiniz. Bunun için yeni bir örnek yapalım. Bu örneğimizdede uzantısı .png olan dosyaların uzantısınız .xng yapalım. Bunun için komutun sonuna -verbose  parametresini koymak yeterli olacaktır. Bu sayede işlemlerin tek tek nasıl yapıldığını göreceğiz. Hadi uygulayalım

Get-ChildItem c:\temp\*.png |Rename-Item -NewName {$_.basename+”.xng”} -verbose 

Snap_2018.03.01 09.03.23_024

Gördüğünüz üzere pipenin sol tarafındaki komutun çıktıları sırayla sağ tarafta tek tek işleniyor.

Burada vermiş olduğumuz örnekten ziyade şunu anlamış olmamız gerekiyor. “|” işaretinin solundaki komutun ürettiği çıktıları sağındaki komuta girdi olarak aktarıyoruz. Dersimizin ana teması budur.

Komutun solundaki çıktıların formatı komutun türüne göre değişebilir yine aynı şekilde bu çıktıları, pipe nin sağında ki kullanım şekilleride her komutta değişkenlik gösterebilir ama zor değil 🙂

Peki birden fazla pipe kullanabilir miyiz? Elbette kullanırız burda amaç pipenin solundaki çıktıları sağına girdi olarak almak.

Şimdi örneklerimize devam edelim.

Get-EventLog -LogName system -Newest 5 | Out-GridView komutu windows event log lardan system kategorisinde olanların en yeni 5 kaydını Out-GridView de gösterir.

1

Get-ChildItem C:\temp | Select-String ‘guc’  komutu temp klasörü altında bulunan dosyaların içeriklerinde “guc” kelimesini arayıp hangi dosyanın hangi satırında olduğunu gösterir

2

Get-Content C:\Temp\def.txt | Get-Unique

Get-Content -Path C:\Temp\def.txt | Get-Unique | Measure-Object

Get-Content -Path C:\Temp\def.txt | Get-Unique | Measure-Object | Select-Object Count

Örnekler sırayla def.txt dosyasında birden fazla geçen ifadelerin sadece bir tanesini gösterir. İkinci ve üçüncü örneklerde istatistik bilgilerini gösterir. Örneğin dosyada tekil olan 15 kelime varmış

5

Format-Table, Format-List ve Format-Wide Komutları

Şimdide pipe ile en çok kullanılan, çıktıların görünüş biçimlerini düzenleyen Format-Table, Format-List ve Format-Wide komutlarının pipe ile kullanımını görelim.

Format-Table

Get-ChildItem komutunun varsayılan çıktısı aşağıdaki formattadır.

Snap_2018.03.01 10.32.47_031

Görüldüğü üzere Mode,LastWriteTime,Length ve Name alanlarını gösteriyor. Dilersek bunu özelleştirebiliriz.

Get-ChildItem | Format-Table Name,LastWriteTime komutu ile sadece istediğimiz alanların görüntülenmesini sağlayabiliriz.

Get-Service komutu varsayılan olarak servislerin Status,Name ve DisplayName alanlarını gösterir.

Snap_2018.03.01 11.09.32_032

 

Get-Service | Format-Table Status,Name komutu ile sadece Status ve Name alanlarını görüntülüyoruz.

Snap_2018.03.01 11.11.28_033

 

Format-List

Her komutun varsayılan çıktıları farklı olabilir. Genellikle çıktıları uzun olan komutların varsayılan gösterimleri Format-List biçimindedir.

Get-NetIPConfiguration komutu ve çıktısı aşağıdaki gibidir. Komut genel olarak ethernet adaptörlerinin bilgilerini göstermeye yarar.

Snap_2018.03.01 11.13.55_034

Get-NetIPConfiguration | Format-List IPv4Address,IPv6Address yazarak sadece istediğimiz alanları görüntüleriz.

Snap_2018.03.01 11.15.09_035

Get-ChildItem | Format-List Name,LastWriteTime komutunu deneyelim.

Snap_2018.03.01 11.15.50_036

 

Format-Wide

Benim çok kullanmadığım bir komut olan Format-Wide içinde bir örnek yapalım.

Get-Service |Format-Wide Name Komutu çıktıları yayarak gösterir. Varsayılan durumda iki kolon halinde gösterir.

Snap_2018.03.01 11.17.37_037

Şimdi gösterim şekil komutlarını biraz daha detaylandıralım. AutoSize,Wrap,ColumnName

Format-Table -Autosize

-AutoSize Parametresi verilerin değerine göre sutun boyutunu ayarlar.

Get-ChildItem c:\temp |Format-Table -AutoSize 

Snap_2018.03.01 11.19.52_038

Format-Table -Wrap

Örnek çıktıyı incelerseniz EntryType alanı  “… ” nokta ile kesilmiş yani -Wrap parametresi metin üzerinde kaydırma yapar.

Get-EventLog -LogName Security -Newest 2 | Format-Table -Wrap

Snap_2018.03.01 13.24.45_042

Format-Wide -Column

Spesifik olarak kolon sayısı belirtilebilir varsayılan değeri 2 dir.

Snap_2018.03.01 11.20.45_039

 

Evet arkadaşlar bir makalenin daha sonuna geldik. Özetlemek gerekirse Pipe nedir ve kullanımını ayrıca komutların çıktılarının gösterimlerini biçimlemek için Format-Table, Format-List ve Format-Wide Komutlarını ve bu komutlara özel -AutoSize,Wrap,Column parametrelerini ve nasıl kullanıldıklarını  örnekleri ile gördük.

Bir sonraki makalemizde 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