1. Ana Sayfa
  2. Server 2008
  3. Sistem Uzmanları için Scripting (Kod Parçacıkları) – Bölüm 2

Sistem Uzmanları için Scripting (Kod Parçacıkları) – Bölüm 2

İlk betiğimizi biraz değiştirelim: İlk betiğimizde kayıt defterinden bilgisayarın adını ve ağda görünen adını öğrendik. Başka bilgileri kayıt defterinden öğrenmek istersek betiği biraz değiştirebiliriz sanırım. Örneğin bir çökme durumunda minidump dosyasının tutulacağı konumu öğrenmek istediğimizi varsayalım.

‘MiniDump dosyasının yerini gösterir.

‘Üstbilgi

Option Explicit

On Error Resume Next

Dim objShell

Dim regMiniDumpFileLocation, miniDumpLocation

‘Başvuru bilgileri

regMiniDumpFileLocation = “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet” &_

“\Control\CrashControl\MinidumpDir”

‘İşleyiş Bilgileri

Set objShell = CreateObject(“WScript.Shell”)

miniDumpLocation = objShell.RegRead(regMiniDumpFileLocation)

‘Çıktı

WScript.Echo miniDumpLocation

İşte bu kadar basit. Okunacak Kayıt defteri anahtarını değiştirdim. Bir de değişken isimlerini, hepsi bu kadar. Daha sonra ne yaptığımı unutmayayım diye birde tanım yerleştirdim. Bu sayede betiği açtığımda ne işe yaradığını bulmak için uğraşmam gerekmeyecek.

Bir önceki bölümde öğrendiklerimizi kısaca tekrar ettik ve yeni bir betik kazandık. Artık biraz ilerlemenin zamanı geldi.

VBScirpt Betiklerinde Döngüler:

Kayıt defterinden bir takım değerler okumak bunları ekranda göstermek yararlı görevler. Ancak hepimiz biliyoruz ki sistem yönetimi birçok işlemin tekrarını gerektirir. Bakalım bu bölümde bizim için tekrar edilmesi gereken bu görevlerin bir kısmını yazdığımız betiklere yıkabilecek miyiz? Döngüler her programlama dilinin kullanışlı parçalarıdır. içerisinde kullanabileceğimiz (en azından benim bildiğim) 6 döngü türü vardır. Bunları sırlayalım.

  • For, Each … Next
  • For … Next
  • Do, While … Loop
  • Do, Until … Loop
  • Do … Loop
  • While … Wend

For, Each … Next :

Bir sınıfa girdiğinizi düşünün. Sınıftaki öğrencilerle tanışmak istiyorsunuz. Sınıftaki herkese Adını, soyadını ve babasının mesleğinin ne olduğunu sorduğunuzu varsayalım; bu işlemi VBScript dilinde anlatmak isteseydim Öğrenci nesnesinden bir derslik dolusu olduğunu düşünerek işe başlardım. Her öğrenci nesnesinin bazı özellikleri olduğunu biliyorum. Bunlar adı, soyadı ve baba mesleği olsun. Şüphesiz öğrencilerin başka özellikleri de var ama ben sadece bunlarla ilgileniyorum, şimdilik. O zaman Derslik içerisindeki öğrenci koleksiyonundan her birine bu özellikleri sormam gerekirdi. Dolayısı ile derslikteki öğrenci sayısı kadar bu soruları döngüsel olarak tekrarlamam gerekirdi.

Sanırım yine gevezelik ediyorum. O zaman kodlamaya dönelim.

‘Sistem üzerindeki sabit disklerin kullanım miktarını öğrenelim.

Option Explicit

On Error Resume Next

Dim colDrives         ‘WMI içerisinde yer alan disk koleksiyonu

Dim drive            ‘her bir ayrı disk için değişen atması

Const DriveType = 3        ‘Yerel Sürücü Seçeneği. Windows SDK kullanılarak değer öğrenilebilir.

Set colDrives =_

GetObject(“Winmgmts:”).ExecQuery(“select size, freespace ” &_

“from win32_LogicalDisk Where DriveType =” & DriveType)

For Each drive in colDrives

‘colDrive koleksiyonu içinde yer alan her bir öğe için

‘aşağıdaki işlemlerin tekrarlanmasını sağlar.

WScript.Echo “Sürücü ” & drive.DeviceID

WScript.Echo “Boyut ” & drive.size

WScript.Echo “Boş Alan ” & drive.freespace

Next

Eğer yukarıdaki betiği çalıştırıp denersek sistemdeki her yerel disk için sürücü harfi boyut ve boş alan bilgilerini öğrenebiliriz. Şimdi betiğin nasıl çalıştığını inceleyelim.

İlk başta Option Explicit ve On Error Resume Next komutlarını kullandık, bunları daha önce açıkladığımızdan üzerinde yeniden bir şeyler söylemeyeceğim. İsterseniz ilk bölüme bakarak ne işe yaradıklarını görebilirisiniz.

Dim bildirimi ile iki değişken bildirdik. Bunlar colDrives ve drive idi. Biraz değişken bildiriminde kullandığım isimlendirme şeklinden bahsedeyim. İlk olarak col yani collection kelimesini kısaltarak kullandım ki değişkenin bir koleksiyon olduğunu hatırlatsın. Bundan sonra değişkenin Drives kısmı geliyor baş harfini büyük yazarak kelimeleri birbirinden ayırmak kolaylaşıyor. Bu yazım biçimine programcılar camelCase diyorlar. İlk kelime küçük harfle başlıyor diğer kelimelerin ilk harfleri büyük oluyor. Aslında büyük küçük harf önemli değil VBScript dili case sensitive (Büyük küçük harf ayrımına duyarlı ) değildir. Dolayısı ile isterseniz hepsini küçük harf yazabilirsiniz ya da büyük harf. Ancak WMI sorguları öyledir yani bir harfi yanlış bir şekilde büyük veya küçük harf yazarsanız çalışmayabilir. Aklınızda bulunsun…

Sonra ise “Const DriveType = 3” kodunu giriyoruz. Burada iki farklı durum söz konusu; birincisi Const kelimesi Dim gibi bir bildirimdir. Ancak değişken yerine sabit bildirir. Yani betik boyunca değişmeyecek olan bir değer. Sonrasında ise hemen = kullanarak bir değer atıyoruz. Bunu değişkenler için de yapabiliriz. İllaki farklı bir satırda belirtilmesi gerekmez.

Sonraki komut ise birazcık daha karışık. Bir WMI sorgusu içeriyor. Ancak WMI’dan daha sonra geniş biçimde bahsedeceğimden çok fazla ayrıntıya girmeyeceğim. Yine de herhangi bir veritabanı sorgusundan farklı olmadığını görebilirsiniz.

Set colDrives =_

GetObject(“Winmgmts:”).ExecQuery(“select size, freespace ” &_

“from win32_LogicalDisk Where DriveType =” & DriveType)

Set komutunu artık tanıyoruz. Bir değişkene nesne özellikleri atmak istediğimiz zaman kullandığımız biliyoruz. WMI üzerinden (Winmgmts) bir sorgu çalıştırarak (ExecQuery) win32_LogicalDisk tablosundan (from win32_LogicalDisk) disk türünün sabit disk olduğu bütün diskler için (Where DriveType = 3 “Burada yalnızca Sabit yerine değerini koyarak değişiklik yaptım.”) boyut ve boş alan bilgilerinden (select size, freespace) oluşan bir koleksiyon yaparak colDrives değişkenine atıyoruz.

For Each drive in colDrives

colDrives değişekenin birden fazla disk ile ilgili bilgileri içerebileceğinden colDrives değişkeninde yer alan diskleri sıra ile drive değişkenine atayacağımızı bildiriyoruz. Sonrasında ise drive artık WMI alanından bir diski temsil ettiği için o diske ait özelliklerle ilgili işlemlere başlıyoruz.

WScript.Echo “Sürücü ” & drive.DeviceID

Disk için sürücü harfini gösteriyor.

WScript.Echo “Boyut ” & drive.size

Disk için boyut bilgisini gösteriyor.

WScript.Echo “Boş Alan ” & drive.freespace

Disk için boyut bilgisini gösteriyor.

Next

Komutu ise colDrives değişkenindeki sorgu ile atanan her bir disk için döngünün yeniden uygulanmasını sağlıyor.

Sabitler ve Değişkenler

Yukarıdaki betikte değişken yerine sabit kullandık. Bu betikte aslında güvenle değişkende kullanabilirdik. Const yerine Dim yazarak deneyebilirisiniz. Ancak değişmesi istenmeyen değerler için sabit kullanmak iyi bir alışkanlıktır. Değişkenler daha önceki örneklerde gördüğünüz üzere alt yordamlar veya ana yordamın kendisi tarafından değiştirilebilir. Ve günün birinde bu kaza ile değişiklik durumları problem yaratabilir. İstenmeyen değişiklerden kaçınmanın en iyi yolu sabitler kullanmaktır.

DriveType değeri de nereden çıktı?

İşte buradanJ

http://msdn.microsoft.com/en-us/library/aa394173(v=vs.85).aspx

VBScirpt ile toplama çıkarma yapmak çok eğlenceli (asosyal bir insanım eğlence tanımım farklı) ama pek yararlı değil ayrıca hesap makinesi bu işi daha kolay yapacaktır. Betiği kullanmanın eğlenceli yanı sistem hakkında bilgi edinmek zaman zaman bu bilgileri değiştirmek için kullanılabilecek olmasıdır. Bu bilgileri bize sağlayan (en azından yukarıdaki betikte) WMI sınıfları altındaki Win32 sınıfıdır. Sayfada DriveType kısmına bakarsanız 3 dışında diğer değerleri de görebilirsiniz. Bu şekilde sadece DriveType sabitini değiştirerek CD DVD – Rom bilgilerini de öğrenebilirsiniz. Aynı sayfada diğer özellikleri de görebilirsiniz. Örneği diskin dosya sistemini öğrenmek istediğinizde FileSystem özelliğini kullanmanız gerektiği görülebilir.

Sınıf, Nesne, Özellik???

Bu aşamada biraz kafa karıştırıcı olmuş olabilir. İlk örneğimizden devam ederek anlatmaya çalışacağım. Bir dersliğe girdiğimizi düşünelim. Bu derslikte sıralar bir tahta öğretmen masası sandalyesi olacaktır. Tabi birde öğrenciler. Burada çoğul olarak söz ettiğimiz şeyler örneğin sıralar bir sınıftır(Class). Bütün sıraların ortak özellikleri bunlar içinde geçerlidir. Örneğin hepsinin 4 adet ayağı ve üstünde yazmak için düz bir tahtası vardır(Properties). Ayrıca her sıranın kendine has değişebilir özellikleri olabilir renk, kaçıncı sırada durduğu vs. Ayrıca bu sıralar çeşitli işlemler için uygun olabilir. Mesela kitap saklama için bir bölüm gibi yöntemler(Method). Bazı özellikler de değiştirilebilir. Örneğin sırayı boyayarak renk özelliğini değiştirebilirsiniz ya da yerini değiştirebilirisiniz. Başka nesnelerde ise renk değiştirmeyi bir yöntemle yapabilirsiniz, farklı renkte ledlerden oluşan bir lambamız olsa kırmızı veya mavi yanmasını açma kapama yöntemi ile değiştirebilirsiniz. Bu lambanın nesnesinin kendine has bir yöntemidir. Lambayı boyamanız gerekmez.

Bazı özellikler ise değiştirilemez. Örneğin sıraların 9 ayağı olmaz. Bu özelliklere sadece okunabilir (Read Only Properties) özellikler deriz.

Biraz örnekten uzaklaşıp yazdığımız koda dönersek disk nesnesi sabit diskler sınıfından bir nesnedir. Biz sabit disklerin özelliklerinden olan boyut ve boş alan bilgilerini okumak için bir kod yazdık. Sabit disk sınıfı biçimlendirilebildiğine göre biçimlendirme yöntemi ile disk nesnelerinin biçimlendirilebileceğini de biliyoruz. Buna uygun bir yöntem (method) kullanmak mümkün olabilir. Tabi logicaldisk sınıfı buna izin veren bir yöntem içerseydi. Tekrar sıra örneğine dönelim. Sıra bir derslikte olduğu müddetçe keserek ya da ekleyerek boyutunu değiştiremeyiz. Ancak bir marangozhanede olsaydı bu mümkün olabilirdi. Yani farklı bir sınıf (class) kullanarak disk biçimlendirme mümkün olabilir. Windows SDK içerisinde disk sınıfları ile ilgili çok daha fazla bilgi bulabilirsiniz.

Diskin ismi bir özelliktir. Bununla beraber disk ismini değiştirmek için yöntemde bulunabilir. Dolayısı ile disk ismi iki yöntemle değiştirilebilir. Birincisi disk ismi özelliğine yeni bir değer atanarak. İkincisi ise disk ismi değiştir yöntemi kullanarak olabilir. Bunların arasındaki farklardan daha sonra bahsedeceğim. Yine gevezeleşmeden sınıflar yöntemler özellikler hakkındaki sohbetimizi bitireceğim.

Daha fazla ve muhtemelen daha doğru bilgi için:

http://technet.microsoft.com/tr-tr/library/ee176992(en-us).aspx

For … Next

For … Next döngüsünü bitirmemiş miydik biz. Pek sayılmaz. Buradaki farklı bir döngü. For Each … Next döngüsü koleksiyondaki nesneler kadar sayıda çalışması gerektiğini biliyordu. Burada döngünün kaç defa çalışacağını bizim belirlememiz gerekiyor. Bu yinede kötü bir durum değil.

Sunucularımızdan birinde performans problemi olduğunu ve işlemlerin durumlarını denetlemek istediğinizi düşünelim. Daha iyi araçlar olmasına rağmen aşağıdaki betik iyi bir fikir verdiğinden inceleyelim.

‘İşlem bilgilerini gösterir

Option Explicit

On Error Resume Next

Dim objWMIService

Dim objItem

Dim i

Const Max_Loops = 8, One_Hour = 3600000

For i = 1 To Max_Loops

Set objWMIService = GetObject(“Winmgmts:”).ExecQuery _

(“Select * From Win32_Process Where processID <> 0”)

WScript.Echo objWMIService.count & ” adet işlem çalışıyor ” & Now

For Each objItem In objWMIService

WScript.Echo “İşlem adı ” & objItem.Name

WScript.Echo Space(9) & objItem.CommandLine

WScript.Echo “PID ” & objItem.ProcessID

WScript.Echo “İşlem parçası sayısı ” & objItem.ThreadCount

WScript.Echo “Takas dosyası boyutu ” & objItem.PageFileUsage

WScript.Echo “Sayfalama hatası ” & objItem.PageFaults

WScript.Echo vbNewLine

Next

WScript.Echo “Döngü tamamlandı”

WScript.Sleep One_Hour

Next

Betik okumaya devam…

Önce bir uyarı bu betiği çift tıklayarak çalıştırmayın. Sayısız kere tamam butonuna tıklamanız gerekecektir. CScript.Exe ile komut satırından çalıştırarak zamandan tasarruf sağlayabilirsiniz.

Dim ile WMI bağlantısını yapması için objWMIService adında bir değişken yarattık. Bağlantıdaki öğeler için ise objItem değişkeni kullanıldı. (koleksiyonları hatırlıyorsunuz değil mi?) Bunların dışında iki sabit tanımladık birincisi Max_Loops ve 8 değerini atadık, ikincisi One_Hour bu sabite ise 3600000 değerini verdik.

For i = 1 to Max_Loops ifadesinde ise döngünün 1 den başlayarak değer 8 olana kadar tekrar edeceğini anlattık. Değer döngünün özelliğinden dolayı her seferinde 1 artarak 8 değerine ulaşana dek devam edecek. Bu durumda 8 defa altında yer alan işlemleri yapacak.

Set objWMIService = GetObject(“Winmgmts:”).ExecQuery (“Select * From Win32_Process Where processID <> 0”)

Burada ise PID’si 0 olmayan bütün işlemleri içine alan bir koleksiyon oluşturduk.

“WScript.Echo objWMIService.count & ” adet işlem çalışıyor ” & Now” satırında count yöntemini kullanarak çalışan işlem sayısını saydırıp göstermesi sağlandı. “Now” komutu ise çalıştığı andaki zamanı gösterir. Bu sayede çalışan işlemlerin hangi tarih ve saatte çalıştığı gözlemleyebileceğiz.

For Each objItem In objWMIService

WScript.Echo “İşlem adı ” & objItem.Name

WScript.Echo Space(9) & objItem.CommandLine

WScript.Echo “PID ” & objItem.ProcessID

WScript.Echo “İşlem parçası sayısı ” & objItem.ThreadCount

WScript.Echo “Takas dosyası boyutu ” & objItem.PageFileUsage

WScript.Echo “Sayfalama hatası ” & objItem.PageFaults

WScript.Echo vbNewLine

Next

Yukarıdaki kısımda ise bildiğimiz For Each … Next döngüsü ile koleksiyondaki her bir işlem için işlem adı varsa komut satırından çalıştırma yolu işlem numarası (PID) gibi bilgileri görüntüledik.

vbNewLine ise biraz yeni bir komut (Programcılar yöntem demeyi tercih eder herhalde.) Boş bir satır oluşturulmasını sağlar. Çıktıların daha okunabilir olması için koydum.

Space(9) ise parantez içerisinde yer alan sayı kadar boşluk oluşturulmasını sağlar. Bazen faydalı olabilir.

WScript.Echo “Döngü tamamlandı”

WScript.Sleep One_Hour

Next

WScript.Echo “Döngü tamamlandı” 8 defa benzer bilgileri alacağımızı hesaplayarak her döngüden sonra tamamlandığı bilgisini burada yazdırdım.

WScript.Sleep yine yeni bir komut. Kendisinden sonra gelen sayı kadar beklemeyi sağlar. Ancak sayı milisaniye cinsinden olmalı. Bu sebeple One_Hour değişkenine 60 dakika kere 60 Saniye kere 1000 milisaniye hesaplamasının sonucu olan 3600000 sayısını verdim. Dolayısı ile döngü yeniden başlamadan önce 1 saat bekleyecek. Bu sayede 8 saat boyunca saat başı işlem raporu almış olacağız.

İsterseniz besDakika gibi bir sabit belirleyip burada beklenecek süreyi değiştirebilirsiniz.

Const besDakika = 30000 satırını üstbilgi kısmına ilave ederek “WScript.Sleep One_Hour” kısmını “WScript.Sleep besDakika” olarak değiştirip deneyebilirisiniz.

Bir dahaki yazımda diğer döngülerle devam edeceğim.

Bu konuyla ilgili sorularınızı https://forum.mshowto.org linkini kullanarak ulaşacağınız forum sayfamızda sorabilirsiniz.

Referanslar

http://www.technet.com

Yorum Yap

Yazar Hakkında

Kıdemli Altyapı Danışmanı.

Yorum Yap