Salve, Scripting Guy!Attenzione a quello che dici

I Microsoft Scripting Guy

DURANTE LA GUERRA CIVILE AMERICANA (per precisione nella battaglia di Spotsylvania), il generale dell'Unione John Sedgwick rimase costernato nello scoprire i suoi uomini rannicchiati di fronte allo sporadico fuoco casuale sparato verso di loro dai cecchini confederati. Secondo la leggenda, Sedgwick disse agli uomini: "Mi vergogno di voi, che cercate di schivare il fuoco in questo modo. A questa distanza, non colpirebbero un elefante". Poco dopo, Sedgwick fu il primo ufficiale di alto rango dell'Unione ad essere ucciso nella guerra. Forse i cecchini confederati non avrebbero potuto colpire un elefante a quella distanza ma, purtroppo per Sedgwick, potevano colpire un generale.

Ovviamente, non c'è bisogno di dire che la morale della storia è, grazie per il suggerimento, "Tieni giù la testa se qualcuno ti sta sparando". Una morale valida, no? Peccato non averci pensato prima. Noi avevamo pensato a un'altra: "Fai attenzione a quello che dici, perché un giorno potrebbe ritorcersi contro di te". È quello che è accaduto al generale John Sedgwick e anche a molte altre persone. Ad esempio, nessuno ricorda tra i maggiori imprenditori della storia americana Thomas Watson, benché abbia guidato a lungo l'IBM. Al contrario, Watson è passato alla storia per le parole "Penso che in tutto il mondo vi sia mercato forse per cinque computer".

È piuttosto interessante il fatto che non vi siano prove che Watson le abbia pronunciate; forse aveva solo citato il parere di qualcun altro sulla questione. Ma a chi importa? Dopo tutto, l'idea che il capo dell'IBM possa aver detto che non esisteva un mercato per i computer costituisce un aneddoto talmente curioso che non possiamo permettere che sia oscurato da stupidaggini come la realtà dei fatti, no?

Per inciso, Watson disse effettivamente "Se vuoi avere successo, raddoppia la percentuale di errori". È un consiglio che gli Scripting Guys sottoscrivono pienamente,

almeno per la parte relativa al raddoppio della percentuale di errori.

Ed ecco un'altra citazione: "Se scrivi script VBScript non hai accesso a .NET Framework." Bisogna riconoscere che dire alla gente che Microsoft® .NET Framework non è accessibile agli autori di script non è memorabile come "A questa distanza non colpirebbero un elefante" o "Penso che in tutto il mondo vi sia mercato forse per cinque computer". Tuttavia, è un'affermazione altrettanto fondamentale. È vero che .NET Framework è stato progettato pensando a sviluppatori C# e Visual Basic® ed è vero che VBScript non può creare istanze di classi .NET Framework native, ma ciò non implica che .NET Framework sia inaccessibile agli autori di script, almeno in parte.

Hai ragione: non possiamo negare che la maggior parte delle classi .NET Framework restino estranee a VBScript. Tuttavia, esiste un numero ragionevolmente grande di classi .NET con wrapper richiamabili con COM, che significa semplicemente tali classi prevedono un'interfaccia COM che consente di accedervi da un linguaggio di script come VBScript. Difficile da credere? Allora dai un'occhiata alla parte HKEY_CLASSES_ROOT del tuo registro, riportata nella Figura 1; dovresti individuare tutti i tipi di classi che iniziano con System.

Figura 1 Classi di sistema nel registro

Figura 1** Classi di sistema nel registro **(Fare clic sull'immagine per ingrandirla)

In maggioranza sono classi .NET ed è possibile creare l'istanza di quasi tutte con VBScript.

Te l'avevamo detto!

Ovviamente, come può testimoniare chiunque abbia acquistato un prodotto pubblicizzato di notte in tv, il fatto che puoi fare qualcosa non significa che devi farla (di solito, c'è un motivo per cui quegli articoli non sono presenti nei negozi). È vero che puoi creare un'istanza della classe System.ContextMarshalException in uno script, ma non capiamo proprio perché dovresti farlo e cose te ne faresti.

Non è vero però per tutte le classi .NET Framework. Ad esempio, uno dei più temuti spauracchi del mondo degli script è il fatto che non esiste un modo facile per ordinare un elenco di voci. Per mettere un elenco in ordine alfabetico, occorre usare un set di record non connesso oppure creare da soli una complicatissima funzione Sort, come il seguente codice Sort a bolla (chi ha lo stomaco delicato salti il prossimo paragrafo):

For i = (UBound(arrNames) - 1) to 0 Step -1
    For j= 0 to i
        If UCase(arrNames(j)) > 
          UCase(arrNames(j+1)) Then
            strHolder = arrNames(j+1)
            arrNames(j+1) = arrNames(j)
            arrNames(j) = strHolder
        End If
    Next
Next

Non deprimerti: il codice lo abbiamo scritto noi e non siamo neanche tanto sicuri di quello che significa.

Allora come può .NET Framework aiutarci in situazioni simili? Per rispondere, diamo un'occhiata a uno script semplicissimo ed estremamente lineare:

Set DataList = CreateObject _
      ("System.Collections.ArrayList")

DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"

DataList.Sort()

For Each strItem in DataList
    Wscript.Echo strItem
Next

Come puoi vedere, in questo caso stiamo creando un'istanza della classe .NET Framework System.Collections.ArrayList. Usiamo quindi il metodo Add per aggiungere cinque voci all'elenco. Va tutto a gonfie vele, tranne per un particolare: abbiamo aggiunto le voci in modo abbastanza casuale (B, C, E, D, A), ma dobbiamo visualizzarle in ordine alfabetico (A, B, C, D, E). È il momento di ricorrere al codice Sort a bolla, giusto?

Sbagliato (scusa la schiettezza, ma se è sbagliato, è sbagliato). È evidente che non dobbiamo ricorrere al codice Sort a bolla; ci serve solo richiamare il metodo Sort dell'elenco di matrici:

DataList.Sort()

è tutto. Con quell'unica riga di codice possiamo ordinare tutte le voci del nostro elenco di matrici.

Dimostrarlo? Ehi, non ti accontenti mai! Va bene, ci aspettavamo qualche San Tommaso tra i nostri interlocutori. Dato che lo script comprende un ciclo For Each, esegue il ciclo di tutte le voci presenti nell'elenco, restituendo il valore di ciascuno sullo schermo.

For Each strItem in DataList
    Wscript.Echo strItem
Next

Rispondi ora a questa domanda: cosa otteniamo eseguendo questo script?

Indovinato:

A
B
C
D
E

bello, no?

Hmmm, qualcuno probabilmente non sarà ancora soddisfatto. Tutto è perfetto, ma quello che volevi davvero è ottenere i valori in ordine decrescente, vale a dire un elenco dalla Z alla A e non viceversa. Se non ci riesci, bene. . .

Nessun problema. Dovevi solo chiedere:

Set DataList = CreateObject _
      ("System.Collections.ArrayList")

DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"

DataList.Sort()
DataList.Reverse()

For Each strItem in DataList
    Wscript.Echo strItem
Next

Hai ragione: sembra un compito tremendo proprio come lo script appena visto, no? Eppure c'è un elemento importante in più. Dai uno sguardo all'unica riga di codice che abbiamo aggiunto e che segue direttamente il metodo dell'ordinamento.

DataList.Reverse()

Vedi? Dopo l'ordinamento crescente dell'elenco, abbiamo battezzato il metodo inverso che, guarda un po', ha invertito l'ordine di tutte le voci della matrice. Cosa ci dà? Un risultato simile a questo:

E
D
C
B
A

difficile non restare colpiti, vero?

Ma un attimo! Si può fare di meglio. Hai provato a eliminare una voce da una matrice VBScript? Non piangere, non te lo chiederemo. Ti mostreremo invece com'è facile eliminare una voce dal nostro elenco di matrici .NET Framework. Non ti piace la lettera D? Toglila. Ecco uno script che crea un elenco di matrici, lo ordina e quindi elimina l'inserimento relativo alla D:

Set DataList = CreateObject _
  ("System.Collections.ArrayList")

DataList.Add "B"
DataList.Add "C"
DataList.Add "E"
DataList.Add "D"
DataList.Add "A"

DataList.Sort()
DataList.Remove("D")

For Each strItem in DataList
    Wscript.Echo strItem
Next

ancora una volta, devi esaminare la piccola riga di codice che segue immediatamente il metodo Sort:

DataList.Remove("D")

Qui abbiamo utilizzato il metodo Remove per eliminare la voce che corrisponde a D ed ecco cosa risulta se eseguiamo lo script:

A
B
C
E

Addio, D!

E non lasciarti sfuggire il meglio: possiamo eliminare una voce senza dover ridimensionare la matrice. È fantastico. Ovviamente, avremmo potuto anche aggiungere voci alla matrice senza dover ridimensionare tutto. Prova a dire che non rende più facile la tua vita da script.

Che tu ci creda o no, abbiamo appena raschiato la superficie delle possibilità offerte dall'elenco di matrici .NET Framework (per ulteriori informazioni, consulta la voce relativa all'elenco di matrici in .NET Framework SDK).

L'elenco di matrici è utile per gli autori di script? Mettiamola così: dopo aver visto l'elenco di matrici .NET Framework, non capiamo perché dovresti usare sempre la matrice VBScript integrata, almeno per elenchi di voci semplici come quelli che abbiamo usato in questo caso.

Bisogna riconoscere che noi Scripting Guy non abbiamo esaminato a sufficienza .NET Framework per individuare le classi che sono (o non sono) eventualmente utili per gli autori di script. Ci stiamo lavorando. Nel frattempo, sei libero di rovistare dappertutto in .NET Framework SDK. Ogni volta che esploriamo SDK troviamo qualcosa di nuovo ed interessante, utile per gli autori di script.

Un esempio? La generazione di numeri casuali. Vuoi generare un numero a caso tra 1 e 100 con il generatore di numeri casuali VBScript? Facile: basta usare un codice di questo genere:

Randomize
Wscript.Echo Int((100 - 1 + 1) * Rnd + 1)

Memorizzato la formula? Altrimenti, non preoccuparti, è molto più facile e intuitivo usare la classe .NET Framework System.Random:

Set objRandom = CreateObject("System.Random")
Wscript.Echo objRandom.Next_2(1,100)

È più probabile che tu possa calcolarlo senza spiegazioni. Inoltre, te ne forniremo una, anche solo perché TechNet Magazine ha l'idea fissa di imporre agli autori di articoli di scrivere qualcosa tutti i mesi (chissà perché, ma è la loro politica non la nostra).

Come vedi, creiamo un'istanza della classe System.Random e quindi richiamiamo il metodo Next_2, trasferendo due parametri di metodo:

  • 1, il primo numero della serie (ricorda che vogliamo generare un numero a caso tra 1 e 100).
  • 100, il numero massimo della serie.

Ecco fatto.

Forse abbiamo tempo per un'ultima domanda. Tu, con la maglia verde. Chi era che diceva che gli autori di script non hanno accesso a .NET Framework? A essere sinceri, siamo stati noi.... Sembra che non ci sia più tempo, dopo tutto. Al prossimo mese!

Un bel periodo davvero.

Sta arrivando febbraio, che vuol dire una sola cosa. No, non San Valentino. Neanche il Giorno del Presidente. Cosa, la Giornata delle marmotte? No, più ci avviciniamo a febbraio e più ci avviciniamo ai Giochi invernali di scripting 2007, la più importante (o forse l'unica) competizione internazionale di scripting. I Giochi di quest'anno si annunciano più magnifici che mai. Questa edizione prevede quattro suddivisioni:

  • VBScript principianti
  • VBScript avanzati
  • Windows PowerShell™ principianti
  • Windows PowerShell avanzati

Consulta l' home page sui Giochi invernali di scripting 2007 per ottenere maggiori informazioni.

Cosa? Oh, grazie. Buona giornata delle marmotte anche a te.

Scarica subito Windows PowerShell

Il download di Windows PowerShell 1.0 è ora disponibile. E poi è gratis! Come puoi perdere questa occasione? Scarica il software e inizia a usarlo subito.

I Microsoft Scripting Guy lavorano o, per meglio dire, sono stipendiati da Microsoft. Quando non si dedicano al baseball (o a varie altre attività) da giocatori, allenatori o semplici spettatori gestiscono il TechNet Script Center. Consultalo alla pagina www.scriptingguys.com.

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.