Windows Server

Windows PowerShell

Windows PowerShell

Windows PowerShell için sadece bir komut kabuğu dememiz doğru olmaz. PowerShell kendi başına yönetimsel işlerin otomasyonu kolaylaştıran ve yöneticinin üretkenliğini arttıracak bir betik(scripting) teknolojisinide beraberinde getirir. Konsol basit bir komut yorumlayıcısından çok bir programlama dili derleyicisi gibi davranır. .NET programlama dili ile kendi komutlarımızı dahi yazıp kabuk içine entegre edebiliriz.

Microsoft PowerShell’i Longhorn Server’ın içinde dağıtacağını duyurdu. Fakat hali hazırda kullandığınız Windows versiyonları için alttaki linkten 1.0 versiyonunu bilgisayarınıza indirip yükleyebilirsiniz.

http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx

PowerShell 1.0 kurulumu yapmak için gereksinimler;

  • .NET Framework 2.0
  • Windows XP Service Pack 2, Windows 2003 Service Pack 1 veya daha yeni bir Windows sürümü

PowerShell ‘i başlatmak için;

  • “Start > All Programs > Windows PowerShell 1.0 > Windows PowerShell” tıklanabilir.
  • “Start > Run “ a “PowerShell” yazılıp çalıştırılabilir.

clip_image001

Ekran görüntüsü standart “cmd” konsoluna benzemektedir. Fakat işlevselliğindeki farkları birazdan göreceğiz.

Cmdlets Nedir?

Cmdlets en basit anlamda PowerShell’in yeni komut setidir diyebiliriz. Fakat bu komutlar standart çalıştırılabilir (executable) dosyalar şeklinde değilde .NET fonksiyonları şeklinde çalışmaktadır. .NET programlama dillerinin namespace mantığı da burda kullanılmıştır. Her komut VERB-NOUN yani Fiil-İsim şeklinde tanımlanmıştır. Bi örnekle açıklamak gerekirse “Get-Process” komutu (cmdlets) çalışan uygulamaların bir listesini vermektedir. “Stop-Process” komutu çalışan bir uygulamayı durdurmak için kullanılır. Aynı şekilde tanımlanmış “Get-Service” ve “Stop-Service” komutları servisleri listeler ve durdurur. Komutlar bu şekilde benzer yapılarda tanımlanmış olması komut öğrenmeyi kolaylaştırmak adına gerçekten önemlidir.

“Get-Command” komutuyla kullanılabilir cmdlets listesini alabilirsiniz.

“Get-Command –Verb Get” komutuyla ise Fiil’i Get olan ( yani get ile başlayan) komutların bir listesini alabilirsiniz.

clip_image002

Yardım Almak

PowerShell konsolunda yardım almak ve komutların yazım düzenlerini görmek için kullanabileceğimiz birkaç metod var. Bize tarihi gösteren “Get-Date” komutu ile ilgili yardım almaya çalışalım.

  • Get-Help Get-Date >> Get-Help komutunu kullanabiliriz
  • Get-Date -? >> -? Argümanını kullanabiliriz
  • man Get-Date >> unix tarzı “man” komutunu kullanabiliriz
  • help Get-Date >> geleneksel “help” komutunu kullanabiliriz

clip_image003

Alias

Alışkanlıklardan vazgeçmemek adına PowerShell önceden kullandığımız cmd ve unix komutlarına karşılık gelen cmdlets komutları için aliaslar tanımlamıştır. Bunların bir listesini “Get-Alias” komutuyla görebilirsiniz. Örneğin cmd’deki copy veya unix sistemlerdeki cp komutu için “Copy-Item” cmdlets komutu için alias tanımlanmıştır. Yani PowerShell içinde “Copy-Item” , “copy” yada “cp” yazmak aynı komutu çalıştırır.

clip_image004

Yeni alias tanımlaması yapmak için Set-Alias komutu kullanılır. Örneğin ;

Set-Alias -Name gi -Value Get-Item

Bu komutla Get-Item komutunu gi şeklinde çalıştıracak alias ı tanımlamaış olduk.

Tanımlı alias’lar , karşılık geldikleri cmdlets komutu ve görevleri ile ilgili bikaç örnek;

Windows PowerShell

Windows PowerShell

cmd.exe ve COMMAND.COM

bash

Görevi

(Cmdlet)

(Alias)

(MS-DOS, Windows, OS/2, etc.)

(Unix, BSD, Linux, etc.)

Set-Location

sl, cd, chdir

cd, chdir

cd

Dizin Değiştirir

Clear-Host

cls, clear

cls

clear

Ekranı Temizler

Copy-Item

cpi, copy, cp

copy

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ı yada Değişkenin Değerini Yazdırır

Set-Variable

sv, set

set

set

Değişkenlere Değer Atar

Get-Content

gc, type, cat

type

cat

Dosyaların İçeriğini Görüntüler

Otomatik Tamamlama

PowerShell in sunduğu kullanım kolaylıklarından biride otomatik tamamlama. Tab tuşuna basmak suretiyle sadece yazdığımız komutları değil bunların argümanlarını da tamamlayabilmektedir. Argüman tamamlama olayı belliki komutların birer .NET komutu olmasından ve daha önceden tanımlanmış olmasından kaynaklanmaktadır. Ama bu konuda geliştirmesi gereken yerler olduğunu söylemeden geçmeyelim. PowerShell hala unix’in bash kabukğunun sağladığı otomatik tamamlama özelliklerinin tamamını barındırmamaktadır fakat eminimki ilerleyen versiyonlarda bunlar da eklenecektir.

Pipeline

Pipe ( boru “|” ) karakteri sayesinde bir komutun çıktısını bir diğerine argüman olarak aktarabiliriz. Bu cmd konsolunda da olan bi özellikti. Örneğin tek seferde ekrana sığmayacak bir “dir” komutu sonucunu “dir | more” diyerek sayfalar halinde görmemiz mümkün oluyordu. Fakat PowerShell de bu komut çok daha efektif bir şekilde kullanılır hale gelmiştir.

Örneğin 10 MB dan fazla ram kullanan processleri listelemek için;

clip_image005

ve hatta bunları kapatmak istersek şu komutu uygulayabiliriz.

PS C: Get-Process | where { $_.PM -gt 10MB } | Stop-Process

Bilgisayarımızdaki açık portların bir listesini ve bunları dinleyen programların process numaralarını (pid) bir dosyaya kaydetmek için şu komut uygulanabilir.

clip_image006

Programlama Ortamı Olarak PowerShell

Cmd konsolunun aksine PowerShell tam bir programlama ortamı gibi hizmet verebilir. .NET Framework’ün birçok özelliğini içinde barındıran PowerShell’i kullanırken dikkat etmek gereken bir husus da boşluk karakteridir. Eski konsoldan alışkanlıklarımızla örn; “cd..” gibi bir komut yazarsak PowerShell bize hata üretecektir. Çünkü sizin cd olarak çalıştırdığınız komut aslında “Set-Location” cmdlets komutuna atanmış bir aliasdır. ( “Get-Alias cd” yazarak görebilirsiniz ) Komutların ve argümanlarının arasında boşluk bırakmak zorunludur ve doğru kullanım şekli “cd ..” şeklinde olmalıdır. Bu küçük hatırlatmayı da yaptıktan sonra PowerShell’in birkaç küçük özelliğine göz atalım.

Siz cmd konsoluna “1+1” ifadesini girmiş olsanız konsol size böyle bir komut olmadığına dair hata verecektir. Fakat PowerShell bir programlama ortamı olduğundan bunu hesaplayacak ve sonucu bize gösterecektir. Bu tarz matematiksel işlemleri direk PowerShell konsoluna girerek hesaplatabiliriz.

clip_image007

Bu örnekte de görüldüğü gibi ister direk sayılar girerek ya da istersek değişkenler tanımlayarak bunları hesaplatabiliyoruz.

Bir küçük örnek de standart olarak gelen “PS C:>” promptunu değiştirmekle ilgili verelim.

clip_image008

Prompt fonksiyonu ile kullandığımız promptu değiştirebilir ve ihtiyaçlarımıza göre özelleştirebiliriz.

Bu kez de -lt (less then) ve –gt (greater then) ifadeleriyle bir if koşullu ifadesi oluşturmaya çalışalım.

clip_image009

Şimdi programlama tarafında ne kadar ileri gidebileceğimizi göstermek adına biraz abartalım J

Öncelikle .NET System.Windows.Forms namespace’ini yüklemek için şu komutu çalıştıralım.

PS C:> [Reflection.Assembly]::LoadWithPartialName(“System.Windows.Forms”)

Daha sonrada resimdeki komutlarla bir önce bir Windows formu sonra bir buton oluşturup bunu ekranda göstermeyi deneyelim.

clip_image010

PowerShell ve Registry

PowerShell in standart sürücüleri arasından registry düğümleri de vardır. “Get-PSDrive” komutuyla sürücülere bir bakalım.

clip_image011

Görüldüğü üzere PowerShell registry’deki HKEY_CURRENT_USER ve HKEY_LOCAL_MACHINE düğümleri için birer sürücü tanımlaması yapmıştır. Bir sürücüdeki klasör ve dosyalarda dolaşırcasına bu düğümlerde dolaşabilirsiniz. Şimdi bilgisayarımızda Remote Desktop açık durumda mı bir bakalım ve kapalı olan Remote Desktop u registry’deki değerini değiştirerek açalım. Registry’de bir değeri görüntülemek için Get-ItemProperty ve bunu değiştirmek için de Set-ItemProperty komutları kullanılır.

clip_image012

PowerShell ve WMI Scripting

PowerShell’in kendi scriptlerinin dışında WMI scriptlerini de çalıştırabiliriz. WMI (Windows Management Iinstrumentation) sorguları sayesinde local bilgisayar veya network kaynakları için sorgulamalar yapabiliriz. Şimdi PowerShell ile WMI uygulamalarına birkaç örnek verelim.

Öncelikle WMI kullanarak bilgisayarmızdaki printerları listelemeye çalışalım. Bunun için Get-WmiObject komutunu kullanabiliriz. Ayrıca Select komutuna pipe yaparak sadece yazıcı adlarının listelenmesini sağlayalım.

clip_image013

Şimdi yine biraz abartıp WMI komutlarıyla ping request’i gönderelim fakat PowerShell’in scripting özelliklerinden faydalanarak 1 den 254 e kadar bir döngü oluşturalım ve networkümüzdeki tüm makinaları tarayalım. Ayrıca sadece istediğimiz kolonların görüntülenmesi içinde Select komutunu kullanalım. Bakalım neler olacak.

clip_image014

Gerçekten yapılabilecekler sınırsız gibi görünüyor. Bu makale PowerShell için bir kullanım klavuzu olmaktan çok onun getirdiği yenilikler ve onunla ne kadar kompleks görevleri birkaç satırlık kodla gerçekleştirebileceğimizi göstermek amacıyla yazılmıştır. Daha sonra PowerShell’in spesifik özellikleri ile ilgili daha ayrıntılı makaleler yazmayı düşünüyorum. Şimdilik bu kadar. Bir sonraki makalede görüşmek üzere…

Kaynaklar
Windows PowerShell Getting Started Guide and Quick Reference
Windows PowerShell Team Blog

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu