.Vbs de geçerli dizin (CurrentDirectory) kullanımı


vbs de current directory kullanımı
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

dillerini de içerebilirler mesela Perl ve Python bunlara iyi birer örnektir , aslında mantıken düşünüldüğünde her bir programlama dilinin bir script dili olarak kullanılabileceği söylenebilir gel gelelim burada karşımıza uyumluluk sorunu çıkmaktadır , yaygın olarak kullanıcılar .bat , .vbs... gibi scriptleri tercih etmektedirler , en azından ben işim düştükçe ve anladığım kadarı ile bunlarla işimi halletmeye çalışırım olmadı daha üst dilleri bilenlere danışır gerekirse işimi görebileceğim program konusunda yardım isterim , benim yaklaşımım genellikle ihtiyacım doğrultusunda öğrenmektir mesela geçenlerde tekrardan içinde bulunulan (geçerli) dosya yolu gerekli olunca ikide birde karşıma çıkması beni bu konuyu araştırmaya teşvik etti ve neticede de bu yazı ortaya çıktı

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) ,

scripting

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.


Yorum Ekle

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

Captcha