12.10.2017

Powershell'e giriş

Windows'da komut satırının yeteneklerinin günümüz beklentilerinin altında kalmasına çözüm olarak ortaya çıkan Powershell faydalı ve kullanışlı bir framework haline geldi. .Net altyapısı üzerine inşa edilen sistem her yeni sürümde daha faydalı işlevler sunuyor

Powershell komutlarına cmdlet deniyor. Bir fiil ve ismin tire işareti ile birleşiminden oluşuyorlar. Örneğin çalışan süreçlerin listesini almak için kullanılacak komut (cmdlet):

Get-Process
Ama her seferinde bu kadar uzun komutlar girmemek için kısaltma amaçlı "alias"lar eklenmiş. Her seferinde Get-Process yazmak elbette mümkün, ama kısaltmak isterseniz

gps
veya
ps
de aynı işi yapıyor. Bu alias elbette linuxtaki eşdeğeri ps komutundan geliyor. Ama linux eşdeğerinden farklı olarak tamamen nesne yönelimli (object oriented). Tüm çalışan süreçlerin listesini değil de sadece svc ile başlayan süreçlerin listesini görmek istersek yapılacak
ps svc*
yazmak. Bunun sonucunda aşağıdaki gibi bir çıktı üretecek:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    844      30    19016      21172    90             232 svchost
   1005      37   112316     114080   190             396 svchost
   2163      71    72416      72612   349             412 svchost
    652      34    12444      20520   145             452 svchost
    527      19     8504      14744    82             756 svchost
    547      18     6752      10376    71             796 svchost
   1250     183    24952      28980  1309            1240 svchost
    325      19     3396       8688    54            1508 svchost
    489      38    27524      28188   116            1532 svchost
    108      10     3316       3040    42            1844 svchost
     55       6      712       1224    21            2036 svchost
    369      17     5584      10000    91            2044 svchost
     53       6      712       1280    21            2088 svchost
    100       8     1312       2224    24            2136 svchost
    165      14     4176       5092    48            2568 svchost
    145      11     2148       5920    43            5968 svchost


Buradaki sütünların açıklamaları [1] ve [2] de var.
Örneğin handle sayısı 1000'den fazla olan ve svc ile başlayan süreçleri listelemek için

ps svc* | ? {$_.Handles -gt 1000}

yazmak yeterli. Bu komutun kısaltılmış hali. Uzun uzun alias kullanmadan yazmak istersek komut şöyle olurdu:
Get-Process -Process svc* | Where-Object {$_.Handles -gt 1000}
Soru işareti (?) Where-Object cmdlet'inin bir alias'ı. Get-Process cmdlet'inin varsayılan parametresi de Process olduğu için ayrıca -Process yazmaya gerek yok. Önemli olan kısmı boru karakterinden (|) sonrası. Komut satırında olduğu gibi burada da boru karakteri bir komutun çıktısını diğer komuta giriş olarak veriyor. svc ile başlayan süreçlerlerin listesini al, Where-Object komuduna ver. O da bunları bir döngüye soksun (küme parantezleri sanal bir for döngüsü gibi), sadece Handles değeri 1000'den büyük olanları çıkış olarak üretsin. Burada $_ sanal for döngüsündeki döngü değişkeninin yerine geçiyor. Döngünün her adımında nesnenin Handles özelliğini alıp -gt ile "büyüktür" (greater than) işlemine tabi tutuyor. Sonucunda da şu çıkıyor:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
   1008      38   114932     113968   193             396 svchost
   2226      71    75344      73328   347             412 svchost
   1245     182    24888      28940  1308            1240 svchost


Tam da istenen bu. Powershell bunun için güzel :)

Hatta bunları da Working Set değerine göre azalan şekilde sıralamak istersek yazılması gereken bir boru karakteri daha var:
ps svc* | ? {$_.Handles -gt 1000} | sort WS -Desc
Bu komutu da uzun uzadıya yazmak istersek
Get-Process -ProcessName svc* | Where-Object {$_.Handles -gt 1000} | Sort-Object -Property WS -Descending
olurdu. Tabloyu çok karmaşık bulursanız, sadece Handles ve Working Set değerlerni süreç isim ve ID'leriyle görmek isterseniz bu alanlardan sadece bazılarını select ile seçmeniz gerekir:
ps svc* | ? {$_.Handles -gt 1000} | sort WS -Desc | select Id, ProcessName, WS, Handles

Bu noktadan sonra uzunlarını yazmaya gerek yok bence.

Hala eklenebilecek şeyler var. Working Set sütununun sayısal biçimlendirmesini beğenmeyenler binlik ayraç kullanmak isteyebilir. Bu durumda
ps svc* | ? {$_.Handles -gt 1000} | sort WS -Desc | select Id, ProcessName, @{N="WorkingSet";E={"{0,13:N0}" -f $_.WS}}, Handles

yazılabilir. Sonuç şu şekilde olur:

 Id  ProcessName       WorkingSet                          Handles
 --  -----------       ----------                          -------
 396 svchost           114.790.400                           1005
 412 svchost            72.474.624                           2173
1240 svchost            29.532.160                           1245


Çıkışı buraya sığdırmak için boşlukları sildiğimi itiraf etmeliyim. Ama bunu gerek kalmadan sonuç üretmek için de Format-Table * -Autosize ekleyebilirdim. Yani:
ps svc* | ? {$_.Handles -gt 1000} | sort WS -Desc | select Id, ProcessName, @{N="WorkingSet";E={"{0,13:N0}" -f $_.WS}}, Handles | ft -AutoSize
Sonuç şöyle olurdu:

  Id ProcessName WorkingSet    Handles
  -- ----------- ----------    -------
 396 svchost       114.221.056    1005
 412 svchost        72.462.336    2173
1240 svchost        29.532.160    1247


Temiz ve güzel.

Hiç yorum yok: