20/09/2024

Les opérateurs de comparaison

I. Présentation

Les opérateurs de comparaison sont au cœur de nombreux langages, et PowerShell n'échappe pas à cette règle. Ils permettent de comparer des valeurs, ce qui est essentiel et très fréquent dans les scripts, notamment au sein des structures conditionnelles. Dans ce chapitre, nous allons explorer les différents opérateurs de comparaison disponibles en PowerShell.

II. Opérateurs d'égalité

Parmi les nombreux opérateurs de comparaison, il y a les opérateurs dits d'égalité. Ceci va nous permettre de vérifier si une valeur est égale à une autre. En PowerShell, l'opérateur d'égalité est "-eq". D'ailleurs, pour information, c'est l'équivalent de l'opérateur "==" dans d'autres langages. À l'inverse, pour vérifier l'inégalité et vérifier si deux valeurs sont bien différentes, nous devons utiliser l'opérateur "-ne".

Lorsque nous comparons deux valeurs, le résultat est retourné sous la forme d'un booléen : vrai (true) ou (false).

Vous pouvez ouvrir une console et effectuer quelques tests, comme ceux présentés sur l'image suivante. D'ailleurs, ces exemples permettent de se rendre compte d'une chose : par défaut, PowerShell ne tient pas compte de la casse, c'est-à-dire qu'il ne fait pas la différence entre les minuscules et les majuscules. Pour lui, "PowerShell" est égal à "POWERSHELL", tout comme "PowerShell" est égal à "PowerShell", car il retourne "True".

PowerShell - Exemple opérateur égalité

Si nous souhaitons que le test de comparaison considère la casse, alors nous devons ajouter le caractère "c" après le tiret et avant le nom de l'opérateur. Ainsi, l'opérateur "-eq" devient "-ceq". Ceci est valable pour les autres opérateurs. Si nous effectuons des tests similaires avec cet opérateur, nous pouvons voir que les deux dernières comparaisons retournent bien "False" cette fois-ci.

Remarque : pour indiquer explicitement que le test de comparaison doit être insensible à la casse, vous devez indiquer le caractère "i", sur le même principe que le caractère "c". Ainsi, l'opérateur "-eq" devient "-ieq".

PowerShell - Comparer et tenir compte de la casse

Nous n'avons pas cette problématique sur la comparaison de chiffres et nombres, mais c'est un détail important pour les chaines de caractères.

III. Opérateurs de comparaison : supérieur ou inférieur

PowerShell fournit également des opérateurs pour vérifier si une valeur est supérieure ou inférieure à une autre :

OpérateurDescription
-gt
Greater than
Supérieur à...
-ge
Greater or equal
Supérieur ou égal à...
-lt
Less than
Inférieur à....
-le
Less or equel
Inférieur ou égal à...

Sachez que, là aussi, vous pouvez ajouter un "c" entre le tiret et le nom de l'opérateur pour tenir compte de la casse.

PowerShell - Opérateur supérieur ou inférieur

IV. Opérateurs de comparaison : ressemblance

Parmi les opérateurs de comparaison de PowerShell, il y a des opérateurs permettant de rechercher une correspondance plus ou moins proches entre deux valeurs. L'idée étant de rechercher la présence d'une chaîne de caractères dans une autre chaîne, sans que celle-ci soit exactement la même. Autrement dit, elle peut être présente sans représenter la chaîne complète.

OpérateurDescription
-likeCorrespond à...
-notlikeNe correspond pas à...

Là encore, le test retourne vrai ou faux en fonction du résultat. Voici quelques exemples :

PowerShell - Exemple opérateur Like

Nous pouvons voir que "PowerShell" correspond bien à "Power*" mais qu'il ne correspond pas à "ower*", ni à "ower", alors qu'il y a quand même une ressemblance. La puissance des opérateurs "-like" et "-notlike" se situe dans l'utilisation des caractères "*" (que l'on appelle wildcard) et "?".

  • Le caractère "*" peut être remplacé par n'importe quel caractère, que ce soit 1 ou plusieurs caractères
  • Le caractère "?" peut être remplacé par n'importe quel caractère, mais un seul caractère

Lorsque PowerShell nous indique que "PowerShell" ne correspond pas à "ower*", c'est donc normal. Pour lui, le premier caractère de la chaine doit être "o", et non "P". Si l'on souhaite qu'il considère le "P", nous devons ajouter un caractère de substitution ("*" ou "?").

Nous voyons bien la différence :

L'opérateur "-like" peut s'avérer très pratique dans une structure conditionnelle (if/else) ou dans un filtre avec Where-Object. Par exemple, si vous recherchez tous les fichiers présents dans le répertoire "D:\Documents" dont le nom contient le mot clé "Tutoriel", vous pouvez utiliser cette commande :

Get-ChildItem -Path "D:\Documents" | Where-Object { $_.Name -like "*Tutoriel*" }

L'opérateur "-NotLike" fonctionne sur le même principe, mais à l'inverse ("ne correspond pas").

Pour aller plus loin et créer des modèles de correspondances plus complexes, vous pouvez étudier ces deux opérateurs :

OpérateurDescription
-matchCorrespond à l'expression régulière...
-notmatchNe correspond pas à l'expression régulière...

Ces opérateurs acceptent des modèles de correspondance que l'on appelle "pattern" et qui correspondent à des expressions régulières (RegEx). Bien que ce soit très puissant, ce n'est pas une notion évidente à appréhender.

Si vous souhaitez approfondir cette notion par la suite, consultez cet article :

V. Opérateurs de comparaison : contient ou ne contient pas

Pour finir, nous allons évoquer 4 opérateurs de comparaison dont l'objectif va être de vérifier si une valeur est présente dans une collection, ou à l'inverse si la collection contient la valeur. Le terme collection faisant référence à un ensemble de valeurs. Tout est question de logique, en fait.

Voici les 4 opérateurs auxquels nous faisons référence :

OpérateurDescription
-containsLa collection contient la valeur
-notcontainsLa collection ne contient pas la valeur
-inLa valeur est présente dans la collection
-notinLa valeur n'est pas présente dans la collection

Nous allons effectuer quelques tests avec ces opérateurs pour que vous puissiez bien comprendre leur fonctionnement.

Tout d'abord, nous allons créer un tableau avec plusieurs valeurs :

$Langages = @("PowerShell","Python","Bash","MS-DOS")

Puis, nous cherchons à vérifier si la valeur "PowerShell" est présente dans le tableau stocké dans la variable $Langages. Nous pouvons utiliser "-contains" et "-in" pour cela.

$Langages -contains "PowerShell"

Puis, avec le second opérateur :

"PowerShell" -in $Langages

À chaque fois, nous obtenons le résultat "True" car c'est bien le cas : PowerShell est présent dans le tableau de valeurs. Néanmoins, soyez vigilant à l'endroit où vous placez vos valeurs pour ne pas avoir un résultat inattendu.

Le fait de traduire le test que nous cherchons à effectuer peut être utile. Par exemple :

$Langages -contains "PowerShell"

Ce qui donne : "Est-ce que $Langages contient PowerShell ?", ceci correspondant bien au test que nous souhaitons effectuer. Si l'on remplace "-contains" par "-in" sans inverser les variables, ceci donnerait : "Est-ce que $Langages est présent dans PowerShell ?" - Là, quelque chose ne va pas, c'est pour cette raison que les deux variables doivent être inversées.

Au lieu d'utiliser un tableau statique, nous pouvons obtenir cette collection à partir du résultat d'une commande. Par exemple, si nous stockons dans une variable la liste des utilisateurs locaux, nous pouvons ensuite rechercher la présence d'un utilisateur dans cette liste.

$Utilisateurs = (Get-LocalUser).Name
"Florian" -in $Utilisateurs
# ou
$Utilisateurs -contains "Florian"

VI. Conclusion

Vous avez désormais connaissance des différents opérateurs de comparaison disponibles avec PowerShell. Plusieurs cas d'usage nécessitent de les utiliser, notamment lors de l'écriture d'un filtre avec "Where-Object" ou dans une structure conditionnelle (if/else).


livre pour apprendre PowerShell
author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.