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 in maniera semplice e 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
Simbolo critico
vbQuestion 32
Simbolo domanda
vbExclamation 48
Simbolo esclamazione
vbInformation 64
Simbolo informazione

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:

Esempio msgbox

Bisogna scrivere:

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

oppure:

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

In questo caso si possono sommare i due valori:

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

Come in tutti i linguaggi di programmazione, 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"

È 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

Che significa:

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.

 

È 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 letteralmente 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

Che è 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 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 o qualunque altra applicazione.

 

Al contrario del DOS nel quale si usano i %% per espandere le variabili, nel VBS il valore di una variabile viene valutata ogni volta che si trova in una qualunque espressione. Con le variabili time e date, che sono predefinite, possiamo per esempio scrivere:

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

Risultato:

Esempio data e ora

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 finché è verificata 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 volete mentre 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 scatole, ma questi comandi possono servire a molto anche per un uso quotidiano.

 

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

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

Alcune di queste istruzioni non le abbiamo ancora imparate, 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

(rispolverato da un vecchio 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 esiste una funzione apposita:

set fso = CreateObject("Scripting.FileSystemObject")
if fso.FileExist("C:\myFile.txt") then
    ' Il file esiste
else
    ' Il file non esiste
end if

Per conoscere il giorno o il mese: la variabile per il secondo corrente è è data da 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 generare un valore a caso? In questo modo:

randomize
var = int(rnd * n)

La funzione rnd restituisce 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, direttamente con un esempio.

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 dello stesso tipo, come interi e stringhe, sono delle liste ordinate di array.

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 sono grandi. 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 each), i non è l'indice, bensì un valore di myArray.

 

Commentate qui sotto se non avete capito qualcosa.

Commenti

Supportando i contenuti che secondo te sono rilevanti, anche solo lasciando un commento, contribuirai a dare a questi contenuti maggiore visibilità e a rendere internet un posto più gradevole, affinché le stesse informazioni che hai trovato utili possano essere accessibili anche ad altre persone. Grazie per l'attenzione.