Hé, le scripteur !Attention à ce que tu dis

Les scripteurs Microsoft

Pendant la Guerre de Sécession (au cours de la bataille de Spotsylvania, pour être précis), le général nordiste John Sedgwick fut consterné par le spectacle de ses hommes se jetant à terre au moindre coup de feu tiré dans leur direction par les tireurs confédérés embusqués. Selon la légende, Sedgwick dit à ses hommes : « Vous me faites honte, à vous coucher ainsi. Ils n'atteindraient même pas un éléphant à cette distance ». Quelques instants plus tard, Sedgwick devenait l'officier nordiste mort au combat le plus gradé. Peut-être les tireurs confédérés ne pouvaient-ils pas atteindre un éléphant à cette distance, mais, pour le malheur de Sedgwick, ils pouvaient atteindre un général.

Bien sûr, il va sans dire que la morale de cette histoire est... en fait, maintenant qu'on en parle, « Couchez-vous si on vous tire dessus » ferait une assez bonne morale, vous ne pensez pas ? Dommage qu'on n'y ait pas pensé plus tôt ! À la place, on a conclu ceci : « Faites attention à ce que vous dites, ça peut se retourner contre vous ». Le général Sedgwick a pu le vérifier, comme d'autres après lui. Par exemple, personne ne se souvient de Thomas Watson, dirigeant de longue date d'IBM, comme d'un des grands entrepreneurs de l'histoire américaine. Quand on pense à Watson, on pense plutôt à celui qui a dit un jour « Je pense qu'il existe un marché mondial pour environ cinq ordinateurs ».

Pour être honnête, il n'existe aucune preuve que Watson ait jamais fait cette déclaration. Peut-être d'ailleurs s'est-il contenté de reprendre les propos d'un autre à ce sujet ? Mais qui s'en soucie ? L'idée que le PDG d'IBM ait pu dire une chose pareille est trop belle pour que l'on s'embarrasse de la vérité, n'est-ce pas ?

En revanche, Watson a bel et bien dit « Si vous voulez réussir, doublez votre taux d'échec ». Voici un conseil que les scripteurs ont adopté sans réserve.

Au moins, la partie qui concerne le taux d'échec.

Il y a aussi cette citation : « Si vous écrivez des scripts VBScript, vous n'avez pas accès à .NET Framework ». Affirmer que le Microsoft® .NET Framework est inaccessible aux scripteurs n'est pas aussi mémorable que « Ils n'atteindraient pas un éléphant à cette distance » ou « Je pense qu'il existe un marché mondial pour environ cinq ordinateurs ». Mais il est tout aussi farfelu. Il est vrai que .NET Framework a d'abord été conçu en pensant aux développeurs C# et Visual Basic®, et il est vrai que VBScript ne peut pas instancier les classes .NET Framework natives. Mais cela ne veut dire que .NET Framework est inaccessible aux scripteurs, au moins pas entièrement.

Mais bon, on vous l'accorde : on ne peut nier que la majorité des classes .NET Framework restent hors des limites de VBScript. Toutefois, il existe un nombre raisonnablement important de classes .NET dotées de wrappers CCW (COM Callable Wrapper), ce qui signifie simplement que ces classes comprennent une interface COM qui les rend accessibles à un langage de script comme VBScript. Vous avez du mal à le croire ? Jetez donc un coup d'œil à la section HKEY_CLASSES_ROOT de votre registre, illustrée à la figure 1. Vous devriez y voir toutes sortes de classes commençant par System.

Figure 1 Classes système dans le Registre

Figure 1** Classes système dans le Registre **(Cliquer sur l'image pour l'agrandir)

La plupart de ces classes sont des classes .NET Framework, et la plupart peuvent être instanciées par VBScript.

On vous l'avait bien dit !

Bien sûr, comme tous ceux qui ont acheté un produit sur une chaîne de télé-achat vous le diront, ce n'est pas parce que vous pouvez faire quelque chose que vous devez le faire (il y a souvent une raison pour laquelle ces produits ne sont pas vendus dans le commerce). Bien sûr, vous pouvez créer une instance de la classe System.ContextMarshalException dans un script. En ce qui nous concerne, nous n'avons aucune idée de ce qui pourrait vous inciter à le faire ou de ce que vous pouvez en faire.

Mais cela n'est pas le cas de toutes les classes .NET Framework. Par exemple, l'un des grands croque-mitaines du monde des scripteurs est le fait qu'il n'existe aucun moyen de trier facilement une liste d'éléments. Pour mettre une liste dans l'ordre alphabétique, vous devez soit utiliser un jeu d'enregistrements déconnecté, soit créer une fonction de tri complexe, de votre cru, dans le style de la suivante (les petites natures sont priées d'ignorer le paragraphe ci-dessous) :

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

Ne vous inquiétez pas : c'est nous qui avons écrit le code et nous ne sommes pas sûrs de savoir ce qu'il fait, non plus.

Alors en quoi .NET Framework peut-il nous aider dans une situation comme celle-ci ? Pour répondre à cette question, intéressons-nous à ce petit script tout simple :

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

Comme vous le voyez, nous sommes en train de créer une instance de la classe .NET Framework System.Collections.ArrayList. Nous utilisons ensuite la méthode Add pour ajouter cinq éléments à la liste. Tout cela est bien joli, à cette exception près : nous avons ajouté ces éléments d'une manière un peu aléatoire (B, C, E, D, A), mais nous devons afficher les éléments dans l'ordre alphabétique (A, B, C, D, E). C'est le moment de pondre un petit code maison, non ?

Non. (Désolé d'être aussi catégorique, mais non, c'est non). En fait, nous n'avons pas à pondre le moindre code, il nous suffit d'appeler la méthode Sort de la liste de tableau :

DataList.Sort()

C'est tout. Avec une seule ligne de code, nous pouvons trier tous les éléments de notre liste.

Une preuve ? Vous êtes bien exigeants ! Pas de problème. Nous nous attendions à en avoir un ou deux coriaces dans le public. C'est pour cette raison que le script comprend une boucle For Each qui s'exécute en boucle sur tous les éléments de la liste, faisant écho à la valeur de chaque élément à l'écran :

For Each strItem in DataList
    Wscript.Echo strItem
Next

Une question pour vous à présent : qu'obtenons-nous en exécutant ce script ?

Bien vu !

A
B
C
D
E

Pas mal, hein ?

Hmmm, apparemment certains d'entre-vous ne sont pas entièrement convaincus. Vous vous dites que tout cela est très bien, mais que tout ce que vous vouliez, c'était renvoyer ces valeurs en écho dans l'ordre décroissant afin d'obtenir une liste de Z à A plutôt que de A à Z. Et si vous n'obtenez pas cela, et bien... . .

Aucun problème. Il suffisait de le demander :

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

Vous avez raison : cela ressemble beaucoup au script qu'on vous a montré, pas vrai ? Il contient toutefois un ajout important. Jetez donc un coup d'œil à la ligne de code que nous avons ajoutée, une ligne qui suit directement la méthode Sort :

DataList.Reverse()

Vous la voyez ? Après avoir trié la liste en ordre croissant, nous avons appelé la méthode Reverse qui, comme vous vous en doutez, inverse l'ordre de tous les éléments dans la liste de tableau. Et qu'obtenons-nous ? Un résultat comme celui-ci :

E
D
C
B
A

C'est fort, non ?

Mais attendez ! Ce n'est pas fini ! Avez-vous déjà essayé de supprimer un élément dans un tableau VBScript ? Allons, ne pleurez pas, on ne va pas vous demander de le faire. À la place, nous allons vous montrer comme il est facile de supprimer un élément de notre liste .NET Framework. Vous n'aimez pas la lettre D ? Débarrassez-vous-en. Voici un script qui crée une liste de tableau, la trie, puis supprime ensuite l'entrée de la lettre 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

Une fois encore, notez bien la petite ligne de code qui suit immédiatement la méthode Sort :

DataList.Remove("D")

Ici, nous avons utilisé la méthode Remove pour supprimer l'élément égal à D. Et voici ce que nous avons obtenu en exécutant le script :

A
B
C
E

Hasta la vista, D !

Et ne ratez pas le meilleur : il est possible de supprimer un élément sans avoir à redimensionner le tableau. Ça c'est sympa. Bien sûr, nous aurions également pu ajouter des éléments dans le tableau sans avoir à redimensionner quoi que ce soit. Et ne nous dites pas que ça ne vous facilitera pas la vie.

Croyez-le si vous voulez, nous n'en sommes qu'au début des possibilités de la liste de tableau .NET Framework (pour plus d'informations, consultez l'entrée liste de tableau dans le SDK .Net Framework).

La liste de tableau est-elle utile pour les scripteurs ? Disons cela comme ça : après avoir vu la liste de tableau .NET Framework à l'œuvre, nous ne voyons pas pourquoi vous voudriez utiliser le tableau VBScript intégré, en tous cas pas pour les simples listes d'éléments telles que celles que nous avons utilisées ici.

Force est de reconnaître que nous autres, scripteurs, n'avons pas exactement fait une étude exhaustive de .NET Framework afin de déterminer quelles classes pourraient être utiles aux scripteurs (ni les classes totalement inutiles, d'ailleurs). Nous y travaillons. D'ici-là, n'hésitez pas à piocher dans le SDK .Net Framework. Il semble que chaque fois que nous parcourons le SDK, nous y trouvons quelque chose de nouveau et d'intéressant pour les scripteurs.

Comme quoi ? Par exemple, générer des nombres aléatoires. Vous voulez générer un nombre aléatoire entre 1 et 100 à l'aide du générateur de nombre aléatoire VBScript ? Aucun problème. Il vous suffit d'utiliser un code comme celui-ci :

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

Vous avez retenu cette formule ? Ne vous inquiétez pas si ce n'est pas le cas. Il est beaucoup plus facile et intuitif d'utiliser la classe System.Random de .NET Framework :

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

Il est probable que vous vous en rendiez compte par vous-même. Quoi qu'il en soit, nous allons tout de même vous donner une petite explication, ne serait-ce que parce que TechNet Magazine considère que les chroniqueurs sont censés écrire quelque chose tous les mois. (Ne nous demandez pas pourquoi, c'est leur idée, pas la nôtre...).

Comme vous le voyez, nous créons une instance de la classe System.Random, puis appelons la méthode Next_2, en lui transmettant deux paramètres :

  • 1, le premier nombre de notre plage (comprise, si vous vous en souvenez, entre 1 et 100).
  • 100, le nombre le plus élevé de notre plage.

C'est tout ce que nous avons à faire.

Il nous reste un peu de temps pour une dernière question. Oui, vous avec la chemise verte. Qui disait que les scripteurs ne pouvaient pas accéder à .NET Framework ? Pour être tout à fait honnête, quand on a commencé, on... heu, l'oreillette me dit que nous n'avons plus le temps ! Au mois prochain !

De bons moments en perspective !

Février n'est plus très loin, vous voyez à quoi je fais allusion ? Non, pas la Saint-Valentin. Non, pas mon anniversaire. Mais quoi ? Mardi gras ? Mais non, plus février approche, plus on s'approche des Jeux de script d'hiver 2007, la compétition internationale de script la plus prestigieuse du monde (et probablement la seule !). Les Jeux de cette année promettent d'être plus grandioses et plus réussis que jamais. Pour la première fois, nous aurons quatre divisions :

  • Débutants VBScript
  • VBScript avancé
  • Débutants Windows PowerShell™
  • Windows PowerShell avancé

Consultez la page d'accueil des Jeux de script d'hiver 2007 pour en savoir plus.

Qu'est-ce que c'est ? Oh, merci. Et, euh, joyeux Mardi Gras à vous aussi.

Téléchargez Windows PowerShell dès aujourd'hui.

Windows PowerShell 1.0 est maintenant disponible au téléchargement. Il est même gratuit ! Comment pouvez-vous résister à cette offre ? Téléchargez le logiciel et commencez à l'utiliser dès aujourd'hui.

Les scripteurs Microsoft travaillent pour - enfin, sont employés par - Microsoft. Lorsqu'ils ne sont pas en train de jouer au base-ball, d'entraîner une équipe ou de regarder un match (ou de se livrer à de multiples autres activités), ils dirigent le Script Center TechNet. Vous pouvez le vérifier vous-même sur www.scriptingguys.com.

© 2008 Microsoft Corporation et CMP Media, LLC. Tous droits réservés. Toute reproduction, totale ou partielle, est interdite sans autorisation préalable.