Belirli işlemleri otomatikleştirmek için script dilleri bizlere büyük kolaylıklar sağlarlar , aslında script dediğimiz şeyler küçük programcıklardır ve bazıları oldukça yüksek seviyede programlama
Buradaki konunun sonunda paylaştığım bir vhd.vbs scripti ile vhd.txt isimli dosyadan okuttuğumuz komutları diskpart a sıralı uygulatıyorduk , gel gelelim eğer vhd.vbs ile vhd.txt dosyalarını aynı klasör içine atıp komutları çalıştırmayı denersek çalışmayacaktır ben aşağıdaki yola her iki dosyayı da kopyaladım
C:\Users\velociraptor\Desktop\registry\vhd
bu klasör içerisinde iki dosyam var
1. vhd.vbs
2. vhd.txt
Set WshShell = CreateObject("WScript.Shell") Set objFSO = CreateObject("Scripting.FileSystemObject") WshShell.Run "C:\Windows\System32\diskpart.exe /s C:\Users\velociraptor\Desktop\registry\vhd\vhd.txt", 1, True
Üstteki kod benim bilgisayarımda çalışıyor ama bir başkasınınkinde hata verir çünkü bir başkasının kullanıcı adı farklıdır (çevre değişkenlerinin .vbs de kullanımını burada es geçiyorum - Burada) ,
halbuki hiç kullanıcı adını yazma zorunluluğumuz olmasa scripti herhangi bir klasör içerisinde tıklayan biri hemen yanında bulunan vhd.txt dosyasındaki komutları uygulatabilse herşey daha kolay olurdu ve kullandığımız scripti indiren herkesin bilgisyarında sorunsuz çalışırdı (kullanıcı adı değiştirme zorunluluğu olmazdı) bunu sağlamak için mevcut dizini (currentdirectory) veren kodlardan faydalanacağız peki mevcut dizini hangi kodlarla buldurtabiliriz ?
.vbs ile mevcut dizini (CurrentDirectory) bulduran kodlar
1.kod
WScript.Echo CreateObject("WScript.Shell").CurrentDirectory
2.kod
WScript.Echo Replace(WScript.ScriptFullName, WScript.ScriptName, "")
3.kod
Set fso = CreateObject("Scripting.FileSystemObject") wscript.Echo fso.GetParentFolderName(wscript.ScriptFullName)
4.kod
WScript.Echo CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName)
5.kod
currentDirectory = left(WScript.ScriptFullName,(Len(WScript.ScriptFullName))-(len(WScript.ScriptName))) WScript.Echo currentDirectory
6.kod
Set fso = CreateObject("Scripting.FileSystemObject") ShowAbsolutePath = fso.GetAbsolutePathName(strFile) WScript.Echo ShowAbsolutePath
7.kod
sCurPath = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(".") WScript.Echo sCurPath
Muhtemelen daha başka yöntemlerde vardır , ilk örneğimize geri dönersek bunlardan birini kullanarak kodu öyle bir şekilde düzenlemeliyizki kullanıcı adına gerek kalmasın ben 7 numaralı kodu kullanacağım
Set WshShell = CreateObject("WScript.Shell") sCurPath = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(".") WshShell.Run "C:\Windows\System32\diskpart.exe /s " & sCurPath & "\vhd.txt""", 1, True
Üstteki kod ile kullanıcı adı engelini aşıp vhd.vbs nin hangi klasör içerisinde bulunursa bulunsun yanında bulunan vbs.txt kodlarını okuyup uygulamasını sağlıyoruz. Elbette bir adım ileri gidip önce vhd.txt dosyasını oluşturtup sonra okutup (diskpart.exe ye uygulatıp) en sonunda da sildirebiliriz böylece tek bir vhd.vbs dosyası tüm işimizi halledecektir tabii ki burada UAC si açık bir sistemde kullanıcının scripti C:\ dizininde çalıştırabileceğini de göz önünde bulundurmamız gerekecektir bu nedenle scripte Kullanıcı hesabı denetimi kontrolünü içeren kodları da ilave edersek son hali aşağıdaki şekilde olacaktır
'created by Velociraptor (www.sordum.net) 11.03.2015 If WScript.Arguments.length =0 Then Set objShell = CreateObject("Shell.Application") objShell.ShellExecute "wscript.exe", Chr(34) & _ WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1 Else '-------------- Dim objFSO, outFile Set objFSO = CreateObject("Scripting.FileSystemObject") 'Open write stream Set outFile = objFSO.CreateTextFile("vhd.txt", True) outFile.WriteLine "select vdisk file=d:\win_10.vhd" outFile.WriteLine "attach vdisk" outFile.WriteLine "select vdisk file=d:\win_8.1.vhd" outFile.WriteLine "attach vdisk" outFile.Close Set WshShell = CreateObject("WScript.Shell") sCurPath = CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(".") WshShell.Run "C:\Windows\System32\diskpart.exe /s " & sCurPath & "\vhd.txt""", 1, True Set obj = CreateObject("Scripting.FileSystemObject") obj.DeleteFile("vhd.txt") '-------------- 'End of UAC workaround code End If
Script nerede çalıştırılırsa çalıştırılsın vhd.txt isminde ve içerisinde aşağıdaki kodlar olan bir dosya oluşturacaktır (üstteki scriptte tek editlemeniz gereken kısım burasıdır çünkü kullanıcının ne isimde vhd dosyası oluşturduğunu bilmemize olanak yok
select vdisk file=d:\win_10.vhd attach vdisk select vdisk file=d:\win_8.1.vhd attach vdisk
daha sonra script diskpart.exe yi çalıştırıp vhd.txt isimli dosyadan kodları okutmakta ve işlem bitince de vhd.txt isimli dosyayı silmektedir.