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...
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...
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....
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 ...
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...
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 -ArgumentList.
PS C:\Users\damien.vanrobaeys> $Version = New-Object -TypeName
System.Version -ArgumentList 1.0.0.1
PS C:\Users\damien.vanrobaeys> $Version
Major Minor Build Revision
----- ----- ----- --------
1 0 0 1
Création d’un objet de type chaîne de caractères...
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...
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...