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...