Powershell ve Avantajları

Eyl 07, 2013
Powershell Microsoft’un Windows tabanlı işletim sistemlerinde kullanılması için çıkardığı bir komut satırıdır. Bu güne dek Microsoft’un çıkartmış olduğu ürünlerin büyük bir kısmı grafiksel bir arayüzden yönetilmekteydi. Ancak Server 2008’in kullanıma sunulmasıyla beraber Linux ve Unix tabanlı işletim sistemlerinde görülmeye alışkın olunan komut satırı artık Windows işletim sistemlerinde de mevcut hale geldi.
İlk bakışta basit bir komut satırı gibi duran "Powershell", aslında bundan çok daha fazlasıdır, hatta bir programlama dili derleyicisi yapısına sahiptir ve birçok programlama dilinde yapılabilecekleri bünyesinde barındırır. Bu sistem yöneticileri için büyük kolaylıklar sağlamıştır. Arayüzden yapabilecekler ve daha fazlası Powershell kullanılarak çok kısa sürede yapılabilir.
Powershell, bilgisayarın dosya sistemine erişilmesine imkan sağlar ve buna ek olarak kayıt defteri ve sayısal sertifika depoları gibi erişimlere de dosya sistemi gibi erişebilme olanağı vardır. Özellikle Powershell ile .Net kütüphanesini kullanarak script (betik) yazabilme olanağı yönetimsel işler açısından kullanıcılara büyük avantajlar sağlamıştır. Ayrıca Powershell mevcut komut satırı araçları ile birlikte çalışmaktadır. Komut satırında yapılabilen herşey Powershell'de de yapılabilir. Bunlara ek olarak Powershell'de matematiksel işlemler de kolaylıkla yaptırılabilir, hesap makinesi gibi de kullanılabilir.

Kurulum

Powershell Server 2008 işletim sisteminin bir eklentisi olarak bulunmaktadır, ancak Microsoft, Powershell'in Windows XP SP2, Windows 2003 SP1, Windows Vista veya güncel sürümlerinde de kullanılmasına olanak sağlıyor. Ancak daha öncesinde de söylendiği gibi Powershell .NET kütüphanesini kullandığı için bunun bilgisayarda kurulu olması gerekmektedir. Microsoft Server 2008 kullanılıyorsa Powershell'i indirmeye gerek yoktur, çünkü Powershell zaten Server 2008’in bir özelliğidir.

  • Server 2008'de Powershell Kurulumu

Start (Başlat) -> Server Manager (Sunucu yöneticisi) -> Features (Özellikler) -> Add Feature (Özellik Ekle) buradan Powershell seçilerek kurulum yapılır. Kurulum tamamlandıktan sonra Start (Başlat)-> Powershell ile kullanılabilir.

Kullanım

Powershell'de kullanılan birçok komut isim ve işlev açısından Linux komutlarına benzemektedir, bu yüzden daha önce Linux ile çalışma imkânı olanlar Powershell’i rahatlıkla kullanabileceklerdir. Powershell arayüzüne komutlar metin tabanlı olarak girilse de aslında arka planda nesne tabanlı bir yapıya sahiptir. Yani powershell metinleri işlemez,  .NET ortamına dayalı nesnelerle işlem yapar.
Powershell’de komutların çalışma mantığı .Net ile aynıdır. Tüm komutlar fiil-isim şeklinde bir kullanıma sunulur. Örneğin sistemdeki çalışan süreçleri görüntülemek için “Get-Process” komutu kullanılır.



 
Aşağıda temel ve en çok kullanılan komutlardan bahsedilmiştir.

NOT: "get" komutları sadece veri çekebilen, "set" komutları veri işleyebilen komutlardır.

Aşağıdaki tabloda kullanılan bazı komutların kısaca görevleri ve Linux ile karşılaştırmaları verilmiştir.

Powershel(Cmdlet) Powershell(alias)  cmd.exe Linux Görevi
 Set-Location  cd,chdir  cd,chdir cd  Dizin Değiştirir.
 Clear-Host  cls, clear  cls  clear  Ekranı Temizler.
 Copy-Item  cpi, copy, cp  copy, cp  cp  Dosya ve Dizin Kopyalar.
 Get-Help  help, man  help  man   Yardım Görüntüler.
 Remove-Item

 ri, del, rmdir,

 rd, rm

 del, rmdir,

 rd

rm, rmdir  Dosya ve Dizin Siler .
 Rename-Item  rni, ren  ren mv

 Dosya ve Dizin Taşır,

 Adını Değiştirir.

 Get-Childitem  gci, dir, ls  dir ls  Dizin İçeriğini Görüntüler.
 Write-Output  echo, write  echo echo 

 Bir Yazıyı ya da Değişkenin
 Değerini Yazıdırır .

 Set-Variable  sv, set  set set  Değişkene Değer Atar.
 Get-Content  gc, type, cat  type cat   Dosyaların İçeriğini  Görüntüler.


Yardım Almak

Powershell kullanırken komutlar hakkında yardım almanın birçok yolu vardır. Bunlardan en sık kullanılan ve en çok işe yarayacak olan "man" komutudur. Aslında man komutu da "get-help" komutunun takma adıdır.
Bir komut hakkında yardım almak isteniyorsa, "man komut ismi" şeklinde aratılabilir. "Man get-process" komutunu çalıştırıldığı zaman "get-service" komutu hakkında ekrana bir yardım sayfası gelir. Man komutuna "–detailed" parametresi getirildiği zaman da komut hakkında daha detaylı bilgiyi örnekleriyle birlikte verir.


Alias (Takma Ad)

Powershell’ de kullanılan bazı komutları için farklı aliaslar (takma adlar) tanımlanmıştır. Örneğin silme işlemi için kullanılan "remove-item" komutunu kullanmak yerine "ri" komutunu kullanılabilir. Bunun gibi birçok takma ad tanımlanmıştır, sistemdeki tanımlı takma adların listesini görmek için yine "get-alias" komutu kullanılabilir.



"Set-alias" komutu ile de farklı takma adlar tanımlanabilir. "Set-alias gs get-service"  komutunu kullanarak "get-service" komutuna "gs" takma adı tanımlanmış olunur. Artık "gs" komutu ile "get-service" komutu aynı çıktıyı verecektir.



New-Item

Bu komut yine en çok kullanılan komutlardan biridir. Powershell kullanarak dosya sisteminde gezinirken, "new-item" komutu yeni dosya, klasör veya dosya uzantısını bilinen her tip oluşturulabilir. Örneğin;
"new-Item -name test -path C:  -type directory"  komutu ile C: dizininde “test” isimli bir klasör oluşturulur.



"new-item –name test.txt –path C: –type file" komutu ile de "test" isimli ve belirtilen dizinde bir metin dosyası oluşturulur.



Burada dikkat edilmesi gereken şey oluşturulacak dosya tipinin belirtilmesidir."-type" parametresine iki farklı değer girilebilir. Bunlar file (dosya) ve directory (dizin)’dir. "Directory" klasör oluştururken kullanılan değerdir. "File" ise çok daha faklıdır. "-type" parametresine “file” değerini girildiği zaman oluşturulacak dosyanın uzantısını da dosya isminden sonra girerek dosya oluşturulabilir. Örneğin; "New-item –name test.docx –path C: -type file" komutu dosya isminin uzantısında da anlaşılacağı üzere "test" isimli bir "word" belgesi oluşturulur.

Pipeline(Boru)

Powershell’in en önemli özelliklerinden birisi de bir komutun çıktısının diğer bir komutun girdisi olarak kullanabilmesidir. Bunun için Linux komut satırında sıkça kullanılan pipeline (boru) “|” kullanılmaktadır. Örneğin aşağıdaki komut yürütüldüğünde ilk olarak "get-process" komutu ile sistemdeki çalışan tüm süreçleri alınır ve bu komutun çıktısı "where" komutuna verilir. "Where" komutu bu süreçlerden "CPU" değeri 20 nin üzerinde olanları alır(-gt 20 greater than 20) ve bu çıktıyı "Stop-process" e verir. "Stop process" komutu da görevini yapar ve sistemdeki cpu değeri 20'nin üzerinde olan uygulamaları sonlandırır. Bu yapılan işlem sonucu elde edilen ekran çıktısını da bir dosyaya yazdırmak için ">" işareti kullanılabilir.
"Get-process  | where {$_.CPU –gt 20} | stop-process" 



Bu örnek aslında | pipeline (boru) ile yapılabileceklerin yanında çok basit kalmaktadır. Bunun gibi birçok komutun çıktısı diğer bir komutun girdisi olarak kullanılabilmektedir. Bu da kullanıcılara tek bir satırda birden fazla komutu aynı anda çalıştırma imkanı sağlar.

Powershell deki diğer öenmli özelliklerden birisi de yürütmek istenilen komutun bir kısmı yazılıp [TAB] tuşuna basıldığında komutun kendisini tamamlamasıdır.

Findstr

Örneğin; ipconfig | findstr  "IP"  komutunu kullanıldığında "ipconfig" çıktısı içinde "IP" kelimesi geçen tüm satırlar listelenir.



Where-object


Where-object komutu diğer komutlar ile çağırılan ekran çıktılarını süzmeye ve o çıktı içerisinden sadece istenilenleri görüntülemeye imkan sağlar. Örneğin;
 
Get-eventlog system | where-object {$_.Source -eq "Tcpip"} | findstr "Erro"
Komutunda "get-eventlog system" komutu sistem loglarını (günlüklerini) alır ve "where-object" komutuna verir. "Where object" komutuda "Tcpip" kaynaklı logların listesini alır ve bunu "findstr" komutuna verir. "Findstr" de bu çıktı içerisinde “Erro” geçen tüm satırları listeler. (Buradaki $_. notasyonuyla görüntülemek istenilen nesne belirlenir.)
 
Where-Object komutu aşağıdaki parametrelerle birlikte kullanılabilir.
-lt -- Less than , -le -- Less than or equal to,  -gt -- Greater than,    -ge -- Greater than or equal to,
-eq -- Equal to,-ne -- Not equal to.

Registry (Kayıt defteri)

"Get-psdrive" komutu ile Powershell sürücüleri görüntülenebilir. "HKEY_CURRENT_USER ve HKEY_LOCAL_MACHINE" anahtarları için Powershell’de birer sürücü tanımlanmıştır. Nasıl bilgisayarda dosya sisteminde dolaşabiliyorsa kayıt defterinde de aynı şekilde Powershell sayesinde bu işlem gerçekleştirilebilir. Örneğin sistemdeki 22 numaralı portu aktif hale getirmek için;
"set-itemproperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber –value 22"  komutu kullanılabilir.




Scripting

Powershell aynı zamanda betik desteği de sunmaktadır. Bu sistemle beraber .ps1 uzantılı script (betik) dosyaları oluşturulur. Bir betiği çalıştırmak için komut satırından dosyanın isminin bulunduğu dizin belirtilerek yazılması yeterlidir. Ancak öncelikle betik çalıştırma ile iligli izinleri düzenlemek gerekmektedir. Bunun için "Set-ExecutionPolicy RemoteSigned" komutu çalıştırılmalıdır. "Graphical Windows PowerShell" Microsoft'un çıkarmış olduğu Powershell 2.0 ile birlikte gelen bir script (betik) editörüdür. Powershell'de betikler bu editör kullanılarak rahatlıkla yazılabilir.
Bu özelliği kullanarak bilgisayardaki yazıcılar listelenebilir. Bunun için "Get-WmiObject" komutunu kullanılabilir. Ayrıca "Select" komutunu da kullanılarak sadece yazıcı adlarının listelenmesini sağlanabilir.
"Get-Wmiobject  win32_Printer | select  Name"

 

Örneğin ağda bulunan 160.75.5.1-20 ip aralığındaki cihazlara "ping" isteği gönderilmesi için aşağıdaki gibi bir yapı kullanılabilir.

$i =1
$Ip = "160.75.5."
Write-Host "IP Address"
Write-Host "----------------------------------------"
Do 
{ $Ip4th = $Ip + $i
$Pingy = get-WmiObject Win32_PingStatus -f "Address='$Ip4th'"
if($Pingy.StatusCode -eq 0)
       {
      "{0,0} {1,5} {2,5}" -f
     $Pingy.Address, $Pingy.StatusCode," Ping cevabı olumlu"
        }
     else
       {
           "{0,0} {1,5} {2,5}" -f $Pingy.Address, $Pingy.StatusCode, " Ping cevabı alınamıyor"
       }
write-host $Pingy.Adress
$i++
}
until ($i -eq 20)


Bunun için oluşturulan pingscript.ps1 isimli dosyaya komut satırından erişerek betik çalıştırılabilir.