Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez 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
  3. Objets personnalisés et types standards
Extrait - PowerShell Fonctionnalités avancées (2e édition)
Extraits du livre
PowerShell Fonctionnalités avancées (2e édition)
1 avis
Revenir à la page d'achat du livre

Objets personnalisés et types standards

Introduction

PowerShell est un langage de scripting orienté objet. Cela implique que les résultats de commandes et les affectations de variables sont des objets. À la différence des langages de scripting plus conventionnels, comme cmd ou bash sous Linux, où sont manipulées des chaînes de caractères. Ce cas de figure est également possible sous PowerShell.

En programmation, la notion d’objet est une transposition de la vie courante. On peut utiliser l’exemple de la voiture pour l’expliquer. Une voiture est un objet. Elle dispose de plusieurs membres, tout comme un objet PowerShell :

  • Propriétés : une propriété contient une information sur l’objet. Dans le cas d’une voiture : sa marque, son modèle, sa coupe, ou encore sa couleur. Une propriété peut également contenir un autre type d’objet enfant ayant ses propres membres. Soit semblable à son parent, soit totalement différent. Une voiture dispose de portières, elles ont, généralement, la même couleur que le reste de la voiture, mais une structure bien différente.

  • Méthodes : une méthode permet de réaliser une action sur l’objet. Pour la voiture, elle permet de la démarrer, ou encore de la faire avancer. Et pour les portières, de les ouvrir.

images/04EXT01.png

Nous abordons seulement deux...

Objets personnalisés

Ce qui est intéressant, c’est de créer ses propres objets, avec les membres qu’on décide de leur définir. De cette manière, il est possible de les incorporer dans les fonctions et de les utiliser à travers le pipeline. Cette possibilité offre une grande souplesse et liberté dans le code. C’est également une bonne pratique à avoir lors de la conception de scripts.

1. Création d’un objet personnalisé

Pour créer un objet personnalisé, il est possible d’utiliser le type [psobject] avec la commande New-Object :

PS > New-Object -TypeName psobject -Property @{ 
    Name = 'Nicolas BAUDIN' 
    Email = 'nicolas.baudin@frpsug.com' 
    Age = 25 
    PostalCode = 44000 
} 
 
Email                        Name             Age PostalCode 
-----                        ----             --- ---------- 
nicolas.baudin@frpsug.com    Nicolas BAUDIN    25      44000 

La première remarque que l’on peut faire est que l’ordre des propriétés n’est pas respecté. Pour que ce soit le cas, il est nécessaire d’utiliser une hashtable de type [ordered] :

PS > $Hash = [ordered]@{ 
    Name = 'Nicolas BAUDIN' 
    Email = 'nicolas.baudin@frpsug.com' 
    Age = 25 
    PostalCode = 44000 
} 
PS > New-Object -TypeName psobject -Property $Hash 
 
Name             Email                       Age PostalCode 
----             -----                       --- ---------- ...

Types standards

Jusqu’ici, il a été question d’ajouter des membres à des instances d’objets spécifiques, grâce à la commande Add-Member. Mais comment ajouter un membre sur un type d’objet ? Admettons que le membre que l’on veut ajouter est essentiel à la réalisation de tâches quotidiennes et que faire appel à Add-Member à chaque création d’un objet d’un type particulier devient relativement contraignant. Quelles sont les options ?

Beaucoup de solutions sont applicables dans ce cas de figure, mais seulement deux seront décrites dans la suite du chapitre. La première consiste à utiliser un fichier .types.ps1xml, couplé avec la cmdlet Update-TypeData. Le fichier .types.ps1xml est constitué d’un schéma XML spécifique à cette utilisation. Il est possible de prendre exemple sur le fichier .types.ps1xml présent dans le répertoire d’installation de PowerShell ($PSHOME). La seconde solution consiste à utiliser seulement la cmdlet Update-TypeData.

Attention : il n’est pas conseillé de modifier directement le fichier .types.ps1xml. Microsoft ayant signé numériquement ce fichier, une modification pourrait créer des dysfonctionnements dans l’utilisation de PowerShell.

1. Ajout de membre via un fichier .types.ps1xml

L’utilisation d’un fichier d’extension de types est intéressante dans un module. Pour cela, il suffit de placer le fichier dans un répertoire du module et d’indiquer le fichier dans le manifeste au champ TypeToProcess. Le fichier sera chargé lors de l’importation du module.

Avant d’aller plus loin, il est nécessaire de déterminer précisément ce qui doit être fait et sur quel type d’objet cela doit être fait.

Il est parfois compliqué au premier abord de récupérer les droits NTFS positionnés sur un fichier ou un dossier. Cela nécessite généralement de la recherche sur les différents membres des objets fichiers et dossiers. Ces objets disposent d’une méthode nommée GetAccessControl(). Elle permet de récupérer les différents droits d’accès d’un fichier ou d’un dossier....

Formatage

Après avoir vu comment agir sur les objets en PowerShell, un dernier élément est à connaître : leur affichage dans la console. Comme il a été décrit dans les précédents chapitres, les applets de commandes PowerShell renvoient des objets. Ces derniers sont présentés de différentes manières dans la console. Il y a une chose à savoir : ce n’est pas la commande qui définit le formatage de l’objet qu’elle renvoie. En effet, ce qui détermine le formatage de ses propriétés, sous forme de tableau ou de liste, c’est son type. C’est pour cette raison que deux commandes différentes renvoyant le même objet ont la même présentation d’affichage. Le choix des propriétés affichées a été fait par Microsoft. Ce procédé assure une certaine lisibilité sur la console, sans pour autant l’inonder. Même si un objet subit un formatage, l’ensemble des propriétés reste accessible. C’est avant tout une question esthétique.

Cela dit, PowerShell offre la possibilité de modifier les propriétés affichées par un objet, et ce, quel que soit son type : personnalisé ou standard. Mais avant d’entrer dans le vif du sujet, quelques informations sont à savoir. Le formatage se définit dans des fichiers de type .format.ps1xml. Tout comme les fichiers .types.ps1xml, ceux-ci ont leur propre schéma XML. Dans le cas où un type ne dispose pas de fichier de formatage, comme les objets personnalisés, le formatage se produit comme suit :

  • Affichage en tableau si l’objet possède quatre propriétés ou moins

  • Affichage en liste si l’objet possède plus de quatre propriétés

Une autre information importante est à savoir. Dans le cas d’une collection d’objets, si le premier objet contient un nombre limité de propriétés (par exemple, trois), mais que les objets qui suivent en possèdent plus, alors seules les propriétés identiques au premier objet s’affichent lors de l’utilisation de Format-Table.

Lorsqu’une commande est utilisée et qu’elle renvoie un résultat, ce dernier...