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
|