148 146 Scripting Host’u kullanarak Windows’un sıkıcı rutin işlemleri otomatik olarak yerine getirmesini sağlayabilirsiniz. CHIP bu yazıda, bir script’i nasıl hazırlayacağınızı ve bunun Windows tarafından nasıl çalıştırılacağını gösteriyor. hazırlayabilirsiniz. Bu yazının da kanıtladığı gibi, script hazırlamak sanıldığı kadar zor değildir. Önce bir script hazırlamak için genel olarak nelere ihtiyacınız olduğunu öğreneceksiniz. Daha sonra yazı içerisinde küçük bir script kodunu adım adım inceleyecek ve böylece önemli komutları öğreneceksiniz. Bir script hazırlamak için ihtiyacınız olan tek şey bir metin editörüdür. Bunun için klasik bir program olan Not Defteri ile her türlü script’i hazırlayabilirsiniz. Başlat/Programlar/Donatılar/ Not Defteri komutunu çalıştırın ve aşağıdaki kodu girin: MsgBox “Merhaba Chip Okurları!” Not Defteri’ndeki Dosya/Farklı Kaydet komutunu çalıştırın, dosya ismi olarak MERHABA.VBS girdikten sonra Tamam düğmesine tıklayın ve Not Defteri’ni kapatın. Biraz önce oluşturduğunuz dosyayı bulun ve çalıştırmak için üzerine iki kere tıklayın. Program çalışacak ve “Merhaba Chip Okurları!” mesajını ekrana getirecektir. Gördüğünüz gibi tek bir satırdan oluşan küçük bir Script hazırlayabilirsiniz. Arka Plan: Script’in hangi program kul- Windows bazen oldukça saçma bir hal alabiliyor? Örneğin, ayda sadece bir klasör oluşturmak istiyorsunuz: Bunun için pencerenin açılması, menülerin çalıştırılması, isim vermek gibi sadece zaman kaybına neden olan rutin işlemlerin her seferinde en baştan yerine getirilmesi gerekiyor. Windows ile açık bir dilde konuşun ve yapması gerekenleri sadece bir kere söyleyin. Buradaki “açık dil” ifadesi VBScript (Visual Basic Script) anlamına geliyor. Bunu kullanarak Windows’un yerine getireceği işlemlerin listesini, yani script’leri Windows Otomasyonu Büyük Etkili, Küçük Kodlar Windows Otomasyonu AKTÜEL » KAPAK » DONANIM » YAZILIM » PRATİK » INTERNET 147 CHIP | OCAK 2003 Evet Hayır lanılarak hazırlandığı, Windows için önemli değildir. Dikkat edilen tek nokta, dosyanın VBS uzantısına sahip olmasıdır. VBS, VisualBasic’in basitleştirilmiş bir hali olan VisualBasicScript’in kısaltmasıdır. Script’lerin Windows altında çalıştırılabilmeleri için dosyaları uzantılarından ayırt eden Windows Scripting Host gereklidir. Scripting Host aynı zamanda JS uzantısına sahip JavaScript dosyalarını da anlayabilir. Kontrolü kaybetmemek: Yapısal programlama Not Defteri, dosya içeriklerinin okunulurluğunun çok düşük olması gibi belirli bir dezavantaja sahiptir. Her şey aynı yazı tipinde, renginde ve büyüklüğünde görüntülenir. Hazırladığınız script’lerin kontrolünü elinizde tutmak için bunları iyi bir programlama stiline uydurmalısınız. Bunun için dikkat etmeniz gereken en önemli üç şey aşağıdaki gibidir: ?___ Açıklık: Değişken isimleri amaçlarını ifade edebilmelidir. Scripting Host, büyük küçük harf ayırımına dikkat eder! ?Açıklamalar: Gerçekleştirilen işlemleri script içerisinde açıklayın. VBScript’teki açıklamalar kesme işareti “’” ile başlar. ?___ Girintiler: IF ifadeleri, döngüler ve fonksiyonlar içerisindeki komutları boşluk karakterleri veya kesmeler kullanarak içeriye doğru girintili yazmalısınız. Bu, yapıyı ön plana çıkaracaktır. Otomatik olarak klasör oluşturmak Artık küçük bir program yazmak için yeterli temel bilgiye sahipsiniz. Göreviniz, içerisinde faturalarınız ve mektuplarınızı sakladığınız klasörü, Scripting Host’un her ay otomatik olarak oluşturmasını sağlamak. Klasör, oluşturulduğu aya uygun olarak “0301” gibi bir isme sahip olacaktır. Ayrıca bu klasör, kullanıcının Word altından hızlı ve kolay bir şekilde erişebilmesi için Office çevresine de (sol taraftaki Outlook benzeri çubuk) eklenecektir. Bu görevin avantajları ise klasörler, Kayıt Düzenleyicisi ve tarih fonksiyonları ile çalışmayı öğrenecek olmanızdır. Yüzeysel açıklamalara sahip kaynak kodun tamamını eCHIP CD’sinden (HeCHIP-Code VBSCRIPT) yükleyebilirsiniz. Bu fikir çok hoşunuza gitti, ancak programcılıkla pek ilginiz mi yok? Sorun Değil! Bu script’i çalıştırmak için yapmanız gereken tek şey, Windows’un başlangıç klasörüne yerleştirmektir. Eğer ihtiyacınız yoksa script’i silin ve UNINSTALL. REG’i çalıştırın. Alpha ve Omega: Değişkenleri tanımlamak Script’e başlarken ilk olarak değişkenleri tanımlayın. Tarih veya klasör gibi bilgiler bu değişkenlerde saklanırlar. Script, bir tanesi sayılar diğeri de metinler ile çalışan iki çeşit değişken kullanıyor. Bunların karışık kullanılması mümkün değildir, ancak her ikisi de DIM komutu kullanılarak tanımlanır: Dim FolderName, Folder, Folderpath Dim Tarih, Ay, Sene, Oncekiay, Ayismi Daha fazla değişkene gerek yok. Normalde bir hata ile karşılaşıldığında Script’in çalıştırılması durdurulacağı için script’te hatalara karşı önlem almalısınız. Yani script’in çalışmasının yarıda kesilmemesi için DIM bölümünden sonra aşağıdaki satırı yazmalısınız: on error resume next Yukarıdaki satır dilimize çevrildiğinde, hata ile karşılaşıldığı zaman bir sonraki noktadan çalışmaya devam et anlamına geliyor. Scripting Host da bu satırı aynı şekilde Karşılama Mesajı: Bu pencere ile programcıların dünyasına ilk adımınızı attınız. Okunaklı: Kod paragraşarının doğru bir şekilde girintili olarak yazılması script yapısının takip edilmesini kolaylaştırıyor. k Değişkenleri tanımlamak Nesneleri çağırmak Klasörü oluşturmak Yeni ayı Kayıt Defteri’ne yazmak SON Klasör mevcut mu? Klasörü seçmek ve Kayıt Defteri’ne yazmak Kayıt Defteri’ndeki ay, güncel aydan küçük SON Hayır Kayıt Defteri’ndeki değerleri okumak Evet Hayır Evet Ay iki haneli mi? Klasör ismini oluşturmak Önüne sıfır eklemek BİR BAKIŞTA SCRIPT Güncel tarihi elde etmek Kaynak kodun yapısını daha rahat takip edebilmek için aşağıdaki akış diagramından faydalanabilirsiniz: yorumluyor. Ancak bu durumda script’in nerede takıldığını fark edemezsiniz. Bu nedenle söz konusu satırı çalışmanız bittikten sonra script’e saklamalısınız. Tarih fonksiyonu: Günün tarihini elde etmek Şimdi her şey yolunda gidiyor. PC’nize, oluşturacağınız klasörün ismini hazırlarken kullanacağınız günün tarihini sorun. Script, ayrıca tarihin işleme sokulup sokulmayacağına da karar vermelidir. Bu148 Windows Otomasyonu AKTÜEL » KAPAK » DONANIM » YAZILIM » PRATİK » INTERNET CHIP | OCAK 2003 nun için “date()” fonksiyonu kullanılır. Bu fonksiyonun içeriği “Tarih” değişkenine atanır: Tarih = date() Artık “Tarih” değişkeninde “10.01.2003” gibi bir değer yer alır.Ancak bizim görevimiz için sadece Ay ve Sene bilgileri gereklidir. Söz konusu değerleri, month() ve year() fonksiyonlarını kullanarak “Tarih” değişkeninden ayırabilirsiniz. Elde edeceğiniz her bir değeri uygun değişkenlerde saklamalısınız: Ay = month(Tarih) Sene = year(Tarih) Kullandığımız örneğe göre “Ay” değişkeni “1” ve “Sene” değişkeni ise “2003” değişkenlerine sahip olacaktır. Daha çok fonksiyon kullanmak: Nesne oluşturma Tüm programcılar VBScript komutları ile kısa sürede sınırlara ulaşabilirler. VBS, Kayıt Düzenleyicisi’ne sayı yazamaz, yeni klasörler oluşturamaz veya dosyaları seçemez. Ancak VBS’in nesneleri çağırabilme özelliği söz konusu dezavantajını ortadan kaldırır. Bu sayede Windows’un veya başka yazılımların kullanışlı fonksiyonlarına erişme hakkı elde edebilir. Bizim örneğimiz için hazırladığımız programın sadece Kayıt Defteri’ne erişmesi yeterli olacaktır. Bunun için bir nesnenin çağrılması gereklidir: set Registry = CreateObject("WScript.Shell") Yukarıdaki satır, Registry değişkeninin WScript.Shell ile haberleşmek için kullanılabileceği anlamına geliyor. Burada kullanılan WScript.Shelll, Kayıt Düzenleyicisi fonksiyonlarına sahiptir.Aynı işlemin klasör oluştururken kullanılması gereken dosya sistemi için de gerçekleştirilmesi gereklidir: set FileSystem = CreateObject("Scripting. _ FileSystemObject") Arka Plan: Bir nesne araba ile kıyaslanabilir, yani bir arabayı BenimArabam nesnesi olarak tanımlayabilirsiniz. Artık bu nesneyi elde etmek istediğiniz bilgiye göre sorgulayabilirsiniz. Örneğin,“Renk: BenimArabam. Color” ataması Ferrari için “Red” (Kırmızı) değerini verecektir. BenimArabam. Oil ise arabanızın yağ durumunu verecektir. Tabii ki “BenimArabam. Start” gibi komutlar kullanarak da arabanızın çalıştırılmasını sağlayabilirsiniz. Scripting Host’un nesneleri aynen bu şekilde çalışır. Kayıt Defteri’ne yazmak ve okumak Hazırladığımız Script’in aylık klasörleri oluşturacağı yer Kayıt Defteri’ndeki bir değer içerisinde tutulur. Script, ilk çalıştırıldığında bu konumun boş olması gereklidir: Folderpath = Registry.RegRead("HKEY_ _ CURRENT_USER\Software\Chip\ _ Folderpath") Yukarıdaki satır, “Folderpath” değişkenin içeriğini Kayıt Defteri’ndeki “HKEY_CU RRENT_USER\Software\Chip\” anahtarında bulunan “Folderpath” değerine atar. Ayrıca script, Kayıt Defteri’nde bulunan SonTarih değerini Oncekiay değişkenine okur. Bu sayede script’in daha önce çalıştırılıp, çalıştırılmadığı kontrol edilir. İsimlendirmek: Klasör isminin hazırlanması Script, Kayıt Defteri’ndeki Oncekiay değerini okudu ve güncel ay yardımıyla “Ay” değişkeninde kullandı. Şimdi ay değeri değiştirildi ve program henüz bir klasör oluşturmadı, yani Kayıt Defteri’nden okunan sayı “Ay” değişkeninde bulunandan daha küçük. Script artık çalışmaya başlayabilir. Sorgu aynı zamanda daha önce bir klasörün kaydedilip, kaydedilmediğini kontrol eder. If Oncekiay İ Ay AND Folderpath İ> "" Then Her iki şart da sağlandığı zaman script, ikinci bir durumla ilgilenmeye başlar. Klasör isimleri dört karakterden oluşmalıdır. Ancak ayı belirten değer tek bir rakamdan oluşuyorsa, klasörün ismi “029” biçiminde görünecektir. Script, bu nedenle ayı belirten sayının ondan küçük olup, olmadığını kontrol eder. Eğer sonuç küçük çıkarsa, önüne bir sıfır eklenir ve bu yeni değer “Ayismi” değişkeninde saklanır. Aksi takdirde isim oluşturulurken normal değer kullanılır: if Ay İ 10 Then Ayismi = "0" + CStr(Ay) Else Ayismi = CStr(Ay) End If “Ayismi” değişkeni bir metin içermelidir, buna karşılık “Ay” değişkeni sayı değerine sahiptir. Bu nedenle kullanılan “Cstr()”fonksiyonu sayıları metinlere dönüştürür. Şimdi klasör isminde kullanılmak üzere içinde bulunduğunuz senenin son iki basamağının ayrılması gereklidir. Tanımlanan “Sene” değişkeni değer olarak “2003” tarihini sayı cinsinden saklar. Script, sayıyı metne çevirir, sağ taraftaki son iki karakterini ayırır ve bunları Sene- Name değişkenine yazar. SeneName = Right(Cstr(Sene),2) Yukarıda elde edilen parçalar, aşağıdaki komut satırı ile klasör ismini oluşturmak üzere birleştirilirler. Görev: Script, her ay bir klasör oluşturmalı ve isimlendirirken ay ve sene bilgilerini kullanmalıdır. Hafıza: Windows’un en son ne zaman klasör oluşturduğunu hatırlayabilmesi için bir önceki ayın Kayıt Defteri’nde saklanması gereklidir. Windows, ana klasörün yerini de buradan öğrenir. k 150 Windows Otomasyonu AKTÜEL » KAPAK » DONANIM » YAZILIM » PRATİK » INTERNET CHIP | OCAK 2003 FolderName = SeneName + Ayismi Oluşturacağınız klasöre verilecek olan ismin biçimini bu komut satırı üzerinden değiştirebilirsiniz. Eğer klasör isminde ay değerinin önde bulunmasını ve sene ile arasına bir alt çizgi eklenmesini istiyorsanız, aşağıdaki satırı kullanabilirsiniz: FolderName = Ayismi + “_” +SeneName Klasörü oluşturmak ve Office çevresine eklemek Şimdi Kayıt Defteri’ndeki konum bilgisi ile oluşturduğunuz klasörün ismini birleştirin: Folder = Folderpath + "\" + FolderName Bunun sonucunda FileSystem nesnesi kullanılarak oluşturacağınız klasörün nerede saklanacağı bilgisi elde edilir. FileSystem.CreateFolder(Folder) Klasör oluşturulduktan sonra güncel ay bilgisi Kayıt Defteri’ne kaydedilir: Registry.RegWrite "HKEY_CURRENT_USER\_ Software\Chip\SonTarih", Ay Bunun haricinde oluşturduğunuz bu klasörü, daha rahat ulaşabilmek için Office çevresine de eklemek istiyorsunuz. Bunun için Kayıt Defteri’nde değişiklik yapılması gereklidir: Registry.RegWrite "HKEY_CURRENT_USER\_ SOFTWARE\Microsoft\Office\10.0\ _ Common\Open Find\Places\User _ DefinedPlaces\Place0\path", Folder Registry.RegWrite "HKEY_CURRENT_ _ USER\Software\Microsoft\Office\10.0\ _ Common\Open Find\Places\User _ DefinedPlaces\Place0\name", FolderName Profesyonel fonksiyon: Klasör seçmek Eğer klasörün oluşturulacağı yer Kayıt Defteri’nde belirtilmemişse, script’in kullanımı biraz zorlaşacaktır. set Arayuz = CreateObject("Shell. _ Application") Script’in daha okunaklı ve kullanışlı olması için bu parçanın ayrı bir fonksiyon içerisinde saklanması en iyi yoldur. Bir fonksiyon, script içerisindeki küçük bir script olarak açıklanabilir. Bu fonksiyon çağrılırken, eğer gerekirse ana programdan başlangıç değerleri gönderilir ve sonucunda bir değer elde edilir. IF koşul bloğu ile fonksiyon çağrımı aşağıdaki gibi görünür: If Folderpath="" Then Folderpath = Klasorsec() End if Yukarıdaki ifade eğer Kayıt Defteri’nde herhangi bir bilgi mevcut değilse Klasor- Sec fonksiyonunu çalıştır, anlamındadır. Fonksiyon çağrılırken kullanılan parantez içerisine, gerektiği takdirde fonksiyon içerisinde kullanılmak üzere başlangıç değerleri yazılabilir. Fonksiyon içerisinde ilk olarak,Windows’un klasör seç penceresinin ekrana gelmesini sağlayacak olan, BrowseForFolder komutunun alacağı değer “Folder” değişkenine atanır. Hızlı Erişim: Script, oluşturduğu aylık klasörü direkt olarak Office’in kişisel çevresine ekler. Konforlu: Kullanıcı, klasörlerin ileride oluşturulacakları konumu bu iletişim penceresini kullanarak seçebilir. set Folder = Arayuz.BrowseForFolder(0," _ Aylık klasörlerin ileride saklanacakları _ klasörü seçin",0,0) Buradaki sorun BrowseForFolder komutunun seçilen klasörün tam konumu yerine sadece klasör ismini geri döndürmesidir. Bunun için, seçili klasörün bir üst düzeyindeki, yani içerisinde bulunduğu klasörün bilgisini veren ParentFolder özelliğinden faydalanabiliriz: set parent = Folder.ParentFolder set path = parent.items ParentFolder, bileşenleri (items) ve konumlarını elde eder. Bir döngü yardımıyla klasör isimlerinin ParentFolder içeriği ile karşılaştırılması sağlanır. Klasör bulunduğu zaman konum bilgisi “Path” üzerinden okunur: for each item in path if item.Name = Folder.Title then path _ Name = item.path next Son olarak aşağıdaki ifade fonksiyonu klasörün değerine atar: Klasorsec = pathName Elde edilen klasör konumu daha sonra Kayıt Defteri’ne yazılır ve ana programa geri dönülür. Script’imiz artık çalışmaya hazırdır! _ SG / Kadir Tuztaş, ktuztas@chip.com.tr Microsoft’un resmi Scripting sayfası: www.microsoft.com/scripting/ Microsoft komut listesi: http://msdn.microsoft.com/library/ default.asp?url=/library/enus/ script56/html/vbscripttoc.asp Komutlara hızlı bakış, yüklenebilir Script’ler: http://www.winguides.com/ scripting/reference.php?id=32 Kod işaretleme ve satır numaralı profesyonel editör: http://www.sapien.com/primal SCRIPT.htm Fiyat: 149 $ WEB ADRESLERİ »Programcıların kütüphaneleri 152