Aller au contenu principal

Les dictionnaires

Un dictionnaire, aussi appelé tableau associatif, est une structure de données qui se caractérise par une liste de correspondance entre une clé et une valeur, qui représentent des propriétés. La clé représente le nom de la propriété, et la valeur, son contenu. Contrairement aux tableaux, l'ordre des éléments n'a pas d'importance, justement parce qu'on peut y accéder librement en utilisant la clé.

Dans PowerShell, on travaille avec deux types de dictionnaires, des HashTable, et des PSCustomObject.

Tables de hachage (HashTable)

La table de hachage (HashTable) est la forme la plus rudimentaire d'un dictionnaire en PowerShell.

Voici un exemple de création d'un objet de type HashTable:

$minou = @{ 
Nom = "Garfield"
Espece = "Felis catus"
Passion = "Manger"
}

Chaque clé de cet objet est le nom d'une de ses propriétés. On peut donc accéder à une propriété avec la notation ".".

Windows PowerShell
PS C:\> $minou.Passion

Manger
astuce

Pour créer un objet hashtable en une seule ligne, utilisez le caractère ; entre les éléments.

$minou = @{ Nom = "Garfield" ; Espece = "Felis catus" ; Passion = "Manger" }

Dictionnaires triés

Généralement, on n'a pas besoin qu'un dictionnaire soit trié, car il sert à accéder à ses propriétés à la demande, et non de manière séquentielle. Mais si, pour une quelconque raison, vous souhaitiez tout de même préserver l'ordre des éléments du dictionnaire, pour pouvez déclarer l'attribut [ordered].

$minou = [ordered]@{ 
Nom = "Garfield"
Espece = "Felis catus"
Passion = "Manger"
}

Comportement du HashTable

Un HashTable n'a pas vraiment le même comportement qu'un objet PowerShell. Ce type d'objet est en fait une structure de données composée de clés et de valeurs, comme un dictionnaire.

L'exemple suivant montre un tableau de HashTable, le résultat que nous nous attendrions d'avoir lors de l'affichage et le résultat réel.

$minous = @(
@{
Nom = "Garfield"
Espece = "Felis catus"
Passion = "Manger"
},
@{
Nom = "Grumpy Cat"
Espece = "Felis catus"
Passion = "Faire la baboune"
}
)

Objets personnalisés (PSCustomObject)

Pour créer un objet disposant de propriétés propres mais se comportant de la même manière que les objets PowerShell, on utilise généralement le type PSCustomObject. Ce type représente littéralement un objet PowerShell personnalité, duquel nous définissons nous-même les propriétés. Ce type d'objet est conçu pour imiter un objet standard composé de propriétés et de méthodes, contrairement au HashTable qui n'est qu'un dictionnaire servant à associer des clés à des valeurs. C'est d'ailleurs ce type d'objet que produit la commande Select-Object -Property.

On crée un objet PSCustomObject de la même manière qu'un HashTable, à une différence près: on doit spécifier qu'il s'agit du type PSCustomObject.

$minou = [PSCustomObject]@{ 
Nom = "Garfield"
Espece = "Felis catus"
Passion = "Manger"
}

Collections de PSCustomObject

Contrairement aux HashTable, les PSCustomObject sont structurés pour faciliter leur manipulation en collection.

$minous = @(
[PSCustomObject]@{
Nom = "Garfield"
Espece = "Felis catus"
Passion = "Manger"
},
[PSCustomObject]@{
Nom = "Grumpy Cat"
Espece = "Felis catus"
Passion = "Faire la baboune"
}
)

Modifier une propriété

Pour modifier une propriété d'un objet PSCustomObject, on n'a qu'à lui affecter une nouvelle valeur.

$minou.Passion = "Manger de la lasagne"

Il faut toutefois que la propriété existe dans l'objet.

Ajouter des propriétés

Nous avons vu plus haut comment créer un objet PSCustomObject lorsqu'on connaît toutes les propriétés de l'objet, et comment affecter une nouvelle valeur à une propriété existante. Pour créer une nouvelle propriété dans l'objet, on peut utiliser la commande Add-Member et lui passer en entrée l'objet à modifier par le pipeline.

Pour une propriété simple, on n'a qu'à créer un nouveau membre de type "NoteProperty" et lui affecter un nom et une valeur.

$minou | Add-Member -MemberType NoteProperty -Name "Couleur" -Value "Roux"

Ajouter des méthodes

On peut aussi ajouter d'autres types de membres, dont des méthodes. Contrairement aux propriétés qui retournent un objet stocké statiquement, les méthodes permettent d'exécuter du code.

Le procédé est semblable à l'ajout de propriétés, à l'exception qu'on définit un membre de type ScriptMethod et qu'on lui spécifie un ScriptBlock.

$minou | Add-Member -MemberType ScriptMethod -Name "Miauler" -Value { Write-Host "Miaou" }

Splatting

Le splatting est une technique qui consiste à identifier les arguments à passer dans une commande à l'intérieur d'un objet.

Il suffit de définir un HashTable composé des arguments, dont la clé représente le nom de l'argument et la valeur, la valeur de l'argument. Dans le cas des arguments de type switch, on leur affecte la valeur $true. Puis, il suffit se passer cette variable à la commande, en utilisant la forme @Nomdelavariable.

$splat = @{
FilePath = "C:\Windows\Notepad.exe"
ArgumentList = "C:\minou\allo.txt"
WorkingDirectory = "C:\"
PassThru = $true
WindowStyle = "Maximized"
Wait = $true
Verb = "Runas"
}

Start-Process @splat