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 | |
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 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 | Sì |
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:
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