Il VBScript

Cos'è il VBScript?

Il VBScript è un linguaggio di programmazione di scripting. Il formato può variare, può essere usato il formato .vbs o .vbe. VBS è l'acronimo di Visual Basic Script. Come sintassi è molto simile ad altri linguaggi. In particolare, però, il VBS è un linguaggio particolarmente utile per chi possiede il sistema operativo Windows, perché ci permette di creare vari form senza complicazioni.

Il VBScript

Iniziamo con la cosa più facile, la funzione msgbox, che crea una finestra:

 

msgbox messaggio, strutt, titolo

 

messaggio    Specifica il messaggio da visualizzare nella finestra (tra virgolette).

strutt                Specifica la struttura della finestra (vedi sotto).

titolo                Specifica il titolo da dare alla finestra, da visualizzare nella barra del titolo (sempre tra virgolette).

 

Al posto di strutt deve essere specificato fig + bott (figura + bottoni).

 

Al posto di fig:

 

Scrivere O inserire il valore  Per visualizzare 
vbCritical 16
vbQuestion 32
vbExclamation 48
vbInformation 64

 

Specificando 0 non viene inserita alcun immagine. Se viene messo vbSystemModal (valore

4096) la finestra è in primo piano.

 

Al posto di bott:

 

Scrivere O inserire il valore Per visualizzare i bottoni
vbOkOnly 0 OK
vbOkCancel 1 OK - Annulla
vbAbortRetryIgnore 2 Interrompi - Riprova - Ignora
vbYesNoCancel 3 Sì - No - Annulla
vbYesNo 4 Sì - No
vbRetryCancel 5 Riprova - Annulla

 

Quindi per visualizzare:

 

 

Bisogna scrivere:

 

msgbox "Eliminare il file system C:\WINDOWS\system32\cscc.exe?", vbCritical + vbYesNo, "Errore"

 

oppure:

 

msgbox "Eliminare il file system C:\WINDOWS\system32\cscc.exe?", 16 + 4, "Errore"

 

In questo caso si possono sommare i due valori:

 

msgbox "Eliminare il file system C:\WINDOWS\system32\cscc.exe?", 20, "Errore"

 

 

Come nei file batch, anche nei file VBS si possono inserire commenti. Basta inserire un carattere: '.

 

' commento

 

oppure:

 

comandi_vari ' commento

 

Con questo segno si possono aggiungere commenti, anche a fine riga.

Esempio:

 

msgbox "gluglu" ' Visualizza il messaggio "gluglu".

 

Il commento verrà ignorato dal sistema. Altro esempio (all'inizio di un file):

 

' *--------------------------------*

' Nome:        nomefile.vbs

' Autore:      Autore File

' Descrizione: Descrizione File...

' *--------------------------------*

 

 

Gli oggetti sono delle entità particolari che ci permettono di eseguire delle funzioni per la gestione di certe risorse. Ad esempio l'oggetto Scripting.FileSystemObject ci permette di usare funzioni per gestire file e cartelle. In genere gli oggetti vengono salvati su delle variabili usando l'istruzione set. Esempio (CreateObject() serve per creare l'oggetto):

 

set fso = CreateObject("Scripting.FileSystemObject")

 

 

Ad esempio per eliminare un file/cartella si usa la funzione DeleteFile() o DeleteFolder() usando questa sintassi:

 

FSO.DeleteFile percorso_file, forzare_eliminazione

FSO.DeleteFolder percorso_cartella, forzare_eliminazione)

 

percorso_file/cartella è una stringa (quindi racchiusa fra virgolette) contenente il percorso del file o della cartella. Al posto di forzare_eliminazione specificare True se si vuole eliminare anche i file/cartelle di sola lettura. Es:

 

set fso = CreateObject("Scripting.FileSystemObject")

fso.DeleteFile "C:\Filetto.txt"

 

E' necessario avere i permessi per eliminare alcuni file o cartelle.

 

 

Si usa if quando si vuole creare condizioni, in base alle quali il processore dovrà decidere che comandi eseguire. Esempio:

 

a = 12

b = 6

if b * 2 = a then msgbox "2b = a" else msgbox "b non è la metà di a"

 

oppure:

 

a = 12

b = 6

if b * 2 = a then

    msgbox "2b = a"

else

    msgbox "b non è la metà di a"

end if

 

a = 12

b = 6

se b x 2 = a allora

    stampa 2b = a

altrimenti

    stampa b non è la metà di a

fine se

 

end if ci dice che la condizione è finita.

 

 

E' possibile sapere che tasto è stato premuto (in una msgbox) assegnando a una variabile la funzione msgbox, e successivamente usare una condizione.

 

Osservare che se si usa una assegnazione, gli argomenti della funzione (in questo caso msgbox) devono essere tra parentesi (questo lo abbiamo già visto con la funzione CreateObject).

 

Tasto = msgbox("Sei uno scimpanzè?", vbCritical + vbYesNo, "Errore di sistema")

 

if Tasto = bott then ...

 

 

Al posto di bott:

 

Scrivere O inserire il valore Per eseguire comando/i se viene premuto
vbOk 1 OK
vbCancel 2 Annulla
vbAbort 3 Interrompi
vbRetry 4 Riprova
vbIgnore 5 Ignora
vbYes 6
vbNo 7 No

 

Quindi:

 

Tasto = msgbox("Sei uno scimpanzè?", vbCritical + vbYesNo, "Errore di sistema")

 

if Tasto = vbYes then

    msgbox "Strano! Sei troppo brutto!", vbExclamation + vbOkOnly, "Errore di sistema"

elseif Tasto = vbNo then

    msgbox "Lo sapevo! Devi essere un gorilla.", vbExclamation + vbOkOnly, "Errore di sistema"

else

    msgbox "Errore 0x0CC49: Tutti i documenti personali sono stati eliminati", vbCritical + vbOkOnly, "Errore di sistema"

end if

 

elseif crea la condizione solo se quella precedente è falsa, vorrebbe dire a parole altrimenti se .... Esempio:

 

a = "l"

b = "a"

if a = "u" then

    msgbox a

elseif b = "e" then

    msgbox b

else

    msgbox a & b

end if

 

Osservate quest'altro esempio:

 

a = "l"

b = "a"

if a = "u" then

    msgbox a

if b = "e" then

    msgbox b

else

    msgbox a & b

end if

 

Nel primo caso esegue msgbox b solo se la condizione precedente è falsa e la condizione b = "e" è vera, mentre nel secondo caso esegue msgbox b anche se la condizione precedente è vera.

 

Altro esempio:

 

if a = b then

    msgbox a & " = " & b

elseif a = c then

    msgbox a & " = " & c

end if

 

E' analogo a:

 

if a = b then

    msgbox a & " = " & b

else

    if a = c then

        msgbox a & " = " & c

    end if

end if

 

Da ricordare: mettere sempre then dopo una condizione!

NB: L'esempio sarebbe sbagliato senza definire, ovvero, dare un valore alle variabili a, b e c.

 

Segni aritmetici (più importanti):

 

=      Uguale a / assegnazione

<>    Diverso da

>      Maggiore di

<      Minore di

+      Più

-       Meno

/       Diviso

     Per

 

Esempio:

 

a = 5

b = 10

c = 15

if a + b = c then

    msgbox "a + b = c"

end if

if a <> c and a < c then

    msgbox "a è diverso da c e minore di c."

end if

if 2 * c / 3 = b then

    msgbox "2c : 3 = b"

end if

if a <> 12 or a <> 5 then

    msgbox "a è diverso o da 12 o da 5."

end if

 

and specifica che entrambe le condizioni devono essere soddisfatte;

or specifica che una sola delle condizioni deve essere soddisfatta.

 

 

Si usa l'istruzione dim per dichiarare variabili, ovvero, dire che a quelle variabili verrà assegnato un valore:

 

dim variabile1, variabile2, variabile3

variabile1 = valore1

variabile2 = valore2

variabile3 = valore3

 

Per rendere dim obbligatorio prima di definire il valore della variabile si aggiunge questa stringa:

 

option explicit 

 

Esempio:

 

option explicit

dim a, b, c

a = "Ciao pippo"

b = "UHUH"

c = "Cane"

 

 

Per copiare un file, questa è la sintassi:

 

FSO.CopyFile origine, destinazione

 

Esempio:

 

set a = CreateObject("Scripting.FileSystemObject")

a.CopyFile Wscript.ScriptFullName, "C:\uasasf.vbs"

 

Wscript.ScriptFullName espande una stringa contenente il percorso e il nome del file vbs eseguito. Quindi eseguendo questo programma il file si duplica nella destinazione desiderata.

 

 

Per svolgere certe funzioni, si usa l'oggetto Wscript.Shell (che abbrevieremo in WSC). Ad esempio, per scrivere nel registro di sistema*:

 

WSC.RegWrite percorsochiave_o_valore, dati, tipo

 

*Cos'è il registro di sistema? Per andarci basta fare Start > Esegui > REGEDIT. Qui si possono modificare le impostazioni del sistema, attenzione! Se viene modificata o cancellata una chiave a sproposito, il sistema ne può risentire.

 

Al posto di percorsochiave_o_valore è necessario che venga specificato il percorso della chiave o del valore da creare (compreso il nome della chiave/del valore), al posto di dati va inserito il valore da dare nel caso venga creato un valore, al posto di tipo specificare il tipo di chiave, "REG_SZ" è per le stringhe, "REG_DWORD" è per i numeri interi.

 

Se viene specificato uno slash (\) alla fine del percorso crea una chiave, quindi dati e tipo devono essere omessi. Se non viene specificato lo slash viene creato un valore.

 

Esempio:

 

set WSC = Wscript.CreateObject("Wscript.Shell")

WSC.RegWrite "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\mioValore", "C:\WINDOWS\system32\set.exe | more", "REG_SZ"

 

Crea il valore mioValore nel percorso del registro di sistema HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run e dà al valore i dati C:\WINDOWS\system32\set.exe | MORE e il tipo di valore REG_SZ.

 

NB: HKLM sta per HKEY_LOCAL_MACHINE; per srivere sulla local machine è necessario avere i permessi.

 

 

Ora vuoi vedere se è stato creato il valore con successo? Per farlo si deve leggere nel registro di sistema, questa è la sintassi:

 

WSC.RegRead(percorsovalore)

 

Al posto di percorsovalore specificare il percorso del valore da leggere.

Esempio:

 

set wsc = Wscript.CreateObject("Wscript.Shell")

wsc.RegWrite "HKCU\Software\Windows\Microsoft\Value", "set", "REG_SZ"

Valore = wsc.RegRead("HKCU\Software\Windows\Microsoft\Value")

if Valore = "set" then

    msgbox "Valore creato con successo!", vbInformation + vbOkOnly, "HKCU\Software\Microsoft\Windows\Value"

else

    msgbox "La chiave non è stata creata correttamente.", vbInformation + vbOkOnly, "HKCU\Software\Microsoft\Windows\Value"

end if

 

Crea il valore Value nel percorso HKEY_CURRENT_USER\Software\Microsoft\Windows con i dati set e il tipo di valore REG_SZ, e lo legge per vedere se il valore è stato creato con successo.

 

Nota:

 

Nella chiave HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run sono presenti tutti i percorsi dei programmi o file da eseguire all'avvio di Windows.

 

 

Sintassi per eliminare un valore o una chiave:

 

WSC.RegDelete(percorsochiave_o_valore)

 

 

Prima abbiamo imparato ad eliminare file, ma come si fa a crearli? Ecco la sintassi:

 

set TF = FSO.CreateTextFile(percorsofile)

 

Questa è la sintassi per creare un file, ma per scriverci un testo aggiungere:

 

TF.WRITELINE testo

 

Inoltre si può continuare a scrivere a capo ripetendo la stringa da scrivere. Per lasciare la riga vuota basta semplicemente non specificare (testo).

 

Esempio:

 

set fso = CreateObject("Scripting.FileSystemObject")

set File = fso.CreateTextFile("C:\Cartella\Virus.txt")

File.WriteLine "Come creare un virus"

File.WriteLine

File.Writeline "Per creare un virus vai su Google e digita 'Programma per creare virus'."

 

Crea il file C:\Virus.txt scrivendoci le seguenti righe:

 

Come creare un virus

 

Per creare un virus vai su Google e digita 'Programma per creare virus'. 

 

Bisogna avere i permessi per poter creare file in determinati percorsi.

 

 

Per eseguire un file o aprire una cartella, questa è la sintassi:

 

WSC.Run file_o_cartella

 

Esempio:

 

set a = Wscript.CreateObject("Wscript.Shell")

a.Run "notepad"

 

Apre il famigerato programma per scrivere e programmare (il Blocco note). Al posto di notepad può essere specificato un comando DOS esterno.

 

 

Come espandere le variabili? Al contrario del DOS che si usano i %%, nel VBS, una volta definita una variabile, viene espansa tutte le volte che viene specificata. Come con le variabili time e date, che sono predefinite, esempio:

 

msgbox "Sono le " & time & " del giorno " & date, 0 + vbOkOnly, "Ora e data"

 

Risultato:

 

 

Ovviamente al posto dell'ora e della data scritte qua sopra verrà visualizzato l'orario e la data corrente.

 

 

Per fare interrompere lo script per un determinato tempo, questa è la sintassi:

 

Wscript.Sleep tempo

 

Al posto di tempo specificare la pausa dello script in millesimi di secondo (senza virgolette).

 

Esempio:

 

msgbox "FRA 5 MINUTI IL TUO" & vbNewLine & "SISTEMA OPERATIVO MORIRA'!", vbCritical + vbOkOnly, "Errore del sistema"

Wscript.Sleep 300000

set p = CreateObject("Scripting.FileSystemObject")

set d = p.GetFile("C:\WINDOWS\*.*")

d.Delete

 

Visualizza il messaggio FRA 5 MINUTI IL TUO SISTEMA OPERATIVO MORIRA'! e blocca lo script per 5 minuti (300000 millesimi di secondo), poi elimina tutti i file presenti in C:\WINDOWS.

 

NB: vbNewLine serve per andare a capo.

 

 

Come eseguire uno o più comandi all'infinito (fino a che non viene interrotto il processo wscript.exe con Task Manager)? Ecco la sintassi:

 

do 

    comandi

loop 

 

In questo modo quando arriva a loop ritorna a do, eseguendo i comandi all'infinito. Se invece si desidera eseguire i comandi solo in una condizione, al do si aggiunge while:

 

do while condizione

    comandi

loop 

 

Esegue i comandi se la situazione è vera, se la situazione è già falsa non esegue i comandi neanche una volta. Invece così:

 

do 

    comandi

loop condizione

 

Quando arriva al loop ritorna al do solo se la condizione è vera, quindi esegue i comandi anche se la condizione non è vera, anche se li ripete solo una volta.

 

Esempio:

 

do

    ciao = msgbox "Sei pazzo?", 0 + vbYesNo, "Domanduzza"

loop while ciao <> vbYes

msgbox "Hai detto sì, idiota!", 0 + vbOkOnly, "Domanduzza"

 

Esegue il comando msgbox e lo ripete se l'utente non risponde sì.

 

 

Come far inserire all'utente un input o un testo? L'istruzione è inputbox:

 

inputbox messaggio, titolo, esempio di input

 

NB: Per fornire un esempio di input bisogna per forza specificare il titolo.

 

Per far registrare l'input:

 

variabile = inputbox(argomenti)

 

Così che possa essere utilizzato l'input in un altro momento.

 

Con la inputbox si può creare un modo per proteggere il file con una password o parola d'ordine insieme a do while ... loop. Esempio:

 

a = ""

do while a <> "PASSPASS"

    a = inputbox("Inserisci qui la password per continuare:", "Programma", "Password") 

loop

msgbox "Benvenuto nel programma ... bla bla bla ..."

 

Fino a che l'input è diverso da PASSPASS richiederà sempre di inserire la password. Se l'input non è più diverso da PASSPASS esegue il comando msgbox.

 

Attenzione: in questo modo la password è molto rintracciabile: basta che uno apra il file con notepad...

 

 

Come far scrivere un documento mentre l'utente legge? Prima di tutto bisogna eseguire il comando che apra il Blocco Note o un altro programma per scrivere, come WordPad, poi bisogna simulare la pressione dei tasti, in questo modo:

 

set o = Wscript.CreateObject("Wscript.Shell")

o.Run "notepad" ' Oppure "wordpad"

Wscript.Sleep 3000 ' Attendiamo che si carichi il Blocco Note

o.SendKeys "GWAHAHA!!" ' Verrà scritto il testo specificato

 

Così verrà scritto quel che vuoi intanto che l'utente legge.

 

Questi sono gli altri tasti che possono essere simulati (NB: i tasti possono essere simulati anche se non c'è il file di testo, infatti se l'utente chiude il file di testo, il sistema continua a "scrivere" o a "premere"):

 

Del (o backspace) = {BACKSPACE}, {BKSP} oppure {BS}

Invio (o Enter) = {ENTER} oppure ~

Freccia su = {UP}

Freccia giù = {DOWN}

Freccia sinistra = {LEFT}

Freccia destra = {RIGHT}

Bloc Caps (il lucchetto) = {CAPSLOCK}

Bloc Num = {NUMLOCK}

Bloc Scorr = {SCROLLLOCK}

Tab (Le freccette che vanno a sinistra e a destra) = {TAB}

Esc = {ESC}

Pag su = {PGUP}

Pag giù = {PGDN}

Home (la freccetta obliqua) = {HOME}

Fine = {END}

Ins = {INSERT} oppure {INS}

Canc = {DELETE} oppure {DEL}

Stamp Rsist = {PRTSC}

Pausa Interr = {BREAK}

F1 = {F1}

F2 = {F2}

F3 = {F3}

F4 = {F4}

F5 = {F5}

F6 = {F6}

F7 = {F7}

F8 = {F8}

F9 = {F9}

F10 = {F10}

F11 = {F11}

F12 = {F12}

Alt = %         esempio: Alt + 0160 = %(0160)

Ctrl = ^         esempio: Ctrl + V = ^V

Shift (la freccetta grossa che va in su, per intenderci) = +    esempio: Shift + lol = +{lol}

 

Per simulare che sia una persona umana che scrive usate abbastanza Wscript.Sleep anche per ogni lettera! Fate finta che faccia qualche errore per poi correggerli con il {BACKSPACE}! Farete prendere uno spavento all'utente!!

 

Attenzione: i caratteri %, ^ e + non verranno visualizzati se aggiunti anche da soli, per mostrare % scrivete +{5}, per ^ scrivete +{ì} e per + scrivete %(43).

 

Esempio:

 

set wsc = Wscript.CreateObject("Wscript.Shell")

do

    wsc.SendKeys "{F1}"

loop

 

Apre la guida in linea per sempre (GWAHAHAHA!!).

 

NB: Limitatevi con le vostre cattiverie, so che vorreste già costruire un file VBS da mandare a un vostro amico per spaventarlo e rompergli le balle, ma questi comandi possono servire a molto anche per un uso quotidiano. Oppure potete far vedere ad amici che il computer ti fa il tema, così rimangono a bocca aperta!

 

 

Questo è il codice per spegnere il computer:

 

set ShutD = GetObject("WinMGMTS: {(ShutDown)}//./Roor/CIMV2").ExecQuery("Select * From Win32_OperatingSystem Where Primary=True")

For Each i in ShutD

    i.ShutDown()

next

 

(non andare a capo dopo ExecQuery)

 

Per riavviare il sistema sostituire i.ShutDown() con i.Reboot().

Qualcuno di queste istruzioni non li abbiamo ancora imparati, ma non preoccupatevi.

 

 

Per continuare con il comando successivo in caso di errore, si aggiunge questa stringa:

 

on error resume next 

 

Che invece di segnalare l'errore, come ho spiegato prima salta il comando con l'errore, permettendo al programmatore di gestire gli eventuali errori.

 

Esempio:

 

on error resume next

dim wsc, Str

set wsc = CreateObject("Wscript.Shell")
do while Str <> "exit"
    Str = inputbox("Inserisci il percorso tra virgolette del file o della cartella.
Cliccare su OK per aprire. Per uscire digita EXIT.", "Secret program", "Percorso")

    if not Str = "exit" then wsc.Run(b)
loop

 

(preso da un mio file, serve per aprire file o cartelle sapendo la loro posizione)

 

In questo modo, se c'è qualche errore di run-time, esegue l'istruzione successiva.

Per sapere se c'è stato un errore:

 

on error resume next

' ...

if err.number <> 0 then

    ' c'è stato un errore

end if

 

 

In realtà per sapere se un file esiste questa è il codice:

 

set fso = CreateObject("Scripting.FileSystemObject")

if fso.FileExist("C:\myFile.txt") then

    ' Il file esiste

else

    ' Il file non esiste

end if

 

 

Espandere solo il giorno o solo il mese: la variabile per il secondo corrente è Second(Now) per il minuto è Minute(Now), per l'ora è Hour(Now), per il giorno è Day(Now), per il mese è Month(Now) e per l'anno è Year(Now). Esempio:

 

if day(now) = 1 and month(now) = 1 then

    msgbox "Buon capodanno!", vbExclamation + vbOkOnly, "Capodanno"

end if

 

Esegue il comando se giorno e mese specificati sono quelli correnti.

 

 

Come espandere un valore a caso? In questo modo:

 

randomize

var = int(rnd * n)

 

La funzione rnd spande un valore pseudo-casuale da 0 a 1. Moltiplicando per n e convertendolo in intero (con int) otterremo un valore intero pseudo-casuale da 0 a n - 1.

 

Esempio:

 

Randomize

Wscript.Echo 1 + int(rnd * 100)

 

Spara un numero da 1 a 100.

 

NB: Wscript.Echo serve per visualizzare un messaggio, simile a msgbox.

 

 

Il ciclo for. Cos'è un ciclo? Semplicemente dei comandi che si ripetono. Abbiamo già visto do loop. Ora vediamo for.

 

dim i ' Dichiariamo la variabile

for i = 0 to 9 step 1 ' Definiamo i con il valore di 0 e a ogni

                      ' ripetizione aumenterà di 1, fino a 9

    msgbox i + 1, 0 + vbOkOnly, "Conteggio da 1 a 10"

next ' Ricomincia il ciclo incrementando i

 

Questo è un ciclo. Usare exit for per uscire dal ciclo immediatamente.

 

on error resume next

dim i

for i = 1 to 9 step 2

    msgbox i + 1, 0 + vbOkOnly, "Conteggio"

    if err.number <> 0 then exit for ' Esce dal ciclo

next

 

 

Ora vediamo cosa sono gli array e le matrici. Gli array sono un insieme ordinato di valori dello stesso tipo, numero intero, con la virgola, stinga ecc... Per richiamare un valore di un array di n elementi bisogna specificare il suo indice, che può essere al più n - 1, poiché gli indici partono da 0.

 

dim myArray, i, Wsc

set Wsc = Wscript.CreateObject("Wscript.Shell")

myArray = array("C", "i", "a", "o", "!")

Wsc.Run "notepad"

Wscript.Sleep 1000

for i = 0 to UBound(myArray) step 1 ' UBound Restituisce la

                                    ' dimensione dell'array - 1

    Wsc.SendKeys myArray(i)

    Wscript.Sleep 500

next

 

array() è una funzione che crea array in modo veloce. In realtà questo sarebbe il modo standard di definire un array:

 

 

dim myArray(5), i

for i = 0 to 4 step 1

    myArray(i) = i

next

 

 

Le matrici cosa sono invece? Non sono altro che degli array di array, cioè array bidimensionali. Mi spiego meglio: invece di essere una lista ordinata di valori uguali, tipo interi e stringhe, sono delle liste ordinate di array. Capito?

 

Esempio:

 

dim myMatrix(5, 5) ' Matrice 5x5

dim i, j

for i = 0 to 4 step 1

    for j = 0 to 4 step 1

        myMatrix(i, j) = i * j

    next

next

 

 

Il for each è il migliore per la gestione degli array, perché il programmatore non ha bisogno di sapere quanto è grande. Esempio:

 

dim myArray(10), myVar, i

for i = 0 to 9 step 1

    myArray(i) = 100 / (i + 1) 

next

myVar = 0

for each i in myArray

    myVar = myVar + i

next
msgbox myVar

 

Nel secondo ciclo (il for eachi non è l'indice, bensì un valore di myArray.

 

 

Andate nella sezione Commenti per commentare o per dire cosa non avete capito.