PowerShell

run-penceresi
Komut satırı istemcileri, sistem yöneticileri ve bilgisayarla ileri düzey işlemler yapan kullanıcıların vazgeçilmez aracıdır.

Windows’un eski komut istemcisi(CLI, Command Line Interface) olan cmd.exe, işletim sistemi üzerinde tam hakimiyet sahibi değildi ve pek çok işlem arayüzden yapılmak zorundaydı. *Nix(Unix, Linux türevi) sistemlerde tecrübesi olan kullanıcılar, Windows kullanırken bir komut satırının eksikliğini hissetmekteydiler.

Microsoft, bu eksikliği gidermek için PowerShell’i geliştirdi.

  • Hem dilin hem de komut istemcisinin adı olan PowerShell, önceden sadece bir Windows Uygulaması iken, 2016 itibariyle çoklu platform ve açık kaynaklı bir uygulama haline geldi. Windows 7’den itibaren yayınlanan sürümlerde standart olan PowerShell’i, macOS veya Linux işletim sistemli bilgisayarınıza kurabilirsiniz.
  • PowerShell işlemleri cmdlet adı verilen komutlarla yapılır. cmdlet komutlarını birleştirerek script dosyaları(bkz. Batch File, BAT, Shell Script, SH) oluşturabilirsiniz.
  • Komutları ya da scriptleri kullanarak bilgisayarınızı ya da ağdaki diğer bilgisayarları yönetebilir, işlerinizi otomatize edebilirsiniz.
  • PowerShell kullanarak yerel veya uzak ağda bulunan Windows ya da Linux makineleri yönetebilirsiniz.
  • PowerShell API’sini kullanarak, PowerShell özelliklerini diğer uygulamaların içinden kullanabilirsiniz.
  • .NET api’sini desteklediği için, PowerShell’i, interaktif bir .NET konsolu olarak kullanabilirsiniz.

Windows’ta PowerShell’i açmak

Windows işletim sistemli bilgisayarınızda PowerShell’i açmak için Windows ve R düğmelerine basılı tutarak çalıştır penceresini açmanız ve açılan ekranda PowerShell yazıp enter’a basmanız yeterlidir.
run-penceresi
Çalıştır(Run) Penceresi.
power-shell-komut-istemcisi
PowerShell Komut İstemcisi

Genel Komut İstemcisi Kavramları

Alias(Kısa Ad)

Ekranların düşük çözünürlüklü, baytların değerli olduğu yıllarda komutlar kısaydılar.
Günümüzde böyle bir kısıtlama yok. PowerShell’de komutlar açıklayıcı olmaları için uzunlar. Eski komutlar ise yeni uzun komutların kısa adları olmuş durumdalar.
Örneğin hem bash hem cmd’de klasör değiştirmek için kullanılan CD komutu, PowerShell’de Set-Location olarak karşımıza çıktı. Ama Set-Location yazmak yerine halen CD komutunu kullanabiliyoruz.
Büyük işler yaptığınız scriptleri yazarken uzun adları, anlık işler için ise kısa adları kullanmak yerinde olacaktır.

Pipeline

Pipeline boru hattı anlamına gelmektedir.
Bilgisayar biliminin pek çok farklı alanında kullanılan tabir, kısaca; bir sıvının damlalarının bir borudan art arda akması gibi, işlemlerin sırayla yapılması anlamına gelmektedir.
Pipeline operatörüyle ayrılan işlemler sırayla yapılır. Operatörün solunda kalan işlem tamamlanınca, çıktısı sağdaki işlemin girdisi olur.
Bunun uygulamasını yazının devamında göreceğiz.

Comment

Script dosyalarımızda yaptığımız işleri açıklamak için yorumlar yazabiliriz. Bunun için # karakteri kullanılır. PowerShell, bu karakterin olduğu pozisyondan sonraki karakterleri görmezden gelir ve bir sonraki satıra geçer.
# aşağıdaki komut Klasor adlı klasörü açar
CD Klasor
veya
DIR #dir komutu mevcut klasördeki nesneleri listeler

Bazı Temel Komutlar

Şimdi bazı temel komutları öğreneceğiz. Daha sonra bunları birleştirip script haline getireceğiz.

Get-ChildItem(ls veya dir)

Bir konumda bulunan tüm nesneleri almak için kullanılır.
Linux bash’indeki ls ve Windows cmd’deki dir komutunun karşılığıdır ve bu her iki komut Get-ChildItem yerine kullanılabilir.
PowerShell’de parametre vermeksizin Get-ChildItem ls veya dir komutunu çalıştırırsanız, içinde bulunduğunuz klasördeki tüm nesneler(dosya veya klasör) listelenir.

ls # bulunulan konumdaki tüm klasörleri listeler
dir -Directory #sadece klasörleri listeler
Get-ChildItem SomeFolder #SomeFolder adlı klasörün içeriğini listeler

Write-Output

Verilen nesneyi yazdıran komut. Bu nesne doğrudan bir metin ya da bir değişken olabilir.
cmd ve bash kısa adı ECHO’dur ve bu kısa adlar PowerShell’de de geçerlidir. Bir diğer kısa adı ise write’dır.

Write-Output “hello world”
write “hello world”
$greetWord = “hello world”   # içeriği hello world olan bir değişken oluşturur
ECHO $greetWord              # yukarıda tanımlanan değişkeni yazdırır

ForEach(%)

Bir nesne dizisinin içinde dönmek için kullanılan komut.
Yazının devamında detaylı olarak inceleyeceğiz.

Get-Command(gcm)

Kullanılabilir komutların listesini almak için kullanılan komut.

Get-Command -Type Cmdlet #cmdlet tipindeki komutları getirir
gcm -type cmdlet *write* #adının içinde write kelimesi geçen cmdlet tipindeki komutları getirir

Get-Help

Verilen komutun kullanımı hakkında bilgi verir. Linux karşılığı man pages.

Get-Help Write-OutPut # Write-OutPut komutu hakkında bilgi verir.
Get-Help ECHO # Komut yerine kısa adını da verebilirsiniz

Öğrendiklerimizi birleştirelim

Şimdi bu komutları kullanarak bir script yazalım. Bu script, bir klasörün altında bulunan tüm klasörleri listelesin.
$dirs = Get-ChildItem -Directory
ForEach ($dir in $dirs) {
    Write-Output $dir
}
Yukarıdaki kodu satır satır inceleyelim.
  • İlk satırda bir değişken(dirs) oluşturuyor ve hemen atamasını yapıyoruz. Değişkenin içine atadığımız değer, Get-ChildItem -Directory komutunun çıktısı. Yani o an içinde bulunulan klasörde bulunan klasörler.
  • İkinci satır ForEach komutu ile başlıyor. Üst satırda oluşturduğumuz değişken olan dirs, ForEach komutunun içinde döneceği nesne kolleksiyonu. Her bir adımda üzerinden geçilen nesne ise dir adlı değişkene atanıyor.
  • Üçüncü satırda, dir değişkenini yazdırıyoruz.
power-shell-kod-ve-ciktisi
Kod ve Çıktısı.
Eğer klasör hakkında detaylı bilgi değil sadece klasörün adını yazdırmak istersek kodu aşağıdaki şekilde değiştirebiliriz. Bu kolaylığın sebebi, PowerShell’in nesne tabanlı olmasıdır.
$dirs = Get-ChildItem -Directory
ForEach ($dir in $dirs) {
    Write-Output $dir.Name             #sadece .Name kısmını ekledik
}
power-shell-kod-ve-ciktisi-1
Sadece klasör isimlerini yazdırdık.

Pipeline kullanarak kodu sadeleştirelim

Pipeline, boru hattı anlamına gelmektedir.
Bilgisayar biliminin pek çok farklı alanında kullanılan tabir, kısaca; bir sıvının damlalarının bir borudan art arda akması gibi, işlemlerin sırayla yapılması anlamına gelmektedir.
Şimdi pipeline ( | ) operatörünü kullanarak kodumu değiştirelim.
Get-ChildItem -Directory | ForEach { Write-Output $_ }
  • Burada önce  Get-ChildItem -Directory komutu çalıştırılmakta ve bunun çıktısı, Operatörün diğer tarafında kalan komuta girdi olarak gönderilmektedir.
  • Bu ikinci komut, yani ForEach de oldukça kısalmıştır çünkü pipeline operatörünü takip ettiği için hangi kolleksiyonu kullanacağını zaten bilmektedir.
  • Üçüncü komutumuz olan Write-OutPut ise, ForEach’in o an üzerinden geçmekte olduğu nesnenin bilgisini tutan $_ değişkenini yazdırmaktadır.
power-shell-kod-ve-ciktisi-2
Kısaltılmış kodun çıktısı, uzun kodun çıktısından farklı değil.

Kısa adları kullanarak kodu daha da kısaltalım

Kodumuzun son halinde yer alan komutları kısa adlarla değiştirmemiz yeterli olacak.
ls -Directory | % { ECHO $_.Name }
Kısatılmış kodun çıktısı.

Özet

Bu yazıda;
  • PowerShell’in ne olduğunu, özelliklerini, arka planını
  • Komut Satırı İstemcisi, Comment, Alias, Pipeline, Script gibi kavramları
  • Bazı temel PowerShell komutlarını
öğrendik.
Sonrasında tüm bunları birleştirerek, bir klasörün içinde bulunan klasörlerin adlarını yazdıran bir script yazdık.

Kaynaklar

 132 Okunma

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir