La gestion des objets
Qu’est-ce qu’un objet ?
PowerShell est un langage dit orienté objet.
La notion d’objet ne se visualise pas réellement dans la console ou un script. Un objet correspond à un ensemble de données qui pourront être traitées par PowerShell. Tout ce qui sera traité dans PowerShell sera analysé comme un objet.
La création d’une variable, par exemple, aura pour effet de créer un objet de type chaîne de caractères. Créons une simple variable nommée $Variable avec une valeur vide.
PS C:\Users\damien.vanrobaeys> $variable = ""
Pour vérifier le type d’un objet, nous utiliserons la méthode GetType().
PS C:\Users\damien.vanrobaeys> $variable.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --
True True String System.Object
La valeur BaseType nous indique donc que le type est System.Object.
Nous reviendrons dessus dans la suite du chapitre.
La structure d’un objet se compose de différents éléments :
-
type d’objet,
-
méthodes,
-
propriétés,
-
évènements.
Pour comprendre ce qu’est un objet, prenons un exemple simple du quotidien, à savoir un écran d’ordinateur.
Un écran possède différentes caractéristiques :
-
dimensions,
-
résolution,
-
fabricant.
En PowerShell, ces caractéristiques sont nommées propriétés.
Sur cet écran nous pouvons effectuer différentes actions :
-
allumer,
-
éteindre,
-
mettre en veille.
En PowerShell, ces actions sont nommées méthodes.
Les propriétés serviront donc à communiquer des informations sur un objet, tandis que les méthodes...
Récupérer la structure d’un objet
1. Comment faire ?
En PowerShell, il est possible de lister facilement le contenu d’un objet afin d’en voir la structure de façon détaillée.
Le contenu d’un objet est également appelé membre ou member en anglais. Nous allons donc lister les cmdlets ayant le terme « member ».
PS C:\Users\damien.vanrobaeys> get-command -Name *-Member*
CommandType Name
----------- ----
Cmdlet Add-Member
Cmdlet Get-Member
Nous utiliserons la cmdlet Get-Member. Il est également possible d’utiliser l’alias de cette cmdlet : gm.
La cmdlet Add-Member sera étudiée dans la section Ajouter ou supprimer des propriétés de ce chapitre.
Réutilisons notre objet précédent, la variable $Variable, et utilisons la cmdlet Get-Member dessus.

La cmdlet Get-Member nous retourne tout d’abord une valeur TypeName permettant d’indiquer le type de l’objet, ici System.String. Nous remarquons également la méthode GetType mentionnée précédemment permettant d’obtenir uniquement le type sans le reste des informations.
La sortie est tronquée car celle-ci contient beaucoup de valeurs.
Pour les exemples suivants, nous allons utiliser la cmdlet Get-Service et voir sa structure à l’aide de la cmdlet Get-Member.
$service = get-service IntuneManagementExtension
Ci-dessous le résultat :

2. Les propriétés
Comme mentionné précédemment, une propriété permettra de donner des informations sur un objet.
Pour lister le contenu de notre objet lié au service, nous avons utilisé la commande Get-Member. Cela aura pour effet de lister les différents éléments....
Quelles cmdlets utiliser pour gérer les objets ?
Nous allons maintenant vérifier les cmdlets existantes pour gérer les objets. Nous allons utiliser la cmdlet Get-Command en triant sur le terme « object ».
PS C:\Users\damien.vanrobaeys> get-command *object*
Name
----
Compare-Object
Group-Object
Measure-Object
New-Object
Register-ObjectEvent
Select-Object
Sort-Object
Tee-Object
Utilisons la cmdlet Get-Help afin de comprendre ce que fait chacune d’elles.
Compare-Object
Ci-dessous le retour sur cette cmdlet :
PS C:\Users\damien.vanrobaeys> get-help Compare-Object
NAME
Compare-Object
SYNOPSIS
Compares two sets of objects.
Group-Object
Ci-dessous le retour sur cette cmdlet :
PS C:\Users\damien.vanrobaeys> get-help Group-Object
NAME
Group-Object
SYNOPSIS
Groups objects that contain the same value for specified properties.
Measure-Object
Ci-dessous le retour sur cette cmdlet :
PS C:\Users\damien.vanrobaeys> get-help Measure-Object
NAME
Measure-Object
SYNOPSIS
Calculates the numeric properties of objects, and the characters,
words, and lines in string objects, such as files of text.
New-Object
Ci-dessous le retour sur cette cmdlet :
PS C:\Users\damien.vanrobaeys> get-help New-Object
NAME
New-Object
SYNOPSIS
Creates an instance of a Microsoft .NET Framework or COM object.
Select-Object
Ci-dessous le retour sur cette cmdlet :
PS C:\Users\damien.vanrobaeys> get-help Select-Object
NAME
Select-Object
SYNOPSIS
Selects...
Filtrer les objets
1. Filtrer le contenu
Lorsque nous travaillons sur un objet contenant de nombreuses données, il est judicieux de pouvoir filtrer sur certains paramètres.
Listons par exemple l’ensemble des services à l’aide de la cmdlet Get-Service.
PS C:\Users\damien.vanrobaeys> get-service
Status Name DisplayName
------ ---- -----------
Stopped AarSvc_243193 Agent Activation Runtime_243193
Running AESMService Intel® SGX AESM
Stopped AJRouter AllJoyn Router Service
Stopped ALG Application Layer Gateway Service
Running AppIDSvc Application Identity
Running Appinfo Application Information
Stopped AppMgmt Application Management
Stopped AppReadiness App Readiness
Stopped AppVClient Microsoft App-V Client
Running AppXSvc AppX Deployment Service (AppXSVC)
Stopped AssignedAccessM... AssignedAccessManager Service
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows...
Trier des objets
Nous allons tout d’abord lister les services d’un poste à l’aide de la cmdlet Get-Service.
Le retour sera par défaut affiché dans un ordre aléatoire. Cela peut être compliqué pour rechercher un service par son nom.
La meilleure solution s’avère donc être de trier les services par ordre alphabétique ou anti-alphabétique sur la propriété DisplayName. Par défaut, l’utilisation de la cmdlet Sort-Object sans paramètre affichera le contenu dans l’ordre alphabétique.
Pour afficher dans l’ordre anti-alphabétique, il faudra ajouter le paramètre -Descending.
PS C:\Users\damien.vanrobaeys> get-service | Sort-Object -property
displayname
Status Name DisplayName
------ ---- -----------
Stopped AxInstSV ActiveX Installer (AxInstSV)
Stopped AarSvc_18f511 Agent Activation Runtime_18f511
Stopped AJRouter AllJoyn Router Service
Stopped AppReadiness App Readiness
Running AppIDSvc Application Identity
Running Appinfo Application Information
Stopped ALG Application Layer Gateway Service
Stopped AppMgmt Application...
Créer un objet
1. Création d’un objet .NET ou COM
Il existe différentes manières de créer des objets en PowerShell.
L’une d’elles permet de créer des objets .NET Framework ou COM, c’est-à-dire des types d’objets bien spécifiques et existant dans un environnement Windows.
Ces objets peuvent être très utiles au quotidien pour effectuer différentes tâches d’administration système.
a. Objets .NET
PowerShell repose majoritairement sur des objets .NET, toutes les entrées et sorties étant des objets .NET.
Le framework .NET peut être défini comme le cœur de PowerShell. Ce framework est installé par Windows généralement sous la forme d’une mise à jour Windows dite mise à jour de qualité.
La dernière version au moment de l’écriture du livre est la version 4.8.
Création d’un objet version d’un produit
Nous allons tout d’abord créer un objet simple permettant de spécifier la version d’un produit affecté dans une variable $Version.
Pour créer un objet .NET, nous utiliserons tout d’abord la cmdlet New-Object suivie du paramètre -TypeName. Dans ce paramètre, nous spécifierons le type d’objet à créer. Pour une version, le type d’objet sera System.Version. Cela donnera le résultat suivant :
PS C:\Users\damien.vanrobaeys> $Version = New-Object -TypeName
System.Version
PS C:\Users\damien.vanrobaeys> $version
Major Minor Build Revision
----- ----- ----- --------
0 0 -1 -1
Pour spécifier la version, nous ajouterons le paramètre...
Ajouter ou supprimer des propriétés
Nous avons précédemment créé un objet $MonObjet. Nous allons maintenant essayer de modifier et supprimer des propriétés.
1. Contenu de notre objet
Nous allons, dans un premier temps, lister le contenu de notre objet à l’aide de la cmdlet Get-Member.
PS C:\Users\Jerome> $MonObjet | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Auteur_1 NoteProperty string Auteur_1=Damien
Auteur_2 NoteProperty string Auteur_2=Jerome
Collection NoteProperty string Collection=Ressources informatiques
Editeur NoteProperty string Editeur=Edition ENI
Theme NoteProperty string Theme=PowerShell
2. Ajouter une propriété dans un objet
La cmdlet Get-Member ne retourne pas de méthodes pour ajouter ou supprimer une propriété d’un objet.
Comme évoqué dans la section Récupérer la structure d’un objet, nous avons une autre cmdlet nommée Add-Member. Celle-ci nous permettra d’ajouter du contenu dans un objet.
En utilisant l’objet personnalisé un PSObject créé précédemment...
Comparer des objets
Il peut être très utile de comparer deux objets entre eux afin d’afficher les différences entre ceux-ci. Pour ce faire, la cmdlet à utiliser sera Compare-Object dont la syntaxe sera la suivante :
Compare-Object -ReferenceObject <Objet1> -DifferenceObject
<Objet2>
Les paramètres -ReferenceObject et -DifferenceObject sont optionnels.
Prenons deux objets personnalisés que nous allons comparer.
Notre premier objet sera celui que nous avons créé précédemment avec la cmdlet New-Object.
# Infos de l'objet
$MonLivre = @{
Editeur = 'Editions ENI'
Collection = 'Ressources informatiques'
Theme = 'PowerShell'
Titre = 'Débuter avec PowerShell'
Auteur_1 = 'Damien'
Auteur_2 = 'Jerome'
}
# Création de l'objet PowerShell
$MonObjet = New-Object -TypeName PsObject -Property $MonLivre
Nous allons ensuite créer un second objet.
# Infos de l'objet
$MonLivre2 = @{
Editeur = 'Editions ENI'
Collection = 'Epsilon'
Theme = 'PowerShell et WPF'
Auteur_1 =...