Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. PowerShell Core et Windows PowerShell
  3. Manipulation des objets
Extrait - PowerShell Core et Windows PowerShell Les fondamentaux du langage (2e édition)
Extraits du livre
PowerShell Core et Windows PowerShell Les fondamentaux du langage (2e édition)
4 avis
Revenir à la page d'achat du livre

Manipulation des objets

Qu’est-ce que la notion d’objets ?

Sans entrer dans le détail de la programmation objet, nous allons dans cette partie vous expliquer avec nos mots certaines notions essentielles à connaître lorsque l’on a affaire à des objets... Pour commencer, définissons ce qu’est un objet.

Tout d’abord, il faut savoir qu’il n’existe pas UNE définition unique de ce qu’est un objet. Nous dirons simplement qu’il s’agit d’un concept informatique abstrait pour tenter de représenter des objets du monde réel. Vous allez comprendre…

Un objet possède des caractéristiques, appelées dans le jargon des « propriétés ». Il est également possible d’interagir avec un objet par l’intermédiaire de « méthodes ».

Prenons un exemple concret avec une moto, moto que nous affectionnons tout particulièrement.

Une moto possède, entre autres, les caractéristiques suivantes :

  • Modèle,

  • Cylindrée,

  • Puissance,

  • Couleur,

  • Poids,

  • Etc.

Si une moto était un objet informatique, nous viendrions d’énumérer les propriétés de l’objet.

Tout cela est bien beau, mais quelles sont les actions que nous pouvons réaliser avec notre moto ?

Eh bien parmi d’autres choses, nous pouvons :

  • Démarrer/arrêter...

Manipulation des objets

1. Les collections

Avant de commencer à manipuler des objets individuels, il est important de savoir que la plupart du temps nous devrons d’abord manipuler une collection d’objets (une collection représente plusieurs objets, il s’agit aussi d’un autre terme pour désigner un tableau).

En effet, lorsque l’on exécute une commande PowerShell, celle-ci retourne bien souvent plusieurs résultats. Prenons l’exemple suivant :


PS > $result = Get-ChildItem C:\Windows
 

Nous avons affecté le résultat de la commande Get-ChildItem (équivalent de dir sous CMD) à la variable $result. Cette dernière représente à présent une collection d’objets car le répertoire C:\Windows contient de nombreux répertoires et fichiers. Les objets contenus dans $result sont donc de différents types.

Pour nous en convaincre, en mode interactif, c’est-à-dire dans la console, appliquons la commande Get-Member à notre variable :


PS > $result | Get-Member  
  
   TypeName: System.IO.DirectoryInfo  
  
Name                      MemberType     Definition  
----                      ----------     ----------   
Mode                      CodeProperty   System.String Mode{get=Mode;} 
Create                    Method         void Create(), void Create... 
CreateObjRef              Method         System.Runtime.Remoting.Ob... 
CreateSubdirectory        Method         System.IO.DirectoryInfo Cr... 
Delete                    Method        ...

Formatage des objets pour l’affichage

Important : Les commandes de formatage ont été conçues pour afficher des objets dans la console PowerShell (ISE ou console classique). Il ne faut en aucun cas les utiliser dans un script ! Si vous commettez cette erreur, vous aurez des difficultés à comprendre pourquoi votre script ne fonctionne pas correctement. En effet, les commandes de formatage dénaturent les objets originels afin d’en faire des objets affichables dans la console. Il ne faut donc pas confondre les commandes de formatage avec la commande Select-Object.

Faire une partie sur le thème du formatage de l’affichage du résultat des commandes peut certainement vous surprendre, mais sachez qu’étant donné le caractère objet de PowerShell, cela est indispensable et vous allez comprendre pourquoi.

Si vous vous demandez également pourquoi la fenêtre de la console PowerShell est plus généreuse en termes de dimensions que celle de CMD, alors cette partie devrait répondre à votre interrogation…

Étant donné que PowerShell possède la faculté intrinsèque de manipuler des objets, tout ce qui s’affiche à l’écran lors de l’exécution d’une commande n’est en réalité qu’une sélection de quelques propriétés. En effet, un objet pouvant posséder jusqu’à plusieurs dizaines de propriétés, il aurait été compliqué de toutes les afficher à l’écran, et ce de manière intelligible. Ainsi, le choix de ces propriétés, que nous appellerons « propriétés par défaut », a été réalisé de façon arbitraire par les créateurs de PowerShell.

Il faut savoir que le nombre de propriétés à afficher dépend en partie de la taille de la fenêtre PowerShell. Ce nombre dépend aussi de ce qu’est prêt à voir l’utilisateur final, car si pour l’équivalent d’un simple dir vous avez en retour quinze propriétés pour chaque fichier, cela serait très vite pénible à lire et à interpréter.

Restons donc sur l’exemple...

Création d’objets personnalisés

Émettre des objets et non pas du texte brut est un savoir fondamental lorsque l’on programme avec PowerShell. PowerShell est résolument un shell orienté objet. Toute commande produit des objets en retour, il est donc logique que tous nos scripts et fonctions retournent également des objets. Outre le respect des bonnes pratiques, cela permettra aussi de nous faciliter grandement la vie. D’où l’importance du présent chapitre…

Dans cette partie, nous allons voir comment enrichir un objet existant en lui apportant de nouvelles propriétés ou méthodes. Nous verrons aussi comment créer un objet à partir de rien.

1. Transformation d’un objet existant

Bien que nous n’ayons pas encore abordé CIM / WMI, nous allons malgré tout nous servir de cette technologie dans les prochains exemples afin de produire quelque chose en phase avec la réalité du terrain. Par conséquent, nous vous recommandons de prendre connaissance du chapitre CIM / WMI si vous n’avez jamais entendu parler de ces termes.

Dans l’exemple à venir, nous récupérerons la version du système d’exploitation d’un ensemble de machines. Pour ce faire, nous effectuerons une requête WMI sur la classe Win32_OperatingSystem. Celle-ci retournera un objet contenant une multitude de propriétés, dont les noms ne sont pas toujours très parlants. Nous allons donc, à partir de l’objet retourné, émettre un objet dérivé avec de nouvelles propriétés.

Regardons tout d’abord ce que nous retourne la ligne de commandes suivante :


PS > Get-CimInstance -ClassName Win32_OperatingSystem | Format-List *   
 
Status                                    : OK 
Name                                      : Microsoft Windows Server 
2016 Standard|C:\Wi... 
FreePhysicalMemory                        : 394268 
FreeSpaceInPagingFiles                    : 724536 
FreeVirtualMemory...