Introduzione al Windows Scripting Host (2)


Home Page | Comments | Articles | Faq | Documents | Search | Archive | Tales from the Machine Room | Contribute
A cura di Davide Bianchi Questo e' il secondo di una serie di articoli, lo scopo e' sviscerare l'utilizzo del Windows Scripting Host, cosa e' ed a cosa serve.

Vai al primo della serie

Breve riassunto delle puntate precedenti

Nell'articolo precedente abbiamo visto come e perche' si e' arrivati alla definizione di un (veramente due) linguaggio di Scripting per Windows, perche' questo linguaggio sia importante ed a che cosa serva.

In questo articolo vedremo come mettere giu' effettivamente qualche script e come gli script vengono gestiti.

Attenzione:
Per testare gli script occorre avere installato sul sistema il Windows Scripting Host,. Per verificare se il WSH e' installato sul vostro sistema create in una qualunque directory della vostra macchina un file con estensione VBS, se viene visualizzato con una icona "strana", avete il WSH correttamente installato.

Due linguaggi per uno script

Quando alla Microsoft si misero a lavorare al WSH si trovarono di fronte un piccolo problema: l'intenzione iniziale era di "spogliare" Visual Basic di tutti i fronzoli grafici e lasciare il solo motore nudo e crudo, quindi di implementare a tutti gli effetti un interprete di codice Visual Basic privo delle capacita' grafiche e di interfaccia di quest'ultimo, nello stesso tempo pero', stavano lavorando al motore JavaScript di Internet Explorer, che era gia' un interprete nudo e crudo.

Quello che ci troviamo attualmente e' un prodotto che e' in grado di gestirli entrambi, in sostanza possiamo scegliere se utilizzare un linguaggio simile a Visual Basic o preferiamo qualche cosa di piu' simile al Java per definire i nostri script.

Quali differenze ci sono? Effettivamente poche, per lo piu' sono differenze estetiche:

  • JavaScript (o JScript) e' case-sensitive, quindi maiuscolo e minuscolo fanno differenza, VBScript no
  • Le istruzioni JScript devono essere concluse con ; (non necessariamente pero'), quelle VBScript no.
  • Le variabili JScript si dichiarano con var, quelle VBScript con Dim
  • Gli "oggetti" in JScript si creano usando new ActiveXObject(), in VBScript si utilizza CreateObject()
  • In JScript esistono solo "funzioni" che possono tornare o no un valore, in VBScript abbiamo la separazione tra Function che ritornano valori e Sub che non lo fanno.
A parte queste differenze il "succo" non cambia di molto. Sta' a voi scegliere se usare uno o l'altro.

Nel corso di questi articoli si utilizzeranno entrambi i linguaggi.

La struttura di uno script

Uno Script e' composto da un file ASCII, quindi realizzato con un qualunque editor che sia in grado di produrre un file (anche il buon vecchio Blocco Notes di Windows va' benissimo), con estensione .VBS o .JS a seconda che si stia usando VBScript o JScript, che contenga dei comandi VBScript o JScript validi. Niente di piu'.

Per eseguire uno script (oltre ad aver installato il "motore") non dobbiamo fare altro che fare doppio click sull'icona dello script stesso. Il "motore" si occupera' di leggere lo script ed eseguirlo.

Attenzione: all'interno dello script non c'e' niente che specifichi se lo script deve essere interpretato come VBScript o JScript, solo l'estensione del file lo identifica, quindi se mettiamo dei comandi VBScript dentro un file con estensione .JS il "motore" ci segnalera' un sacco di errori anche se i comandi sono sintatticamente corretti.

Il WSH inizia ad interpretare lo script dalla prima linea di codice che trova che non sia dentro una funzione o procedura, e procede una linea alla volta all'interno dello script fino ad arrivare in fondo. A questo punto si interrompe.

Non c'e' nessun bisogno quindi di funzioni o procedure particolari che siano eseguite, il WSH non cerca ne' "main" ne' altro. Semplicemente cerca una istruzione eseguibile.

In tutti i linguaggi di programmazione si comincia scrivendo un programmino che scrive "Ciao Mondo", noi non facciamo differenza. Il programmino in questione e' il seguente:


MsgBox "Ciao Mondo"
Scriviamo questa semplicissima riga dentro un file, chiamiamo questo file ciao.vbs ed eseguiamolo facendoci sopra doppio click. Il risultato sara' la comparsa di una finestrella con sopra scritto "Ciao Mondo", esattamente come atteso.

Abbiamo appena imparato come visualizzare un messaggio in VBScript.

Messaggi e richieste

Il passo successivo, di solito, e' quello di richiedere il nome dell'utente e di visualizzare un messaggio che dice "sei uno scemo". Per realizzare questa meraviglia della tecnologia moderna abbiamo bisogno di domandare qualche cosa all'utente e di memorizzare quello che l'utente ci dice da qualche parte.

Per fare domande all'utente abbiamo la funzione InputBox, mentre per memorizzare i dati abbiamo le variabili.

Le variabili in VBScript si dichiarano con l'istruzione Dim, tutte le variabili di Script sono di tipo variant, cioe' sono prive di un tipo fisso e possono essere convertite da un tipo all'altro senza problemi. Nella stessa variabile possiamo memorizzare stringhe, caratteri, numeri ed altro senza preoccuparci troppo.

Lo script completo che esegue la nostra operazione e' il seguente:


Dim nomeUtente

nomeUtente = InputBox("Immettere il proprio nome")
MsgBox nomeUtente & " sei uno scemo"
La linea bianca tra il Dim ed il resto e' solo per staccare le due parti e rendere piu' comprensibile il codice.

A questo punto possiamo fare qualche considerazione "generale":

  • Le variabili devono essere dichiarate prima di usarle
  • Ogni comando o istruzione deve stare su una linea a se' stante
  • Le linee bianche e gli spazi in eccesso sono ignorati
  • Le funzioni (che ritornano un valore) richiedono le parentesi ()
  • Le procedure (che non ritornano valori) non richiedono parentesi

Nel nostro esempietto di poc'anzi, InputBox e' una funzione ed e' seguita da un parametro tra parentesi (perche e' una funzione), la MsgBox e' una procedura che non ritorna nessun valore, ed il suo parametro (il testo da visualizzare) e' indicato senza nessuna parentesi.

Eseguire dei calcoli

I calcoli di solito si fanno su delle variabili, qui' occorre fare un po' di attenzione perche', come detto prima, le variabili sono tutte variant, quindi il WSH scegliera' il tipo della variabile in funzione di quello che gli fa piu' comodo.

Questo potrebbe portare ad alcuni problemi quando abbiamo a che fare con numeri interi e numeri decimali, in quanto il WSH potrebbe decidere che tutti i numeri sono interi e perdersi per la strada un po' di decimali. Se e' il caso e' opportuno "forzare" WSH a considerare i numeri decimali indicandoli sempre con il punto decimale anche se sono interi (1.0 invece di 1).

WSH implementa tutti i normali calcoli matematici (+ - * /) piu' le principali funzioni SIN, COS, ATN, LOG, SQRT (SQuare RooT = Radice quadrata), conversione in valore assoluto (ABS) e le funzioni di conversione tra i vari numeri: INT per convertire un numero in intero, Round per arrotondarlo.

Cicli e controlli

Fino ad ora abbiamo visto come il WSH esegua le istruzioni una dopo l'altra, ovviamente non sempre vogliamo che lui esegua le cose in sequenza, di tanto in tanto ci occorre che vengano eseguiti dei cicli o che vengano valutate delle condizioni ed in base a questo si faccia qualche cosa.

WSH implementa tutti i principali meccanismi di controllo dell'esecuzione:

  • If condizione Then istruzioni [Else istruzioni ] End If
    Consente di verificare una condizione e di eseguire un gruppo di operazioni piuttosto che un altro gruppo. La clausola If puo' essere nidificata fino ad un massimo di 32 If una dentro l'altra.
  • Do....Loop Until condizione
    Questo tipo di ciclo verifica la condizione di ripetizione al termine delle operazioni, quindi il "corpo" del ciclo viene eseguito almeno una volta.
  • Do While condizione ... Loop
    Questo tipo di ciclo verifica la condizione di ripetizione prima delle operazioni, quindi il "corpo" del ciclo puo' non essere mai eseguito.
  • For variabile = valore_iniziale To valore_finale Step incremento ... Next
    Questo tipo di ciclo incrementa una variabile ad ogni ciclo, fino a che la variabile non raggiunge un certo valore. Ottimo quando si sa in anticipo quante volte occorre eseguire il ciclo.
Come esempio vediamo questo semplice programmino che richiede un nome di almeno 10 caratteri e poi inverte il testo:

Dim frase
Dim lettera
Dim contatore
Dim fraseInversa

Do
  frase = InputBox("Immettere una frase di almeno 10 caratteri")
Loop Until Len( frase ) > 10

fraseInversa = ""
For contatore = Len( frase ) To 1 Step -1
  lettera = Mid( frase, contatore, 1 )
  fraseInversa = fraseInversa & lettera
Next

MsgBox fraseInversa

Funzioni e procedure

WSH consente di creare Funzioni e Procedure, queste permettono di strutturare uno script in modo molto sofisticato, e di riutilizzare parti di uno script in altri script con molta facilita'.

La differenza fondamentale tra una Funzione ed una Procedura e' che la prima ritorna un valore, mentre la seconda no.

Per definire una Procedura si utilizzano le istruzioni:


Sub nome_procedura( [ variabile [, variabile ] )

  corpo della procedura...
  
End Sub

In cui nome_procedura e' un nome univoco che identifica la procedura stessa.

Per "richiamare" la procedura basta indicare nome_procedura nel corpo dello script, il WSH richiamera' la procedura stessa. se necessario occorre aggiungere al nome i parametri necessari.

Per esempio, MsgBox e' una procedura, nei nostri esempi abbiamo sempre usato per richiamarla MsgBox messaggio, in cui messaggio rappresenta il parametro da inviare alla procedura stessa.

Per definire una Funzione si utilizza:


Function nome_funzione( [ variabile [, variabile ] )

  corpo della funzione...
  nome_funzione = valore_di_ritorno
  
End Function
L'istruzione nome_funzione = valore_di_ritorno ci permette di ritornare un valore con la funzione stessa.

Per richiamare una funzione si utilizza


variabile = nome_funzione( [parametro [, parametro...] )
La differenza fondamentale e' l'uso delle parentesi per i parametri. Nel nostro esempio di prima InputBox e' una funzione. Il richiamo della stessa avviene mediante

frase = InputBox("Immettere una frase di almeno 10 caratteri")
Dove "Immettere ..." e' il parametro della funzione (il testo da visualizzare), mentre frase e' la variabile che viene "caricata" con il risultato della funzione stessa.

Come esempio rivediamo lo stesso programmino di prima ma fatto mediante una funzione:


Dim frase

frase = ""
Do
  frase = InputBox("Immettere una frase di almeno 10 caratteri")
Loop Until Len( frase ) > 10

MsgBox InvertiFrase( frase )

Function InvertiFrase( frase )

  Dim lettera
  Dim contatore
  Dim fraseInversa

  For contatore = Len( frase ) To 1 Step -1
  
    lettera = Mid( frase, contatore, 1 )
    fraseInversa = fraseInversa & lettera
    
  Next

  InvertiFrase = fraseInversa  

End Function


Comments

Max length of comments: 1000 chars.

3 commenti

Mattia dice il 03/04/2008 20:25:
Grazie, guida molto istruttiva ma non mi è chiara una cosa: questo linguaggio è appunto il "succo" del visual basic. Quindi se per "programmare" funzioni uso il linguaggio visual basic normale funziona lo stesso?

Il WSH era utile sulle vecchie versioni di Windows (95/98), non so se in seguito e' stato mantenuto, espanso o semplicemente abbandonato. Dovrai domandare a Microsoft ;-)


Razziatore dice il 26/05/2008 04:28:
Uhm... guida bella conoscevo già il WSH ( mai fatto niente ma lo conoscevo ).. ma una domanda...non avevi detto che ci sarebbero stati alcuni esempi in JS?

L'idea c'era, solo che come al solito Microsoft ha rigirato il tutto e sostanzialmente il WHS e' "uscito di scena"... Non che sia difficile la conversione, la mia era solo una curiosità... se era previsiti e non li hai messi o se sono previste altre puntate ( e non le hai messe )


samu dice il 29/05/2008 15:15:
Ciao
comodo lo scripting, ti automatizza alcune procedure che altrimenti dovresti fare a manina... esempio inserimento in active directory di un sacco di utenti...
ne ho finito uno (oddio, mi manca tutta la parte di controllo errori da parte di utente/script), ma è funzionante... tra qualche gg dovrei testarlo appieno (o meglio, un collega)
crea utenti in active directory partendo da un file excel, settando l'account con i valori immessi (scadenza password, home dir, gruppi, etc etc), crea la cartella coi relativi privilegi e la condivide... comodo e veloce :)

Add a comment (max 1000 chars)

Comment from:
Comment:


Author Davide Bianchi, works as Unix/Linux administrator for a "network security" company of Haarlem.
Contacts: mail: davide AT onlyforfun.net , ICQ: 268751033, Jabber: davideyeahsure AT gmail.com Skype: davideyahsure

Contribuire Volete contribuire? Leggete come!

Copyright This site is made by me with blood, sweat and gunpowder, if you want to republish or redistribute any part of it, please drop me (or the author of the article if is not me) a mail.

This site was composed with VIM, now is composed with VIM and the (in)famous CMS FdT.

This site isn't optimized for vision with any specific browser, nor it requires special fonts or resolution.
You're free to see it as you wish.
Web Interoperability Pleadge is this a valid html document?

Last Update: 04/12/2008