WMI

ou

 

Comment comprendre (vraiment) la programmation orientée objets quand on ne connaît pas la programmation orientée objets

 

 

 

 

 

Exemple

 

oop_demo.vbs

 

set objFSO = CreateObject("Scripting.FileSystemObject")
set objFile = objFSO.OpenTextFile("toto.txt", 2, true)
objFile.WriteLine "Coucou"
objFile.Close

set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
set objLogicalDisk = objWMIService.Get("Win32_LogicalDisk.DeviceID='C:'")
FreeBytes = objLogicalDisk.FreeSpace
Wscript.Echo "Free space left on C: is: " & FreeBytes

 

Résultat :

 

c:\vbs>oop_demo
Free space left on C: is: 120876920832

c:\vbs>type toto.txt
Coucou

c:\vbs>

 

 

Explication

 

Choisissez votre meilleur fauteuil, servez-vous un verre de <insérer ici votre boisson relaxante non alcoolisée favorite>, débranchez le téléphone, éteignez votre mobile et faites sortir le chat, nous allons essayer de vous expliquer la programmation orientée objets en une page (si).

 

La programmation orientée objets (plus couramment appelée programmation objets) est un truc d'informaticiens pour informaticiens. Si vous ne connaissez pas la programmation objets (en abrégé OOP, Object Oriented Programming), vous pouvez continuer à vivre comme avant, mais sans VBScript. Donc, si vous voulez vraiment apprendre ou comprendre VBScript, lisez les lignes qui suivent.

 

 

La programmation objets consiste à écrire des programmes (ou des scripts) qui manipulent des objets.

 

Un objet est une entité informatique - comme un disque -, dotée de caractéristiques spécifiques - comme l'espace disponible sur ce disque -, et sur laquelle le programmeur peut agir - comme formater ce disque - (en OOP, en fait, on demande virtuellement au disque de se formater lui-même grâce à sa capacité de formatage).

 

Un ensemble d'objets qui concernent tous un même domaine s'appelle une classe.

 

Les caractéristiques d'un objet s'appellent des propriétés ou attributs.

 

La communication d'un programme vers un objet se fait par l'envoi de messages.

 

L'envoi de messages à un objet déclenche une réaction de l'objet. Cette réaction s'appelle une méthode.

 

Dans une même classe, tous les objets ont x propriétés et y méthodes.

 

Pour accéder aux propriétés et aux méthodes d'un objet dans un programme (ou un script), il faut "connecter" cet objet au programme (ou au script). Cette connexion s'appelle une instanciation. Le fait qu'un objet soit "connecté" à un programme (ou à un script) s'appelle une instance.

 

Une fois que l'objet est "connecté" (instancié) on peut lui envoyer des messages pour interroger ses propriétés ou lui demander d'effectuer une action selon la méthode correspondant au message reçu.

 

[buvez]

 

Considérons l'exemple ci dessous qui, fort judicieusement, reflète tout ce qui vient d'être dit.

 

Pour accéder à un fichier, il faut créer un objet qui relève d'une classe qui s'appelle le système de fichiers de Windows, ou File System. Le File System est accessible depuis un script ou depuis un programme. Si l'on veut accéder au File System de Windows depuis un script, la classe s'appelle Scripting.FileSystemObject.

 

Pour créer un objet dans un script, on utilise la syntaxe

 

set variable = CreateObject(classe)

 

Donc, ici, pour créer l'objet File System (en abrégé FSO, File System Object), on écrira :

 

set objFSO = CreateObject("Scripting.FileSystemObject")

 

Remarque : Vous trouverez souvent la syntaxe

 

set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

 

mais vu que nous sommes dans un script qui sera exécuté par le moteur de scripts de VBScript, cette syntaxe n'est pas obligatoire (WScript vient de Windows Script Host, le nom technique du moteur de scripts de VBScript).

 

Maintenant, nous avons créé un objet de type fichier. Nous sommes contents. Nous allons ensuite créer une instance pour un fichier particulier, celui qui nous intéresse.

 

Pour créer une instance, on utilise la syntaxe :

 

set variable = objet.méthode(paramètres)

 

En effet, on ne peut créer une instance d'un objet fichier sans lui demander de nous répondre un minimum par une méthode, telle que dire s'il existe, lui demander de s'ouvrir, etc.

 

Nous voulons envoyer à l'objet FSO un message de demande d'ouverture d'un fichier nommé TOTO.TXT, en mode écriture (paramètre "2"), et avec une option de création de ce fichier s'il n'existe pas (paramètre "true"). On écrira :

 

set objFile = objFSO.OpenTextFile("TOTO.TXT", 2, true)

 

Remarque : En réalité on a en même temps créé une instance de l'objet fichier TOTO.TXT et on lui a envoyé un message de demande d'ouverture auquel il a répondu par la méthode OpenTextFile.

 

La variable objFile a maintenant reçu toutes les méthodes et les propriétés de l'objet fichier TOTO.TXT.

 

Parmi ces méthodes, il y en a une qui permet d'écrire une ligne (suivie de Cr + Lf) dans ce fichier. C'est la méthode WriteLine. Donc, pour écrire dans le fichier TOTO.TXT un texte, comme par exemple "Coucou", on va envoyer à l'objet objFile un message de demande d'exécution de sa méthode d'écriture avec le paramètre "Coucou".

 

Pour envoyer un message à un objet, correspondant à la méthode dont on a besoin, on utilise la syntaxe :

 

objet.méthode(paramètres)

 

Donc on écrira :

 

objFile.WriteLine("Coucou")

 

Pas plus simple.

Et comme après on a fini, on va demander au fichier d'exécuter sa méthode de fermeture, Close :

 

objFile.Close

 

[buvez]

 

La seconde partie de l'exemple présenté au début de cette page traite non plus de méthodes, mais de propriétés.

 

Pour accéder aux périphériques d'un ordinateur tournant Windows, on peut utiliser l'environnement de gestion Windows Management Instrumentation, WMI. Cet environnement de gestion est orienté objet (ça tombe bien) et contient toutes les composantes software et hardware de Windows à quelques exceptions près, dont les fichiers, qui relèvent du File System vu précédemment.

 

WMI est un objet un peu particulier qui est préexistant. Son instance "se crée" toute seule au démarrage de Windows, et si elle est supprimée manuellement, le premier appel à WMI la recrée automatiquement. Elle est pas belle, la vie ?

 

Donc, pas besoin de CreateObject pour WMI, on peut tout de suite entrer dans le vif du sujet. De l'objet, pardon.

 

Que fait l'exemple dont nous parlions ? Il affiche l'espace disponible sur un disque. Bon. On a compris ici que le disque était un objet, qu'il avait des méthodes et des propriétés, on va donc l'instancier, lui envoyer un message pour lui demander combien d'espace disponible il a, on affiche la réponse et basta.

 

La connexion à WMI à partir d'un script est un peu complexe, on verra ça plus tard. Disons pour l'instant qu'elle se fait sur notre PC (point important) avec la ligne suivante :

 

set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")

 

On va maintenant dire à l'objet WMI de bien vouloir nous connecter à un disque qui s'appelle C:. C'est le nom logique d'un disque, on choisira donc judicieusement le nom de objLogicalDisk pour la variable désignant cet objet.

 

La méthode d'instanciation de WMI pour un disque est la méthode Get.

 

Pour dire à WMI que nous parlons du disque C: nous préciserons ce détail dans un paramètre DeviceID, qui est une propriété de l'objet objLogicalDisk.

 

Notre ligne de script s'écrira donc tout naturellement (ou presque) :

 

set objLogicalDisk = objWMIService.Get("Win32_LogicalDisk.DeviceID='C:'")

 

Notre objet disque logique C: est maintenant instancié, nous avons accès à ses méthodes et à ses propriétés. Sa propriété "espace disque disponible" s'appelle FreeSpace (c'est de l'anglais). Très bien, demandons à notre objet disque de bien vouloir nous faire part aimablement de la valeur de sa propriété FreeSpace :

 

FreeBytes = objLogicalDisk.FreeSpace

 

Il ne reste qu'à afficher la valeur de la variable FreeBytes. Ceci concerne notre écran, ou plutôt son affichage. Le moteur de VBScript, on l'a vu, s'appelle Windows Script Host et son exécutable est Wscript.exe. Joie, c'est aussi un objet ! Il a une méthode très pratique pour afficher quelque chose sur un écran, c'est sa méthode Echo. Nous écrirons donc :

 

Wscript.Echo "Free space left on C: is: " & FreeBytes

 

Vous avez compris la programmation orientée objets.

 

Tout savoir sur toutes les classes de WMI, tous les objets, toutes leurs méthodes et propriétés ? Facile. Télécharger l'outil WMI Code Creator et vous en saurez autant que l'auteur...

 

 

 

accueil | console | VBScript | PowerShell | documentation | formation  | trucs et astuces | exemples | glossaire