VB Script-ek

2007-06-10

 

A szükség úgy hozta, hogy kénytelen voltam elkezdeni foglalkozni a MS Windows-ok piszkálására fejlesztett VBScript-ekkel. Tulajdonképpen nem mondható, hogy egy kis vacakolás után nagy spiller lennék a témában, de azt hiszem egy lapra való infót már sikerült összebogarásznom. Azt hiszem a hozzám hasonló kezdőknek ez segítségére lehet, vagy ha másra nem, arra jó ez a lap, hogy megosszam örömömet az erre bogarászókkal, ezt-azt már sikerült működésre bírnom! Rögtön előszőr ajánlanék néhány linket, amiken én is sokat böngésztem:

http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx

http://www.microsoft.com/technet/scriptcenter/guide/sas_wmi_overview.mspx

A pontosság kedvéért a VBScript-ek sima szoveges file-ba (aminek kiterjesztése .vbs) írt kis Basic (Visual) programok, amiket a Windows a beépített értelmezőjével mindenféle fordítás nélkül tud futtatni. Ami érdekessé teszi őket, hogy a Windows azon funkcióit piszkálhatjuk a segítségükkel, amiket egyébként menükön, ikonokon, ablakokon keresztül egérrel szoktunk állítgatni. Sőt valójában többet is tudnak, rabszolgamunkákat oldhatunk meg velük. Nyilván ezek a kis programok csak olyan jogosultsággal futnak, amilyent az őket futtató felhasználó birtokol. Tehát jó ha a gépen adminisztrátorok vagyunk, akkor tudunk mindent jól összekavarni. Az MS guruk a fejlesztéshez nemes egyszerűséggel a Notepad-ot ajánlják, hiszen az MS nagylelkűségéből azt úgyis ingyen kapjuk a Windows-hoz. Én azért megkockáztatnám, hogy egy programozói editorral talán kissé könnyebben lehet alkotni. A script-eket kétféleképpen tudjuk futtatni, karakteres és grafikus felületen keresztül. Az egyik módja a futtatásuknak, ha a *.vbs file-t kirakjuk az asztalra és simán rákattintunk. A másik, a karakteres felületet úgy érhetjük el, hogy START gomb / FUTTATÁS és a felbukkanó parancssorba begépeljük: cmd, majd ENTER-t ütünk. Végre valami DOS like. Csak kibújik a szög a zsákból. Ha csinálni akarunk valamit, csak elő kell venni azt a csúnya, elavult, buta, felhasználó által megtanulhatatlan, fúj DOS, fúj Unix parancsoros karakteres felületet:). Bocs a kilengésért. Szoval itt beütjük, hogy cscript xyz.vbs, és lefut amit alkottunk. Egy igen régi Murphy törvény, hogy a programjaink az utasításaink és nem a kívánságaink szerint működnek.

Nézzük az első nagyon egyszerű script-ünket. Megfigyelhetjük, hogy megjegyzést ' -jel után írhatunk. Ez nem kerül feldolgozásra. Ismert programozói fogás hibakeresés, programbelövés során, hogy egyes program sorokat, amelyeket ki akarunk hagyni, nem törlünk ki, csak megjegyzésnek jelöljük, így ha később mégis szükséges nem kell újra visszapötyögnünk. A másik utasítás a Wsript.Echo, ami az utána következőket kiírja a képernyőre. Érdekes, hogy igen eltérően viselkedik parancssorban egy sort kiír, míg grafikus módban egy üzenet ablakot dob fel, amit le kell OK-ézni, szóval megszakítja a prg. futását. Kipróbáláshoz simán ki kell vágólapra másolni innen a sárgabetűs részt, aztán Notepad-ba (:-)) beileszteni, és elmenteni mondjuk echo.vbs néven.


' echo.vbs
'
' Wscript.Echo használata
' Parancs ablakból futtatva cscript alól kiirást kapunk.
' WIN alól futtatva egy üzenet ablakokat kapunk, mint a msgbox-nál.
'
' Király Tibor
' 2006-01-12


Wscript.Echo "Türelmét kérem, a log-ok mentése folyik."
Wscript.Echo ""
Wscript.Echo "Rendszergazda"

Azt hiszem nem mindegyik script-hez fogok már ilyen részletekbe menő magyarázatot írni, de az sem kizárt, hogy egyszer jobban összeszedem magam. Igyekeztem a comment-be beírni a fontos dolgokat.


' for_ciklus.vbs
'
' For ciklus bemutatása
'
' Király Tibor
' 2006-01-12


For i= 1 to 5
   Wscript.echo i
Next


' msgbox.vbs
'
' Üzenet kiírása Win üzenetablakba
'
' Király Tibor
' 2006-01-12


msgbox "Ez KHIIRÁÁLY!"


' datum.vbs
'
' Aktuális dátum string előállítása és kiírása.
'
' Király Tibor
' 2006-01-12


' 1. formátum: 2006_1_12
Wscript.Echo Year( Date)& "_"& Month( Date)& "_"& Day( Date)


' 2. formátum: 2006_01_12
Wscript.Echo Year( Date)& "_"& Right( "0"& Month( Date), 2)& "_"& Right( "0"& Day( Date), 2)


' 3. formátum: 20060112
Wscript.Echo Year( Date)& Right( "0"& Month( Date), 2)& Right( "0"& Day( Date), 2)


' 3. formátum: 060112
Wscript.Echo Right( Year( Date), 2)& Right( "0"& Month( Date), 2)& Right( "0"& Day( Date), 2)


' quit.vbs
'
' Script futásának megszakítása, és kilépés
'
' Király Tibor
' 2006-01-13


Wscript.Echo "Ezt még kiírja"
WScript.Quit()
Wscript.Echo "Ezt már nem írja ki"


' file_copy.vbs
'
' Megvizsgálja, hogy a kérdéses file át van-e másolva, ha nem, átmásolja.
' Fontos: a path végén \-nek kell lennie!
'
' Király Tibor
' 2006-01-12


honnan=  "c:\windows\"
hova=    "c:\"
filenev= "control.ini"


Set oFS= CreateObject( "Scripting.FileSystemObject")
If not oFS.FileExists( hova& filenev) Then
   oFS.CopyFile honnan& filenev, hova
End If


' dir_kezeles.vbs
'
' Megvizsgálja, hogy adott directory létezik-e, ha nem létrehozza.
'
' Király Tibor
' 2006-01-12


hely= "C:\projects_vbs"


Set oFS= CreateObject( "Scripting.FileSystemObject")
If not oFS.FolderExists( hely) Then
   Set objFolder= oFS.CreateFolder( hely)
End If


' ext_prg.vbs
'
' Külső program futtatása scriptből
'
' Király Tibor
' 2006-01-13


Set oWS= Wscript.CreateObject( "Wscript.Shell")
oWS.Run( "calc.exe")


' ext_prg.vbs
'
' Külső program futtatása scriptből
'
' Király Tibor
' 2006-01-13


Set oWS= Wscript.CreateObject( "Wscript.Shell")
oWS.Run( "calc.exe")


' app_log_irasa.vbs
'
' Írás Application / Alkalmazás log-ba.
'
' Király Tibor
' 2006-01-12


Set oShell= Wscript.CreateObject( "Wscript.Shell")
oShell.LogEvent 0, "Teszt bejegyzés."


' appl_log_mentese.vbs
'
' Application / Alkalmazás log mentése és kiürítése.
'
' Király Tibor
' 2006-01-12


' Saját gép event log-ok backup-jához
Set oWMISrv= GetObject( "winmgmts:"& "{impersonationLevel= impersonate, ( Backup)}!\\.\root\cimv2")


' Alkalmazás eseménynapló mentése
Set colLogFiles= oWMISrv.ExecQuery( "Select * from Win32_NTEventLogFile where LogFileName= 'Application'")
For Each objLogfile in colLogFiles
   errBackupLog= objLogFile.BackupEventLog( "c:\app.evt")
   If errBackupLog <> 0 Then
      Wscript.Echo "APP.EVT  mentése nem sikerült!"
   Else
      Wscript.Echo "APP.EVT  elmentve."
      ' Vigyázat, a következő sor kiüríti a log-ot! Ha mehet, vedd ki a comment-et.
      ' objLogFile.ClearEventLog()
      ' Wscript.Echo "APP LOG kiürítve."
   End If
Next


' ie_ablakba_kiiras.vbs
'
' Arra jo, ha nem akarjuk, hogy a felhasznalonak le keljen OK-ezni az uzenetet.
'
' Király Tibor
' 2006-01-12


Set objExplorer= WScript.CreateObject( "InternetExplorer.Application")
objExplorer.Navigate                 "about:blank"


objExplorer.ToolBar=                   0
objExplorer.StatusBar=                 0
objExplorer.Width=                   600
objExplorer.Height=                   200
objExplorer.Left=                       200
objExplorer.Top=                      200
objExplorer.Visible=                      1
objExplorer.Document.Body.InnerHTML= "Rendszergazda:  Türelmét kérem, a biztonsági napló file-k automatikus mentése folyik."


' Ide lehetne írni a .VBS törzsét.
' Ez egy kis várakozás, a példa kedvéért, hogy el lehessen olvasni az üzenetet.
Wscript.Sleep 5000


objExplorer.Quit

Folytatása következik ... reményeim szerint.


És igen, eljött a folytatás:) Ez az első program azt mutatja meg, hogyan irhatunk szöveges file-ba.


' filewr.vbs
'
' Letrehoz egy c:\adatok.txt szoveges file-t, amibe nehany sort ir.
'
' Kiraly Tibor
' 2007-06-10


Dim filenev, oFSO, oFile
filenev= "C:\adatok.txt"
Set oFSO= CreateObject( "Scripting.FileSystemObject")


Set oFile= oFSO.CreateTextFile( filenev)                   ' text file letrehozasa
Set oFile= Nothing


Set oFile= oFSO.OpenTextFile( filenev, 2)                 ' file megnyitasa irasra
oFile.WriteLine("12")                                                  ' adatok beirasa
oFile.WriteLine("23")
oFile.WriteLine("34")
oFile.WriteLine("45")
oFile.WriteLine("56")
oFile.Close                                                                  ' file lezarasa
'End of Script

Programok dokumentálásánál segithet ez a kis script, kilistázza a megadott mappat.


' dir2file.vbs
'
' A megadott mappa file-it kilistazza a megadott file-ba.
'
' Kiraly Tibor
' 2007-06-10


Dim oFSO, oFile, oFolder, listfile, foldernev, filenev
Set oFSO= CreateObject( "Scripting.FileSystemObject")
mappanev=  "C:\"
filenev= "C:\files.txt"


Set oFolder= oFSO.GetFolder( mappanev)           ' mappa beolvasasa


Set listfile= oFSO.CreateTextFile( filenev)              ' file letrehozasa
Set listfile= Nothing


Set listfile= oFSO.OpenTextFile( filenev, 2)            ' mappa kilistazasa
listfile.WriteLine( "File neve                Merete      Datuma")
listfile.WriteLine( "-----------------------------------------------")
For Each oFile in oFolder.Files
   listfile.WriteLine( Left( oFile.Name& Space( 30), 25)& Right( Space( 11)& oFile.Size, 11)& " "& Left( oFile.DateCreated, 10))
Next
listfile.Close
'End of Scipt

Ez hasonlít az előző script-hez, de ez az aktuális mappát listázza ki (nagyjából hasonló mint a dir >> lmappa.txt).


' lmappa.vbs
'
' Az aktualis mappa file-it lmappa.txt-be.
'
' Kiraly Tibor
' 2007-06-10


Dim oFSO, oFolder, oFile, listafile, filenev
Set oFSO= CreateObject( "Scripting.FileSystemObject")
filenev= "lmappa.txt"


Set oFolder= oFSO.GetFolder( ".")                  ' mappa beolvasasa


filenev= oFolder.Path& "\"& filenev                   ' lista file letrehozasa
Set listafile= oFSO.CreateTextFile( filenev)
Set listafile= Nothing


' mappa kilistazasa
Set listafile= oFSO.OpenTextFile( filenev, 2)     ' file megnyitasa irasra
listafile.WriteLine( oFolder.Path)                       ' fejlec kiirasa
listafile.WriteLine( "")
listafile.WriteLine( "File neve                Merete      Datuma")
listafile.WriteLine( "-----------------------------------------------")
For Each oFile in oFolder.Files                         ' file-k es tulajdonsagaik kilistazasa
   listafile.WriteLine( Left( oFile.Name& Space( 30), 25)& Right( Space( 11)& oFile.Size, 11)& " "& Left( oFile.DateCreated, 10))
Next
listafile.Close                                                     ' file lezarasa
'Enf of Script

Ez az aktuális mappából kiindulva kilistázza az almappákat.


' treelist.vbs
'
' Az aktualis mappat es az almappait kilistazza ltree.txt-be.
'
' Kiraly Tibor
' 2007-06-10


Dim oFSO, oFolder, listafile, filenev
Set oFSO= CreateObject( "Scripting.FileSystemObject")
filenev= "ltree.txt"                                              ' lista file neve
Set oFolder= oFSO.GetFolder( ".")                  ' aktualis mappa beolvasasa


filenev= oFolder.Path& "\"& filenev                  ' lista file letrehozasa
Set listafile= oFSO.CreateTextFile( filenev)
Set listafile= Nothing


' mappak kilistazasa
Set listafile= oFSO.OpenTextFile( filenev, 2)     ' file megnyitasa irasra
listafile.WriteLine( oFolder.Path)                       ' gyoker mappa kiirasa
almappa_kiiro( oFolder)                                   ' almappak kiirasa
listafile.Close                                                    ' file lezarasa
'End of Script


Function almappa_kiiro( oMappa)                    ' almappakat kilistazo rekurziv fgv.
   For Each oAlmappa in oMappa.SubFolders  ' az oMappa-bol az osszes oAlmappa-an vegigmegy
      listafile.WriteLine( oAlmappa.Path)             ' kiirja az oAlmappa eleresi utjat
      almappa_kiiro( oAlmappa)                         ' megnezi van-e almappaja - rekurzio
   Next
End Function


' ldrive.vbs
'
' A gep drive-jainak tulajdonsagit kiirja a c:\ldrive.txt-be.
'
' Kiraly Tibor
' 2007-06-10


Dim oDRV, oFSO, kiir, filenev, listafile, sor
Set oFSO= WScript.CreateObject( "Scripting.FileSystemObject")
filenev= "c:\ldrive.txt"


filenev= filenev                                                 ' lista file letrehozasa
Set listafile= oFSO.CreateTextFile( filenev)
Set listafile= Nothing


Set listafile= oFSO.OpenTextFile( filenev, 2)    ' file megnyitasa irasra
listafile.WriteLine( "Now: "+ _
                     FormatDateTime( Now(), 1)+ " "+ _
                     FormatDateTime( Now(), 4))
listafile.WriteLine( "")                         ' fejlec kiirasa
listafile.WriteLine( "Drv FS    Type                    Size              Free")
listafile.WriteLine( "--------------------------------------------------------")


For Each oDRV In oFSO.Drives                     ' vegig a drive-kon
 If oDRV.IsReady Then                                   ' ha ready
    listafile.WriteLine( _
       oDRV.Path+ "  "+ _
       Left( CStr( oDRV.FileSystem)+ "   ", 5)+ _
       IsDrvType( oDRV.DriveType)+ _
       FormatKT( oDRV.TotalSize, 18)+ _
       FormatKT( oDRV.FreeSpace, 18) _
    )
  Else                                                                ' ha nem ready
     listafile.WriteLine( _
        oDRV.Path+ "  "+ _
        "Not ready" _
     )
  end if
Next 
' End of Script


Function IsDrvType( tipus)                                ' drive tipus kiirasa
   Select Case oDRV.DriveType
      Case 0 
         IsDrvType= " Unknow    "
      Case 1
         IsDrvType= " Removable "
      Case 2
         IsDrvType= " Fixed     "
      Case 3
         IsDrvType= " Network   "
      Case 4
         IsDrvType= " CD-ROM    "
      Case 5
         IsDrvType= " RAM Disk  "
    End Select
End Function


Function FormatKT( n, w)                               ' szam konvertalasa string-ge, harmas szamcsoportokra osztva, megadott szelesseggel
   Dim s, o, l, h
   o= ""                                                            ' output string
   s= CStr( n)                                                   ' szam atalakitasa string-ge
   l= Len( s)                                                     ' string hossza
   h= 0                                                             ' szamlalo a harmas csoportokhoz
   For i= 1 to l                                                  ' vegig betunkent a stringen
      o= Right( s, 1)+ o                                      ' string utolso betujet atteszzuk a kimeneti string elejere
      s= Left( s, l- i)                                           ' string utolso betujet levagjuk
      h= h+ 1                                                     ' szamoljuk hanyadik betunel tartunk
      If h = 3 Then                                             ' ez a harmadik
         o= " "+ o                                                ' elvalaszto karakter beszurasa
         h= 0                                                       ' szamlalo nullazasa
      End If
   Next
   o= Right( Space( w)+ o, w)                          ' ez tulajdonkeppen pad(), kiegeszitjuk a stringet, w hosszra
   FormatKT= o                                               ' es visszaadjuk
End Function

Ez a script a MsgBox lehetőségeit mutatja be.


' tmsgbox.vbs
'
' MsgBox lehetosegeinek tesztelese
'
' Kiraly Tibor
' 2007-06-10


Dim valasz


' Uzenet ablak - szoveg a dobozban, vezerles, keret felirata 
MsgBox "MsgBox tesztelese.", _
               vbInformation, _
              "Fejlec."


' MsgBox megjelenites vezerlesi lehetosegek
' Tobb kivant funkcio eseten, az ertekeket ossze kell adni.
'
' Ertek   VBscript allando         Jelentes
'
' 0        vbOKOnly                    OK button 
' 1        vbOKCancel                 OK and Cancel buttons
' 2        vbAbortRetryIgnore       Abort, Retry, Ignore buttons
' 3        vbYesNoCancel            Yes, No, and Cancel buttons
' 4        vbYesNo                      Yes and No buttons
' 5        vbRetryCancel               Retry and Cancel buttons 
'
' 16       vbCritical                      Critical error icon
' 32       vbQuestion                   Question mark icon
' 48       vbExclamation               Exclamation mark icon
' 64       vbInformation                Information ("i") icon
'
' 0         vbDefaultButton1          Make the first button the default 
' 256     vbDefaultButton2          Make the second button the default
' 512     vbDefaultButton3          Make the third button the default
' 768     vbDefaultButton4          Make the fourth button the default
'
' 0          vbApplicationModal     Application modal
' 4096    vbSystemModal           System modal


valasz= MsgBox( "Biztosan formattalni akarod a C: -t?", _
                             vbYesNo + vbQuestion + vbDefaultButton2 + vbApplicationModal)


If valasz = vbNo Then
   MsgBox( "Ma csak a IGEN valaszt fogadjuk el!")
End If
' End of Script


' MsgBox visszadott ertekek
'
' Ertek   VBscript allando   Jelentes
'
' 1       vbOK              OK
' 2       vbCancel          Cancel
' 3       vbAbort            Abort
' 4       vbRetry             Retry
' 5       vbIgnore            Ignore
' 6       vbYes               Yes
' 7       vbNo                No

Ez a script az InputBox használatát mutatja be.


' tmsgbox.vbs
'
' InputBox lehetosegeinek tesztelese
'
' Kiraly Tibor
' 2007-06-10


Dim valasz


valasz= InputBox( "Kerem adja meg a nevet!","Itt az On PC-je")
If valasz = -1 Or valasz = "" Then                       ' ha nincs valasz
   MsgBox( "On nagyon udvariatlan!"+ vbCrLf+ _
                  "Ezert most formattalom a C: -t.")
Else                                                                    ' ha van valasz
   MsgBox( "Udvozlom kedves "+ valasz+ "!")
End If
' End of Script

Ez itt a folytatás helye...