5-Les Tableaux
5-Les Tableaux
5-Les Tableaux
La manipulation des tableaux en PowerShell est une notion essentielle à maîtriser. Outre le fait que leur utilisation
soit aisée, il faut savoir que dès lors que le résultat d’une commande retourne plusieurs objets, PowerShell renvoie
un tableau d’objets. Nous allons voir dans ce chapitre qu’il existe différents types de tableaux et que ces derniers
sont capables de contenir des éléments de types distincts si nécessaire.
Tableaux à une dimension
Le tableau à une dimension est le cas le plus simple, les valeurs sont mises les unes après les autres, et il suffit
d’indiquer un numéro d’indice (ou index) pour accéder au contenu. Un tableau à une dimension est parfois appelé liste
ou collection.
Par exemple ici :
La valeur 18 est contenue dans le tableau à l’indice 0.
La valeur 22 est contenue dans le tableau à l’indice 1.
Les indices de tableau commencent à 0 et non pas à 1 comme avec d’autres langages.
1. Initialiser un tableau vide
Il y a mille et une façon de procéder pour déclarer un tableau, mais dans sa plus simple expression, la déclaration
d’un tableau vide peut se faire de la manière suivante :
$monTableau = @()
La variable $monTableau est à présent un tableau vide non typé. C’estàdire que celuici pourra contenir tout
type d’objet.
Contraindre le type d’un tableau
Il est possible de contraindre le type de données que pourra contenir un tableau. Pour ce faire, il suffit de spécifier
le type entre crochets devant le nom du tableau lors de sa définition.
Par exemple :
[Int[]]$monTableau1 = @()
[String[]]$monTableau2 = @()
[Double[]]$monTableau3 = @()
Attention de ne pas oublier de mettre une paire de crochets vides après le type, comme Int[]. Si vous ne le faites
pas, PowerShell émettra une erreur indiquant qu’il ne peut convertir un tableau en une valeur entière. En effet un
type [Int] simple (sans la paire de crochets vide en suffixe) indique un objet de type entier et non un tableau
d’entiers.
Bonne pratique !
Une bonne pratique lorsque l’on connaît à l’avance (ce qui est généralement le cas) le type des données que doit contenir
un tableau est de systématiquement contraindre les tableaux, mais aussi les variables. De cette manière, une erreur
sera vite détectée, nous évitant ainsi de longues séances de débogage.
Exemple : Tentative d’affectation d’une valeur non admise par un tableau contraint
L’erreur s’est produite car le tableau $monTableau1 ne peut accueillir que des valeurs entières. Cependant, nous ne
nous serions pas aperçus de notre erreur si nous n’avions pas typé la variable.
2. Initialiser un tableau avec des valeurs
Il est possible de déclarer un tableau et de l’initialiser en même temps. Pour ce faire, il suffit de lui affecter plusieurs
valeurs séparées par une virgule, la virgule étant le séparateur de valeurs lorsque l’on a affaire à un tableau.
Exemple : Initialisation d’un tableau avec des valeurs
ou :
Notez que nous avons ici utilisé deux formes distinctes pour affecter des valeurs à un tableau. Sachez qu’elles sont
toutes les deux parfaitement admises et reviennent au même, la première forme étant simplement plus explicite que
la seconde.
$tab définit un tableau de type entier contenant la valeur 1 à l’indice 0, puis la valeur 5 à l’indice 1, puis 9 à l’indice
2, etc.
À noter que, pour un tableau non contraint, le type des valeurs contenues dans le tableau est attribué de façon
automatique. Cependant, de la même manière que pour initialiser un tableau vide, nous pouvons contraindre le type
des données que peut contenir un tableau.
Exemple
Vous noterez les crochets [] immédiatement après le nom du type. Ces crochets indiquent qu’il s’agit d’un tableau
de valeurs du type en question. Dans cet exemple, le tableau $tab ne peut contenir que des entiers.
Un tableau peut aussi s’initialiser avec l’opérateur de plage, exemple : $tab = 1..20 est un tableau d’entiers qui
contient toutes les valeurs allant de 1 à 20.
Un tableau peut cependant être hétérogène, et dans ce cas, l’affectation des types se fait valeur par valeur.
Exemple
3. Lire un tableau à une dimension
Pour lire un tableau à une dimension, plusieurs méthodes sont possibles.
La plus simple est de saisir son nom dans la console puis de presser la touche [Entrée]. Dans ce cas, tous les
éléments du tableau seront retournés. Pour lire une valeur à un indice précis, il suffit d’indiquer entre crochets
l’indice voulu.
PS > $tab[0]
1
Pour lire plusieurs valeurs à des indices précis, il suffit, cette foisci, d’indiquer entre crochets les indices séparés par
des virgules.
PS > $tab[0,2]
1
3
Ici, seules les valeurs à l’indice 0 et 2 sont obtenues, la valeur à l’indice 1 ne l’est pas.
Vous pouvez aussi afficher plusieurs valeurs avec l’opérateur de plage. Exemple : $tab[0..20]
affichera les valeurs de l’indice 0 à 20.
Maintenant, supposons que nous souhaitions uniquement lire la valeur contenue au dernier indice. Une des
méthodes consiste à savoir combien de valeurs sont contenues dans notre tableau. Ceci se fait grâce à la propriété
Length :
PS > $tab[$tab.Length-1]
3
Notez que nous enlevons une unité à la propriété Length parce que les indices commencent à 0 et non à 1.
Mais il y a une autre méthode plus simple : les indices négatifs.
Lorsque vous utilisez un indice négatif, vous faites référence au nombre d’indices depuis la fin du tableau.
Exemple
PS > $tab[-1]
3
PS > $tab[-3..-1]
1
2
3
La méthode la plus courante pour lire un tableau reste toutefois le parcours de tableaux avec des boucles Foreach
et For. Pour en savoir plus, reportezvous au chapitre Boucles et conditions.
4. Concaténer deux tableaux
Avec PowerShell, la concaténation de tableaux se fait avec l’opérateur +. Supposons que pour un motif quelconque
nous ayons besoin de concaténer deux tableaux (ou plus). Pour cela, il suffit d’additionner les tableaux avec
l’opérateur +.
Exemple d’addition de deux tableaux de caractères nommés $chaine1 et $chaine2 :
5. Ajouter un élément à un tableau
L’ajout d’une valeur à un tableau se fait avec l’opérateur +=. Ainsi en tapant la ligne suivante, nous ajoutons la
valeur 4 à notre tableau :
La modification d’un élément dans un tableau revient en fait à faire une affectation avec l’opérateur =.
Exemple, en tapant $tab[2]=1 nous modifions la valeur contenue à l’indice 2 (la troisième valeur, donc). En
réalité, c’est une nouvelle affectation qui est réalisée, et celleci écrasera l’ancienne valeur par la nouvelle.
Exemple
7. Supprimer un élément
À moins d’utiliser un tableau de type ArrayList (non traité dans ce livre car il s’agit d’un type peu utilisé par les
scripteurs mais plus par les développeurs), il n’est pas possible de supprimer un élément d’un tableau. Cependant, il
existe une solution alternative, permettant de contourner le problème. Celleci consiste à effectuer une recopie d’un
tableau en y excluant un ou plusieurs indices.
Exemple
Suppression d’éléments dans un tableau
Prenons l’exemple de vos dernières notes à l’examen de fin d’étude.
N’ayant pas brillé en algorithmique et programmation (8) vous décidez de supprimer cette note qui ne vous satisfait
pas du tout.
Pour cela, procédons tout simplement à la recopie des éléments du tableau à l’exception de la valeur à l’indice 4 :
Si l’on ne connaît pas les indices, ou si le nombre de notes à supprimer est trop important, on peut aussi procéder à
l’application d’un filtre pour obtenir une recopie du tableau avec uniquement les valeurs supérieures ou égales à 10.
8. Déterminer le nombre d’éléments d’un tableau
Pour déterminer la taille d’un tableau il suffit d’utiliser la propriété Length ou la propriété Count, cette dernière
étant un alias de la propriété Length.
Exemple : calcul de la taille d’un tableau
9. Convertir en chaîne le contenu d’un tableau
Il y a des fois où nous souhaitons récupérer le contenu d’un tableau sous forme d’une chaîne de caractères.
Soit le tableau suivant :
Pour convertir son contenu en une chaîne unique, il suffit d’effectuer un transtypage grâce au type [String],
comme ciaprès :
PS > [String]$tab
A 24 12 C XX 65
Il faut savoir que, par défaut, PowerShell utilise l’espace comme séparateur. Pour changer ce comportement, il faut
jouer sur le contenu de la variable de préférence $OFS.
Ainsi, observons l’effet de l’affectation de la valeur +--+ à la variable $OFS :
A+--+24+--+12+--+C+--+XX+--+65
Tableaux à plusieurs dimensions
Lorsque l’on parle de tableaux à plusieurs dimensions, on parle de tableaux à plusieurs index, avec autant d’index
que de dimensions. Ainsi, pour passer d’un tableau à une dimension à un tableau à deux dimensions, il suffit d’ajouter
un indice permettant de se repérer dans cette nouvelle dimension.
La lecture des tableaux à plusieurs dimensions est semblable à ceux à une dimension. La seule contrainte est de
jouer avec les indices. Prenons le cas du tableau cidessus.
La lecture du tableau avec l’indice 0 nous retournera le premier élément du tableau (ici un autre tableau) :
PS > $tab[0]
1
2
3
Pour obtenir une valeur précise, nous devons tout simplement fixer l’indice de la dimension horizontale et celui de la
dimension verticale.
PS > $tab[0][2]
3
Un tableau à plusieurs dimensions est la plupart du temps un tableau de tableaux. Autrement dit, il s’agit d’un
tableau contenant d’autres tableaux. C’est ce que nous allons voir dans l’exemple ciaprès.
Soit la définition du tableau suivant :
PS > $taboo[2].Gettype()
Observons à présent le contenu de notre tableau.
PS > $taboo
10
11
12
13
Bonjour
Au revoir
1,2
0,3
2,33
Observons maintenant le nombre d’éléments contenus dans $taboo. D’après vous, combien devrionsnous en
trouver ?
PS > $taboo.length
3
Eh oui trois ! En effet, nous avons bien trois tableaux dans $taboo.
Récupérons à présent le second tableau :
PS > $taboo[1]
Bonjour
Au revoir
À présent récupérons le second élément du second tableau :
PS > $taboo[1][1]
Au revoir
Enfin, une chaîne de caractères étant en réalité un tableau de caractères (type [char]), nous pouvons également
indexer le contenu de la chaîne en allant rechercher n’importe quel caractère en spécifiant son index.
Dans l’exemple ciaprès, nous irons chercher le premier caractère :
PS > $taboo[1][1][0]
A
Mais nous pourrions aussi récupérer les cinq premiers :
PS > $taboo[1][1][0..4]
A
u
r
e
Tableaux associatifs
1. Tableaux associatifs standards
Un tableau associatif, aussi appelé table de hachage, est un tableau dans lequel chaque valeur n’est pas
référencée par un indice mais par une clé. Jusquelà, nous avons vu que dans un tableau, chaque valeur était
indexée numériquement. Eh bien dans un tableau associatif, cette notion d’indexation numérique n’existe plus, on
utilise des clés en tant qu’identifiants. Par exemple, voici un tableau associatif dans lequel chaque élément (clé)
possède une valeur, la valeur étant ici un prix.
Clé Valeur
Video_projecteur 1600
Television 1400
Console_de_jeux 400
Avec les tableaux associatifs, tout comme les tableaux classiques, vous pouvez utiliser des types de données
hétérogènes.
a. Déclarer un tableau associatif vide
La déclaration d’un tableau associatif vide s’effectue ainsi :
$hashtable = @{}
b. Initialiser un tableau associatif avec des données
Pour initialiser un tableau associatif contenant des valeurs, la syntaxe suivante est de rigueur :
Notez que la création d’un tableau associatif nécessite de placer le symbole arobase @ devant l’accolade ouvrante
{, de séparer tous les couples clé/valeur par des pointsvirgules et de refermer l’ensemble par l’accolade
fermante }.
Reprenons notre exemple avec les produits décrits précédemment. Voici à quoi ressemble l’initialisation du
tableau :
Pour ensuite lire les valeurs contenues dans le tableau, nous pouvons soit taper simplement le nom du tableau
dans la console :
PS > $catalogue
Name Value
---- -----
Console_de_jeux 400
Televison 1400
Video_projecteur 1600
Soit récupérer les éléments un par un, dans ce cas il nous faut utiliser la notation par point ou crochets :
PS > $catalogue[’Console_de_jeux’]
400
PS > $catalogue.Television
1400
PS > $catalogue.’Television’
1400
Si la clé contient des espaces, il est nécessaire de la mettre entre guillemets. Cela dit, il n’est pas conseillé de créer
des clés avec des caractères spéciaux tels que les accents et les espaces.
c. Ajout de données à un tableau associatif
Comme avec un tableau classique, l’ajout de données à un tableau associatif s’effectue avec l’opérateur +=.
Exemple
Vérifions à présent le contenu du tableau :
PS > $catalogue
Name Value
---- -----
Amplificateur 800
Television 1400
Video_projecteur 1600
Console_de_jeux 400
Il faut savoir que, par défaut, le framework .NET ne conserve pas l’ordre d’entrée des couples clé/valeurs dans un
tableau associatif. PowerShell étant basé sur .NET, il n’échappe pas à la règle…
d. Parcours d’un tableau associatif
Le parcours d’une table de hachage s’effectue différemment qu’avec un tableau classique. En effet, il faut
connaître le nom d’une clé afin d’en obtenir sa valeur. Pour parcourir un tableau associatif dans son intégralité, la
première chose à faire est de récupérer toutes les clés (leur nom), puis pour chacune demander sa valeur.
Récupérer le nom des clés
Un tableau associatif possède la propriété keys. Cette dernière contient le nom de toutes les clés de la table.
Exemple
PS > $catalogue.keys
Amplificateur
Television
Video_projecteur
Console_de_jeux
Récupérer les valeurs
À présent, il nous suffit d’effectuer une boucle, par exemple avec la commande Foreach-Object, et le tour est
joué :
800
1400
1600
400
Mais nous pouvons faire encore plus simple en utilisant la propriété values, comme cidessous :
PS > $catalogue.values
2. Tableaux associatifs ordonnés
Depuis la version 3, il est possible de forcer PowerShell à préserver l’ordre dans lequel les couples clé/valeur ont été
renseignés. Pour ce faire, il suffit de préfixer le tableau par le type [ordered].
Exemple
PS > $catalogue
Name Value
---- -----
Video_projecteur 1600
Television 1400
Console_de_jeux 400